153 votes

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

Lorsque j'utilise la capacité Spring 3.0 pour annoter une tâche planifiée, je voudrais définir le paramètre fixedDelay partir 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 Spring Expression Language (SpEL) @Value renvoie un objet String qui à son tour ne peut pas être auto-boîté à une valeur longue comme l'exige le paramètre fixedDelay.

488voto

Mark-A Points 406

Spring v3.2.2 a ajouté des paramètres String aux 3 paramètres longs originaux pour gérer cela. fixedDelayString, fixedRateString et initialDelayString sont maintenant disponibles aussi.

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

54voto

kan Points 12445

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

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

Votre intervalle de 5 secondes peut être exprimé en "*/5 * * * * *". Cependant, si je comprends bien, vous ne pouvez pas fournir moins d'une seconde de précision.

16voto

attacomsian Points 98

Dans Spring Boot 2, nous pouvons utiliser Spring Expression Language (SpPL) pour @Scheduled propriétés d'annotation :

@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 tout. Voici un article qui explique en détail la planification des tâches.

1voto

Grzegorz Oledzki Points 10491

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 que l'approche similaire à ce qui suit pourrait être utile pour vous :

<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>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X