【问题标题】:Spring schedule - last day of month not working春季时间表 - 每月的最后一天不工作
【发布时间】:2019-01-29 07:28:14
【问题描述】:

我想在“每个月的最后一天 10:15”和“每个月的第一个星期日”运行春季调度程序作业 -

我在下面尝试过 - 但它在初始化 spring 上下文时出错:

org.springframework.boot.SpringApplication:应用程序启动失败 java.lang.IllegalStateException:遇到无效的@Scheduled 方法'monthEndSchedule':对于输入字符串:“L”

@Override
@Scheduled(cron = "0 15 10 L * ?")
public void monthEndSchedule() { 
  //
}

虽然下面的作品在“每天凌晨 1 点”运行

@Override
@Scheduled(cron = "0 0 1 * * ?")
public void surveyDailySchedule() {
//
}

我用过的 Cron 表达式参考:http://www.quartz-scheduler.org/documentation/quartz-2.x/tutorials/crontrigger.html

【问题讨论】:

标签: cron spring-scheduled


【解决方案1】:

Spring Scheduler 不支持“L”输入字符串。所以,你需要做一个解决方法。

首先,为每个月的最后几天(28、29、30、31)调用调度程序。

然后,在功能块内使用 if 块检查这是否是最后日期。如果是,则执行预期的任务。

代码会是这样 -

@Scheduled(cron = "0 15 10 28-31 * ?")
public void monthEndSchedule() {
    final Calendar c = Calendar.getInstance();
    if (c.get(Calendar.DATE) == c.getActualMaximum(Calendar.DATE)) {
        // do your stuff
    }
}

【讨论】:

    【解决方案2】:

    如果有人更喜欢用 JDK8+ 做检查,这里是:

    @Scheduled(cron = "0 15 10 28-31 * ?")
    public void doStuff() {
        LocalDate date = LocalDate.now();
        LocalDate last = LocalDate.now().with(TemporalAdjusters.lastDayOfMonth());
        if (date.getDayOfMonth() == last.getDayOfMonth()) {
            //TODO: your job
        }
    }
    

    这将在每个月的最后 4 天的下午 6 点运行。

    【讨论】:

      猜你喜欢
      • 2018-09-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-06-16
      • 1970-01-01
      • 2014-03-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多