I'm trying to get a cron job working within a legacy Java/Spring/Hibernate project, so I decided to use the spring scheduler.
I want myTask.doStuff to run at 12:00 on the first Sunday of every month.
In my application-context.xml I've configured my task scheduler like:
<task:scheduled-tasks scheduler="MyTaskScheduler"> <task:scheduled ref="myTask" method="doStuff" cron="0 0 12 ? 1/1 SUN#1 *"/> <!-- Every first Sundy of the month --> </task:scheduled-tasks> <task:scheduler id="MyTaskScheduler" pool-size="10"/>
with the problem cron expression itself being the: 0 0 12 ? 1/1 SUN#1 *
and myTask
is a bean, which has a method called doStuff
that works perfectly when run from unit tests.
When I build and deploy I get a bootime exception from spring:
Caused by: java.lang.IllegalArgumentException: cron expression must consist of 6 fields (found 7 in 0 0 12 ? 1/1 SUN#1 *) 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:129) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1477) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1417)
Given that i'm using cron expressions for the first time, my first assumption was that I was doing something wrong, but I double checked using cronmaker and it gave me the same result.
All the documentations says: A cron expression is a string consisting of six or seven subexpressions (fields).1
despite this I tried knocking off the 7th element(year) since it's not in any of the examples, and got a different error message:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.scheduling.config.ScheduledTaskRegistrar#0': Invocation of init method failed; nested exception is java.lang.NumberFormatException: For input string: "0#1"
... does org.springframework.scheduling support a different flavor of cron from everything else? the spring-specific documentation just says 'cron expressions'.
How can I get this cron expression to work as expected in this context? Any help at all would be appreciated.
At the moment my solution would be to simplify this expression to just run every Sunday, and prepend some Java logic to calculate which Sunday of the month it is, and see if that works - but that sort of defeats the purpose of the configuration approach and seems like an antipattern.
Cron expressions are mostly used in Spring applications through the @Scheduled annotation. In Spring 5.3, we introduced the CronExpression class, which represents — you guessed it — a cron expression. CronExpression replaces CronSequenceGenerator , which is based on java. util.
A cron expression is a string consisting of six or seven subexpressions (fields) that describe individual details of the schedule. These fields, separated by white space, can contain any of the allowed values with various combinations of the allowed characters for that field.
There are two types of crontab files. The system-wide crontab files and individual user crontab files. Users' crontab files are named according to the user's name, and their location varies by operating systems.
“At every 5th minute.” Cron job every 5 minutes is a commonly used cron schedule. We created Cronitor because cron itself can't alert you if your jobs fail or never start. Cronitor is easy to integrate and provides you with instant alerts when things go wrong.
Spring Scheduled tasks are not in the same format as cron expressions.
They don't follow the same format as UNIX cron expressions.
There are only 6 fields:
Asterisk (*) means match any. */X means "every X" (see examples).
Numeric days of the week do not work for me. Besides, "MON-FRI" is much easier to read. Here are some example expressions:
"0 0 18 * * MON-FRI" means every weekday at 6:00 PM. "0 0 */1 * * *" means every hour on the hour. "0 0 */8 * * *" means every 8 hours on the hour. "0 0 12 1 * *" means 12:00 PM on the first day of every month.
Here you can find some additional information.
Also you may find the spring documentation useful.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With