【问题标题】:JAVA: Run the cron job task even schedule has comeJAVA:运行 cron 作业任务,即使计划已经到来
【发布时间】:2019-12-04 03:39:14
【问题描述】:

我已经检查了here,但似乎没有给出解决方案。

这是我的问题。

我的 seam 项目中有一个 cron 作业,它是用 jboss async 编写的。它每天凌晨 3 点运行。

但是昨晚,应用程序需要在此之前重新启动。应用程序启动时已过了凌晨 3 点。

任务设置为每天凌晨 3 点运行,但没有运行。在代码中,最终到期时间设置为 12/31/9999。从技术上讲,这将假定它已经完成。

是否有机会在给定的预定时间之后仍然运行该作业,因为它当时从未运行过?就像在应用程序准备好生产后立即执行它一样。如果有解决方案,我将如何解决?

放置一些标志来检查工作是否完成将是最少的选择。

这是我的示例代码。

public void someMethodToSetJob() {
    final String cronTabSchedule = "0 0 3 ? * MON-FRI *";
    final Calendar cal = Calendar.getInstance();
    cal.add(Calendar.MINUTE, 1);
    cal.set(Calendar.SECOND, 0);

    final Calendar expiry = Calendar.getInstance();
    expiry.set(Calendar.MONTH, 11);
    expiry.set(Calendar.DATE, 31);
    expiry.set(Calendar.YEAR, 9999);
    expiry.set(Calendar.SECOND, 0);

    processBackgroundProcessCheck(cal.getTime(), cronTabSchedule, expiry.getTime());
}



@Asynchronous
@Transactional(TransactionPropagationType.REQUIRED)
public QuartzTriggerHandle processBackgroundProcessCheck(
        @Expiration final Date when,
        @IntervalCron final String cron,
        @FinalExpiration final Date endDate) {
    ...
    return null;
}

任何帮助将不胜感激。谢谢!

【问题讨论】:

  • 您使用的是什么版本的 JBoss AS 或 JBoss EAP?
  • @JamesR.Perkins 规范-版本:4.2.3.GA

标签: java asynchronous jboss cron quartz-scheduler


【解决方案1】:

使用 Spring 批处理 tasklet 来实现这一点。原因是,spring 提供了实现最后一个作业运行次数/时间的方法,并从那时起选择下一个块。

这样实现会容易得多。

您可以在此链接中找到一些示例。 https://www.mkyong.com/spring-batch/spring-batch-tasklet-example/

你可能会选择基于注解的 Spring Batch(如果不习惯基于 xml)

【讨论】:

  • 嗨。我很抱歉。我忘了注意这个项目是接缝项目。我已经更新了描述。谢谢你的回答。
【解决方案2】:

可以通过回溯开始日期@Expiration。由于我在凌晨 3 点有 CRON 计划,因此假设应用程序在凌晨 4 点部署。通过将@Expiration 的日期设置为可以赶上凌晨 3 点的日期。它将立即运行该过程。但下一个时间表将是凌晨 3 点。

public void someMethodToSetJob() {
    final String cronTabSchedule = "0 0 3 ? * MON-FRI *";
    final Calendar cal = Calendar.getInstance();
    cal.add(Calendar.HOUR_OF_DAY, 3);
    cal.set(Calendar.SECOND, 0);

    final Calendar expiry = Calendar.getInstance();
    expiry.set(Calendar.MONTH, 11);
    expiry.set(Calendar.DATE, 31);
    expiry.set(Calendar.YEAR, 9999);
    expiry.set(Calendar.SECOND, 0);

    processBackgroundProcessCheck(cal.getTime(), cronTabSchedule, expiry.getTime());
}

【讨论】:

    最近更新 更多