Quartz调度程序可以在应用程序关闭时重新启动损坏的作业吗

时间:2013-10-16 07:10:53

标签: java quartz-scheduler jobs

我有一个应用程序,有一些不同的,长期运行的石英作业。每个作业都由一种事件(例如用户操作)触发,并且每个事件只打算运行一次。在应用程序工作的环境中,会发生以下情况......

  1. 应用程序正在运行,
  2. 触发长时间工作,
  3. 在执行作业应用程序关闭期间,
  4. 应用程序再次出现。
  5. 是否有可能导致石英自动重新启动作业并且之前未完成(在应用程序的上一个会话中)?我的意思是使用jdbc job store,它可以很好地解决失误的工作 - 但它是否可以重新启动未完成的工作。

1 个答案:

答案 0 :(得分:0)

这是我发现的最佳方法:

  1. 配置石英计划程序:
      

    org.quartz.scheduler.interruptJobsOnShutdownWithWait =真

  2. 使您的可恢复作业实现InterruptableJob,并手动触发当前作业作为中断逻辑的一部分(例如下面的例子)。
  3. 编写自己的ShutdownHook来调用Scheduler.shutdown(true)或使用quartz ShutdownHookPlugin
  4. 这样,当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;
    
        }
    
    }