我有一个应用程序,有一些不同的,长期运行的石英作业。每个作业都由一种事件(例如用户操作)触发,并且每个事件只打算运行一次。在应用程序工作的环境中,会发生以下情况......
是否有可能导致石英自动重新启动作业并且之前未完成(在应用程序的上一个会话中)?我的意思是使用jdbc job store,它可以很好地解决失误的工作 - 但它是否可以重新启动未完成的工作。
答案 0 :(得分:0)
这是我发现的最佳方法:
org.quartz.scheduler.interruptJobsOnShutdownWithWait =真
这样,当VM检测到有序关闭时(由RequestRecovery处理硬停机:quartz jobDetail requestRecovery),实现InterruptableJob的作业将被中断并重新触发。直到下次开始才会触发此触发器。
有一个如何实施的快速示例:
public static class TriggerOnInterruptJob implements InterruptableJob {
private boolean interrupt = false;
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
LOGGER.debug("START");
synchronized (mutex) {
mutex.notifyAll();
}
executionCount.incrementAndGet();
try {
while (!interrupt)
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
try {
context.getScheduler().triggerJob(context.getJobDetail().getKey());
} catch (SchedulerException e) {
e.printStackTrace();
}
}
@Override
public void interrupt() throws UnableToInterruptJobException {
interrupt = true;
}
}