Spring Boot的CRON表达式无法正常工作

3
我有一个Spring Boot应用程序,它将创建一个JAR文件。在这个应用程序中,我有两个要执行的作业。一个作业是主作业,它将数据保存在MySQL数据库中,第二个作业执行一些计算并准备一些报告。
我需要每15分钟执行主作业和每20分钟执行第二个作业。因此,我使用了Spring Corn表达式“* / 15 * * * ”用于主作业,“ * / 20 * * * *”用于第二个作业。但是作业执行的行为非常突然。我在这里做错了什么?
4个回答

1

尝试使用以下表达式,并确保已正确处理异常。 0 */15 * * * * - 使用此表达式每15分钟运行作业 0 */20 * * * * - 使用此表达式每20分钟运行作业


你能解释一下它们之间的区别吗? - Francis Raj
1
  • 表示每个时间单位都执行作业。第一个位置表示秒,它将尝试在每个15分钟内的每一秒运行。 0 值用于在每个15分钟的第一秒运行。
更多信息请参见以下链接: https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/scheduling/support/CronSequenceGenerator.html
- sathiya raj
嗨@FrancisRaj, 上面的答案是否满足了你的问题? - sathiya raj
是的,谢谢您的回复。 - Francis Raj

1

新回答 您是正确的,我个人测试过,它可以正常工作。

使用以下Java代码测试cron执行:

CronTrigger t = new CronTrigger("* */15 * * * * ");
TriggerContext tc = new SimpleTriggerContext();
System.out.println("Current Time:" + new Date()+ " |Next Execution " + t.nextExecutionTime(tc));
Calendar c = Calendar.getInstance();
c.setTime(new Date()); // Now use today date.
c.add(Calendar.MINUTE,16);
tc = new SimpleTriggerContext(c.getTime(),c.getTime(),c.getTime());
System.out.println("Current Time:" +c.getTime() + "Next Execution " + t.nextExecutionTime(tc));
c.add(Calendar.MINUTE,18);
tc = new SimpleTriggerContext(c.getTime(),c.getTime(),c.getTime());
System.out.println("Current Time:" + c.getTime() + "Next Execution " + t.nextExecutionTime(tc));

这里是导入语句

import org.springframework.scheduling.TriggerContext;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.scheduling.support.SimpleTriggerContext;

import java.util.Calendar;
import java.util.Date;

旧答案

您错误地将第一个工作安排在每天下午3点 正确的cron是*/15 * * * * 使用

@Scheduled(cron = "*/15 * * * *")

你错误地将第二个工作计划在每天晚上8点执行,正确的cron表达式是*/20 * * * *

参考cron表达式http://corntab.com/?c=*/20_*_*_*_*_


我使用的是这个 * */15 * * *,而不是这个 */15 * * * *。 - GD_Java
是的,您使用 * */15 * * * 每天下午3点进行调度, 请将其更改为每15分钟使用 */15 * * * *。 - RamiReddy P
3
Spring的cron表达式与常规的不同。请在此阅读https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/scheduling/support/CronSequenceGenerator.html。 - GD_Java
表达式是正确的,该代码显示下一次执行时间。我只是将时间向后移动,并查看它何时会进一步执行。 - RamiReddy P

0
请使用以下CRON表达式作为主任务的计划任务:
0 0/15 * 1/1 * ?

请使用以下 CRON 表达式来执行第二个任务。
0 0/20 * 1/1 * ?

请参考Cron Maker


1
这些是针对Linux机器或Quartz的cron任务。Spring cron任务是不同的。但我会尝试。 - GD_Java
尝试使用以下代码: @Scheduled(cron = "*/15 * * * *") 它会起作用的,可以查看我的答案 http://corntab.com/?c=*/20_*_*_*_*_ - RamiReddy P

0

这里已经有几个正确的答案,但如果您的要求是在第一个任务完成后精确地再过15分钟执行第二个任务,则可以使用fixedDelay

有时需要确保第一次运行已完成,在这种情况下,fixedDelay是完美的解决方案。

@Scheduled(fixedDelay = 900000)
public void fixedDelayTask () {
  // Code
}

不要忘记在你的@Configuration类上加上@EnableScheduling。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接