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
.
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.
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() {
...
}
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.
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>
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.