Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JAVA:运行cron作业任务,即使计划已经到来_Java_Asynchronous_Jboss_Cron_Quartz Scheduler - Fatal编程技术网

JAVA:运行cron作业任务,即使计划已经到来

JAVA:运行cron作业任务,即使计划已经到来,java,asynchronous,jboss,cron,quartz-scheduler,Java,Asynchronous,Jboss,Cron,Quartz Scheduler,我已经检查过了,但似乎没有给出解决方案 这是我的问题 我在seam项目中有一个cron作业,它是用JBossAsync编写的。它每天凌晨3点开 然而,昨晚,应用程序需要在此之前重新启动。应用程序启动时已过凌晨3点 任务设置为每凌晨3点运行一次,但未运行。在代码中,最终过期时间设置为12/31/9999。从技术上讲,这将假定它已经完成 由于该作业在该时间从未运行,因此即使超过预定时间,是否仍有机会运行该作业?比如在应用程序准备好生产后立即执行它。如果有解决方案,我将如何解决 放置一些标志来检查作业

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

这是我的问题

我在seam项目中有一个cron作业,它是用JBossAsync编写的。它每天凌晨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;
}

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

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

这样做要容易得多

您可以在此链接中找到一些示例。


您可能会选择基于注释的spring批处理(如果对基于xml的批处理不满意的话)

可以回溯开始日期,即
@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());
}

您正在使用哪个版本的JBoss AS或JBoss EAP?@JamesR.Perkins规范版本:4.2.3.GAHi。我道歉。我忘了注意到这个项目是seam项目。我已经更新了描述。谢谢你的回答。