2

我在一些 Java WAR 中使用 Quartz Scheduler (v2.2.1),在从数据库错误中恢复时遇到了一些麻烦。WAR 部署在 JBOSS AS 7.1 中。

在 WAR 的初始化中,我启动了两个调度程序:第一个配置了JobStoreTX作为集群(WAR 部署在一个集群中),第二个配置了RAMJobStore以监控一些服务器特定的设置。

RAM 调度程序还包括一个作业,它监视MySQL数据库中的表。如果出现错误,最好保持 Quartz 作业被触发,但事实上有时调度程序被冻结并且这些作业不会被触发。

例如,我在测试中使用了以下方法,但没有运气重新实例化调度程序:

/**
 * Resets all scheduled jobs.
 */
public void reset(final long currentTime) {

    try {
        final StdSchedulerFactory schedFactory = new StdSchedulerFactory();
        schedFactory.initialize("quartz.properties");
        Scheduler myScheduler = schedFactory.getScheduler();

        if (myScheduler != null) {                
            myScheduler.clear();                
            myScheduler.shutdown(); --> HERE, THE THREAD IS LOCKED !!!                
            myScheduler = null;
        }

        myScheduler = schedFactory.getScheduler();
        loadJobs(myScheduler);
        myScheduler.start();
        //myScheduler.startDelayed(10);                        

    } catch (SchedulerException e) {
        LOG.error("Scheduler error !!!");
    }
}

重启 Quartz 调度器的正确方法是什么?

提前致谢

更新 1

由于调度程序对象似乎是相同的......我修改了方法,没有运气,在调用关闭之前重新实例化 StdSchedulerFactory 和调度程序。

您能提供任何功能示例吗?

谢谢

4

2 回答 2

0

说调度程序被冻结意味着 API 有一个巨大的错误。您能否提供堆栈跟踪或在您提到的情况下引发的任何错误。

根据我的经验,返回的调度程序对象将与您调用的次数相同

schedFactory.getScheduler();

您可能需要清理旧作业、取消引用它们或停止它们。

正确的步骤是

-1- 获取调度器对象

-2- 通过调用 scheduler.shutdown() 停止调度程序;

-3- 再次加载作业并启动调度程序

于 2013-11-12T00:27:01.077 回答
0

使用石英 JMX 选项,并且 MBean 具有类似的操作start()shutdown()等等clear(),让生活变得更加简单。

于 2014-09-17T10:59:19.100 回答