ChatGPT解决这个技术问题 Extra ChatGPT

Spring cron expression for every after 30 minutes

I have following Spring job to run after every 30 minutes. Please check my cron expression, is that correct?

0 0 0 * * 30

Here is a full cron job definition from the related Spring configuration file:

<bean id="autoWeblogPingTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="jobDetail" ref="jobDetailForWeblogPing"/>
    <!-- run every 35 minutes -->
    <property name="cronExpression" value="0 0 0 * * 30" />
</bean>
I doesn't help that Spring chose not to use cron format, but named it 'cronExpression'
@JosephLust - that's very true. Also in spring doc, there is no mention of this difference...spring cron is able to provide seconds provision also but normal unix cron is minute based... as in unix man pages minute is smallest unit of of time that can be configured.

f
fedorqui

According to the Quartz-Scheduler Tutorial It should be value="0 0/30 * * * ?"

The field order of the cronExpression is

Seconds Minutes Hours Day-of-Month Month Day-of-Week Year (optional field)

Ensure you have at least 6 parameters or you will get an error (year is optional).


Quartz requires an additional field according to their docs. It would be '0 0/30 * * * ?', I believe. General approach is correct though
stacker it is throwing exception Property 'cronExpression' threw exception; nested exception is java.text.ParseException: Unexpected end of expression.
@Faisal Have you tried to add " ?" at the end of the expression, as shown in the tutorial?
It's important to remember the syntax varies from standard cron on unix machines as in there are seconds in quartz.
Quartz url is dead
f
fedorqui

Graphically, the cron syntax for Quarz is (source):

+-------------------- second (0 - 59)
|  +----------------- minute (0 - 59)
|  |  +-------------- hour (0 - 23)
|  |  |  +----------- day of month (1 - 31)
|  |  |  |  +-------- month (1 - 12)
|  |  |  |  |  +----- day of week (0 - 6) (Sunday=0 or 7)
|  |  |  |  |  |  +-- year [optional]
|  |  |  |  |  |  |
*  *  *  *  *  *  * command to be executed 

So if you want to run a command every 30 minutes you can say either of these:

0 0/30 * * * * ?
0 0,30 * * * * ?

You can check crontab expressions using either of these:

crontab.guru — (disclaimer: I am not related to that page at all, only that I find it very useful). This page uses UNIX style of cron that does not have seconds in it, while Spring does as the first field.

Cron Expression Generator & Explainer - Quartz — cron formatter, allowing seconds also.


Do note that crontab.guru using the Unix style of cron which does not have seconds in it. Spring cron uses seconds so the first field is second.
I also like crontab.guru, but I think in this case this one is much better: freeformatter.com/cron-expression-generator-quartz.html
@lloiacono great tool, thanks for that! I added it into the answer
What's the ? for?
@Shedrack the expression can have 7 parameters. The 7th is year and it is optional
d
d-man
<property name="cronExpression" value="0 0/30 * * * ?" />

i
informatik01

In my Java Spring web application, this is what worked for me:

cron="0 0/30 * * * ?"

This will trigger on for example 10:00 AM, then 10:30 AM etc.

Here is a full configuration file:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:beans="http://www.springframework.org/schema/beans"
       xmlns:task="http://www.springframework.org/schema/task"
       xsi:schemaLocation="
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/task 
    http://www.springframework.org/schema/task/spring-task.xsd">

    <beans profile="cron">
        <bean id="executorService" class="java.util.concurrent.Executors" factory-method="newFixedThreadPool">
            <beans:constructor-arg value="5" />
        </bean>

        <task:executor id="threadPoolTaskExecutor" pool-size="5" />
        <task:annotation-driven executor="executorService" />

        <beans:bean id="expireCronJob" class="com.cron.ExpireCron"/>

        <task:scheduler id="serverScheduler" pool-size="5"/>
        <task:scheduled-tasks scheduler="serverScheduler">
            <!-- every thirty minutes -->
            <task:scheduled ref="expireCronJob" method="runTask" cron="0 0/30 * * * ?"/>
        </task:scheduled-tasks>

    </beans>

</beans>

I dont know why but this is working on my local develop and production, but other changes if I made I have to be careful, because it may work local and on develop, but not on production.


S
Shaul Hameed

If someone is using @Sceduled this might work for you.

@Scheduled(cron = "${name-of-the-cron:0 0/30 * * * ?}")

This worked for me.