JAVA: 运行 cron job 任务甚至计划来了
JAVA: Run the cron job task even schedule has come
我已经检查过 here 但似乎没有给出解决方案。
这是我的问题。
我的 seam 项目 中有一个 cron 作业,它是用 jboss 异步编写的。每天凌晨 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 batch tasklet 来实现。原因是,spring 提供了实现上一个作业的方法 运行 number/timing 并从那时起选择下一个块.
那样做会容易得多。
您可能会在此 link 找到一些示例。
https://www.mkyong.com/spring-batch/spring-batch-tasklet-example/
您可以选择基于注释的 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());
}
我已经检查过 here 但似乎没有给出解决方案。
这是我的问题。
我的 seam 项目 中有一个 cron 作业,它是用 jboss 异步编写的。每天凌晨 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 batch tasklet 来实现。原因是,spring 提供了实现上一个作业的方法 运行 number/timing 并从那时起选择下一个块.
那样做会容易得多。
您可能会在此 link 找到一些示例。 https://www.mkyong.com/spring-batch/spring-batch-tasklet-example/
您可以选择基于注释的 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());
}