web-dev-qa-db-fra.com

Comment paramétrer @Scheduled (fixedDelay) avec le langage d'expression Spring 3.0?

Lorsque j'utilise la fonctionnalité Spring 3.0 pour annoter une tâche planifiée, j'aimerais définir le paramètre fixedDelay de mon fichier de configuration, au lieu de le câbler dans ma classe de tâche, comme actuellement ...

@Scheduled(fixedDelay = 5000)
public void readLog() {
        ...
}

Malheureusement, il semble qu'avec les moyens du langage d’expression du printemps (SpEL) @Value _ renvoie un objet String qui, à son tour, ne peut pas être automatiquement mis en boîte avec une valeur longue comme requis par le paramètre fixedDelay.

111
ngeek

Je suppose que le @Scheduled annotation est hors de question. Alors peut-être une solution pour vous serait d'utiliser task-scheduled Configuration XML. Considérons cet exemple (copié à partir de doc Spring ):

<task:scheduled-tasks scheduler="myScheduler">
    <task:scheduled ref="someObject" method="readLog" 
               fixed-rate="#{YourConfigurationBean.stringValue}"/>
</task:scheduled-tasks>

... ou si le casting de String to Long ne fonctionne pas, quelque chose comme ceci:

<task:scheduled-tasks scheduler="myScheduler">
    <task:scheduled ref="someObject" method="readLog"
            fixed-rate="#{T(Java.lang.Long).valueOf(YourConfigurationBean.stringValue)}"/>
</task:scheduled-tasks>

Encore une fois, je n’ai essayé aucune de ces configurations, mais j’espère que cela vous aidera un peu.

26
Grzegorz Oledzki

Spring v3.2.2 a ajouté des paramètres String aux 3 paramètres long d'origine pour gérer cela. fixedDelayString, fixedRateString et initialDelayString sont également disponibles.

@Scheduled(fixedDelayString = "${my.fixed.delay.prop}")
public void readLog() {
        ...
}
392
Mark-A

Vous pouvez utiliser le @Scheduled annotation, mais avec le paramètre cron uniquement:

@Scheduled(cron = "${yourConfiguration.cronExpression}")

Votre intervalle de 5 secondes peut être exprimé par "*/5 * * * * *". Toutefois, si j'ai bien compris, vous ne pouvez pas fournir une précision inférieure à 1 seconde.

49
kan

Je suppose que vous pouvez convertir la valeur vous-même en définissant un haricot. Je n'ai pas essayé cela, mais je suppose qu'une approche similaire à celle-ci pourrait vous être utile:

<bean id="FixedDelayLongValue" class="Java.lang.Long"
      factory-method="valueOf">
    <constructor-arg value="#{YourConfigurationBean.stringValue}"/>
</bean>

où:

<bean id="YourConfigurationBean" class="...">
         <property name="stringValue" value="5000"/>
</bean>
1
Grzegorz Oledzki

Dans Spring Boot 2, nous pouvons utiliser le langage d'expression Spring (SpPL) pour les propriétés d'annotation @Scheduled:

@Scheduled(fixedRateString = "${fixed-rate.in.milliseconds}")
public void fixedRate() {
    // do something here
}

@Scheduled(fixedDelayString = "${fixed-delay.in.milliseconds}")
public void fixedDelay() {
    // do something here
}

@Scheduled(cron = "${cron.expression}")
public void cronExpression() {
    // do something here
}

Le fichier application.properties Ressemblera à ceci:

fixed-rate.in.milliseconds=5000
fixed-delay.in.milliseconds=4000
cron.expression=0 15 5 * * FRI

C'est ça. Voici n article qui explique la planification des tâches en détail.

1
attacomsian