Comment utiliser @Planifiée(cron) avec SpEL au printemps?
J'ai une méthode que j'ai envie de printemps à l'annexe - d'ailleurs je suis en utilisant le @Scheduled
annotation - et pour être plus exact, je suis en utilisant une expression cron.
Mon expression cron est dans une propriété de fichier qui est appelé planificateur.les propriétés.
Quand je suis en l'utilisant comme un espace réservé @Scheduled(cron="${cron}")
- tout fonctionne très bien; mais je veux l'utiliser SpEL ( @Scheduled(cron="#{scheduler['cron']}")
) , et il ne fonctionne pas - lève l'exception suivante:java.lang.IllegalArgumentException: cron expression must consist of 6 fields (found 1 in #{scheduler['cron']})
Ce que je fais mal?
EDIT:
Voici mon cron expression à partir du fichier de propriétés: cron=0 0/1 * * * ?
Ici est la trace de la pile que j'obtiens:
java.lang.IllegalArgumentException: cron expression must consist of 6 fields (found 1 in #{scheduler['cron']})
at org.springframework.scheduling.support.CronSequenceGenerator.parse(CronSequenceGenerator.java:233)
at org.springframework.scheduling.support.CronSequenceGenerator.<init>(CronSequenceGenerator.java:81)
at org.springframework.scheduling.support.CronTrigger.<init>(CronTrigger.java:54)
at org.springframework.scheduling.support.CronTrigger.<init>(CronTrigger.java:44)
at org.springframework.scheduling.config.ScheduledTaskRegistrar.afterPropertiesSet(ScheduledTaskRegistrar.java:188)
at org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor.onApplicationEvent(ScheduledAnnotationBeanPostProcessor.java:209)
at org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor.onApplicationEvent(ScheduledAnnotationBeanPostProcessor.java:1)
at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:97)
at org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:324)
at org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:929)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:467)
at org.springframework.web.context.ContextLoader.configureAndRefreshWebApplicationContext(ContextLoader.java:384)
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:283)
at org.springframework.web.context.ContextLoaderListener.contextInitialized(ContextLoaderListener.java:111)
at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:4723)
at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5226)
at org.apache.catalina.core.StandardContext$1.call(StandardContext.java:5221)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
DEUXIÈME EDIT:
Il semble que le printemps est en train d'essayer d'analyser la chaîne de caractères que le cron experssion "#{planificateur de['cron']}" insraed de la réelle expression cron lui-même.
OriginalL'auteur Noam | 2012-05-01
Vous devez vous connecter pour publier un commentaire.
Selon le message d'erreur, la valeur de l'expression cron dans votre fichier de propriétés est incorrect.
Il n'est pas conforme à la syntaxe attendue.
La valeur doit contenir six champs et ressembler à quelque chose comme ça.
Voici le code qui génère cette exception
Il peut ne pas être possible d'externaliser cron configuration à l'aide de spEL, dans une Annotation.
Les alternatives à l'utilisation de XML ou de l'utilisation de l'expression cron.
http://forum.springsource.org/showthread.php?91203-Scheduled-and-externalization-of-configuration-for-fixedDelay-and-fixedRate-problem
cron=0 0/1 * * * ?
Salut Noam, de Bonnes informations. Je suis d'accord que cette valeur semble correct. Vous pourriez avoir découvert un défaut dans le code qui est de signaler le bug. D'autant qu'il travaille dans l'annotation. Je voudrais essayer joignant le cron chaîne de guillemets simples ou doubles comme un "voir si elle colle" de la stratégie. Partager la trace de la pile avec nous et alors nous pouvons la recherche de la source pour voir ce que le code est fait et qui devrait nous aider à aller au fond d'elle.
Salut Rob, j'ai publié la trace de la pile; et j'ai même essayé de les guillemets simples et doubles - comme vous l'avez suggéré, mais j'obtiens toujours la même exception... Juste pour le débogage, j'ai ajouté un membre de cette classe et annoté comme ceci:
@Value("#{scheduler['cron']}")
- il de la valeur d'une expression cron - 0 0/1 * * * ?Je suis le chargement du printemps-projet de cadre et avoir un regard sur le code pour voir ce qui se passe.
Il est clair maintenant, à partir du printemps-code de la structure de joint que l'expression c'est d'essayer d'analyser est "#{planificateur de['cron']}" qui n'est pas comme nous nous y attendons.
OriginalL'auteur Rob Kielty
Toujours spécifier comme ceci dans le fichier de propriétés: Avis de l'espace entre la fréquence.
exécuter le travail d'actualisation chaque jour de 9 h
travail.cron.taux=0 0 9 * * *
Exemple les schémas:
L'utiliser comme ceci dans le Code:
OriginalL'auteur Kul Bhushan Prasad
J'ai eu un problème similaire et résolu par la lecture de fichier de propriété avec le contexte:propriété de l'espace réservé
<util:properties id="applicationProps" location="/WEB-INF/classes/properties/application.properties" />
**<context:property-placeholder properties-ref="applicationProps" />**
Espère que cela aide quelqu'un!!
OriginalL'auteur Ashu
Il fonctionne. J'ai passé des jours à essayer de comprendre... mais ce qui fonctionne vraiment.
Puis redémarrez votre IDE, Eclipse ou NetBeans ce que vous êtes en utilisant.
OriginalL'auteur user1842915