4


1

Comment utiliser @Scheduled (cron) avec SpEL au printemps?

J’ai une méthode que je veux que le printemps planifie - d’ailleurs j’utilise l’annotation @ Scheduled - et pour être plus précis, j’utilise une expression cron. Mon expression cron se trouve dans un fichier de propriétés appelé scheduler.properties. Lorsque je l’utilise comme espace réservé @Scheduled (cron =" $ {cron} ") - tout fonctionne très bien; mais je veux utiliser SpEL (@Scheduled (cron =" # {scheduler ['cron']} ")), et cela ne fonctionne pas - jette ce qui suit exception: java.lang.IllegalArgumentException: l’expression cron doit être composée de 6 champs (trouvé 1 dans # {scheduler ['cron']})

Qu’est-ce que je fais mal ici?

  • EDIT: * Voici mon expression cron du fichier de propriétés: cron = 0 0/1 * * *?

Voici la trace de pile que j’obtiens: `java.lang.IllegalArgumentException: l’expression cron doit être composée de 6 champs (trouvés 1 dans # {scheduler ['cron']}) sur org.springframework.scheduling.support.CronSequenceGenerator.parse ( CronSequenceGenerator.java:233) à org.springframework.scheduling.support.CronSequenceGenerator. (CronSequenceGenerator.java:81) à org.springframework.scheduling.support.CronTrigger. (CronTrigger.java:5sfr.fr.work) .CronTrigger. (CronTrigger.java:44) at org.springframework.scheduling.config.ScheduledTaskRegistrar.afterPropertiesSet (ScheduledTaskRegistrar.java:188) at org.springframework.scheduling.AnstotationBeanPostProcessorBonApplicationProgrammationAnalBon .springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor.onApplicationEvent (ScheduledAnnotationBeanPostProcessor.java:1) sur org.springframework.context.event.SimpleApplicationEventM ulticaster.multicastEvent (SimpleApplicationEventMulticaster.java:97) à org.springframework.context.support.AbstractApplicationContext.publishEvent (AbstractApplicationContext.java:324) à org.springframework.context.ontpport.AbstractAppontContext.applicationkontext.ApplicationContext.ApplicationContresh.2 .springframework.context.support.AbstractApplicationContext.refresh (AbstractApplicationContext.java:467) sur org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext (ContextLoader.java:384) atContext.ContextContext .java: 283) sur org.springframework.web.context.ContextLoaderListener.contextInitialized (ContextLoaderListener.java:111) sur org.apache.catalina.core.StandardContext.listenerStart (StandardContext.java:4723) sur org.apache.catalina. core.StandardContext $ 1.call (StandardContext.java:5226) sur org.apache.catalina.core.StandardContext $ 1.call (StandardContext. java: 5221) sur java.util.concurrent.FutureTask $ Sync.innerRun (FutureTask.java:334) sur java.util.concurrent.FutureTask.run (FutureTask.java:166) sur java.util.concurrent.ThreadPoolExecutor.runWorker (ThreadPoolExecutor.java:1110) sur java.util.concurrent.ThreadPoolExecutor $ Worker.run (ThreadPoolExecutor.java:603) sur java.lang.Thread.run (Thread.java:722) `

  • SECOND EDIT: * Il semble que Spring essaie d’analyser la chaîne suivante en tant qu’expersion cron "# \ {scheduler ['cron']}" insraed de l’expression cron elle-même.

4 Answer


3


Selon le message d’erreur, la valeur de l’expression cron dans votre fichier de propriétés est incorrecte.

Il n’est pas conforme à la syntaxe attendue.

La valeur doit contenir six champs et ressembler à ceci.

* 10 * * * *

Voici le code qui lève cette exception

/**
 * Parse the given pattern expression.
 */
private void parse(String expression) throws IllegalArgumentException {
    String[] fields = StringUtils.tokenizeToStringArray(expression, " ");
    if (fields.length != 6) {
        throw new IllegalArgumentException(String.format(""
                + "cron expression must consist of 6 fields (found %d in %s)", fields.length, expression));
    }

Il peut ne pas être possible d’externaliser la configuration cron à l’aide de spEL dans une annotation.

Les alternatives sont d’utiliser XML ou d’utiliser l’expression cron.


1


Spécifiez toujours comme ceci dans le fichier de propriétés: notez l’espace entre les fréquences.

exécuter un travail de rafraîchissement tous les jours à 9h

job.cron.rate = 0 0 9 * * *

Exemples de modèles:

* "0 0 * * * *" = the top of every hour of every day.
* "*/10 * * * * *" = every ten seconds.
* "0 0 8-10 * * *" = 8, 9 and 10 o'clock of every day.
* "0 0/30 8-10 * * *" = 8:00, 8:30, 9:00, 9:30 and 10 o'clock every day.
* "0 0 9-17 * * MON-FRI" = on the hour nine-to-five weekdays
* "0 0 0 25 12 ?" = every Christmas Day at midnight

Utilisez-le comme ceci dans Code:

@Scheduled(cron = "${job.cron.rate}")
public void perform() throws InterruptedException {
}


1


J’ai eu un problème similaire et l’ai résolu en lisant le fichier de propriété avec le contexte: property-placeholder

**

J’espère que cela aide quelqu’un !!


0


Ça marche. J’ai passé des jours à comprendre …​ mais cela fonctionne en effet.

  1. Vous devez définir la variable d’environnement comme vous le faites pour JAVA_HOME, etc.

  2. Fermez votre IDE.

'' '' '

export cron_scheduler_expression="0 19 21 * * *"

Redémarrez ensuite votre IDE, Eclipse ou NetBeans tout ce que vous utilisez.

@Scheduled(cron = "${cron_scheduler_expression}")
public void runSchedulerTask(){

}