Java 服务器重新启动或崩溃后的计划任务

Java 服务器重新启动或崩溃后的计划任务,java,spring-boot,scheduled-tasks,scheduler,cron-task,Java,Spring Boot,Scheduled Tasks,Scheduler,Cron Task,我有一些关于spring boot应用程序中@Scheduled task的问题 我有一些微服务,每个月发送一封电子邮件。我有@Scheduled(cron=“每月表达式”)。但试想一下,我已经运行这项服务15天了(但我们需要30天来发送电子邮件),16天后,服务重新启动或崩溃,一段时间后再次醒来。此作业将从第一天开始重新计算1个月,还是继续计算16天左右 @Scheduled(cron="0 0 0 1 * *") public void sendEmail() { emailServ

我有一些关于spring boot应用程序中@Scheduled task的问题

我有一些微服务,每个月发送一封电子邮件。我有@Scheduled(cron=“每月表达式”)。但试想一下,我已经运行这项服务15天了(但我们需要30天来发送电子邮件),16天后,服务重新启动或崩溃,一段时间后再次醒来。此作业将从第一天开始重新计算1个月,还是继续计算16天左右

@Scheduled(cron="0 0 0 1 * *")
public void sendEmail() {
    emailService.sendEmail();
}
我需要在服务器崩溃后的15天内,假设此任务从15天开始继续执行,15天后发送了一封信,但从第一天起就不再开始计数使用此cron:

01*

这将在每个月的第一天运行计划程序,无论服务器何时启动。

使用此cron:

01*


这将在每个月的第一天运行计划程序,而不管服务器何时启动。

cron
expression设计用于在每月或每周的每天或特定日期运行作业,我认为您的理解是错误的。您的玉米表达式用于特定日期,但不用于周期跟踪,请使用该在线生成器获取更多信息

0 0 0 1 * ? *

上面的表达式设计为在每月第一天的00:00:00am运行
cron
表达式设计为在每月或每周的每天或特定日期运行作业,我认为您的理解是错误的。您的玉米表达式用于特定日期,但不用于周期跟踪,请使用该在线生成器获取更多信息

0 0 0 1 * ? *

上述表达式设计为在每月第一天的00:00:00am运行

,您应该为此使用不同的计划程序。这可能是詹金斯的工作,也可能是你可以监控的其他事情。另外,我猜您希望每个月发送一封电子邮件,但是@Scheduled注释将发送N封电子邮件,因为您部署了N个微服务实例。否则,请以不同的速率(例如每分钟)安排任务,并通过数据库管理操作执行。您还可以使用发送电子邮件的服务。您的微服务会发送一个事件,如“在日期Z发送包含数据Y的电子邮件模板X”,您的电子邮件服务将处理该事件。您应该为此使用不同的计划程序。这可能是詹金斯的工作,也可能是你可以监控的其他事情。另外,我猜您希望每个月发送一封电子邮件,但是@Scheduled注释将发送N封电子邮件,因为您部署了N个微服务实例。否则,请以不同的速率(例如每分钟)安排任务,并通过数据库管理操作执行。您还可以使用发送电子邮件的服务。您的微服务会发送一个事件,如“在日期Z发送包含数据Y的电子邮件模板X”,您的电子邮件服务将处理该事件。