ChatGPT解决这个技术问题 Extra ChatGPT

每 30 分钟后的 Spring cron 表达式

我有以下 Spring 工作每 30 分钟运行一次。请检查我的 cron 表达式,正确吗?

0 0 0 * * 30

这是来自相关 Spring 配置文件的完整 cron 作业定义:

<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>
我没有帮助 Spring 选择不使用 cron 格式,而是将其命名为“cronExpression”
@JosephLust - 这是非常真实的。同样在spring doc中,没有提到这种差异......spring cron也能够提供秒数,但普通的unix cron是基于分钟的......因为在unix手册页中分钟是可以配置的最小时间单位.

f
fedorqui

根据 Quartz-Scheduler Tutorial 应该是 value="0 0/30 * * * ?"

cronExpression 的字段顺序是

秒 分 小时 月 日 月 周 年 年(可选字段)

确保您至少有 6 个参数,否则您将收到错误消息(年份是可选的)。


Quartz 根据他们的文档需要一个额外的字段。我相信它会是 '0 0/30 * * * ?'。一般方法是正确的
堆栈器抛出异常属性'cronExpression'抛出异常;嵌套异常是 java.text.ParseException: Unexpected end of expression。
@Faisal您是否尝试添加“?”在表达式的末尾,如教程中所示?
重要的是要记住语法与 unix 机器上的标准 cron 不同,因为石英中有几秒钟。
石英网址已死
f
fedorqui

从图形上看,Quarz 的 cron 语法是 (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 

因此,如果您想每 30 分钟运行一次命令,您可以使用以下任一命令:

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

您可以使用以下任一方法检查 crontab 表达式:

crontab.guru —(免责声明:我与该页面完全无关,只是我觉得它非常有用)。此页面使用 UNIX 样式的 cron,其中没有秒数,而 Spring 作为第一个字段。

Cron Expression Generator & Explainer - Quartz - cron 格式化程序,也允许秒。


请注意 crontab.guru 使用 Unix 风格的 cron,其中没有秒数。 Spring cron 使用秒,所以第一个字段是第二个。
我也喜欢 crontab.guru,但我认为在这种情况下这个更好:freeformatter.com/cron-expression-generator-quartz.html
@lloiacono 很棒的工具,谢谢!我将其添加到答案中
是什么?为了?
@Shedrack 表达式可以有 7 个参数。 7th 是年,它是可选的
d
d-man
<property name="cronExpression" value="0 0/30 * * * ?" />

i
informatik01

在我的 Java Spring Web 应用程序中,这对我有用:

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

这将触发例如上午 10:00,然后是上午 10:30 等。

这是一个完整的配置文件:

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

我不知道为什么,但这适用于我的本地开发和生产,但如果我做了其他更改,我必须小心,因为它可能在本地和开发中有效,但不适用于生产。


S
Shaul Hameed

如果有人使用@Sceduled,这可能对您有用。

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

这对我有用。