如果我们重复调度作业,则调度程序线程似乎不断被唤醒。
因此,它会继续运行“查找工作”查询,这很昂贵。
我们已经看到此查询每秒运行多次。

我们添加的所有作业将在将来运行,例如从现在起7天。
因此,我们不需要调度程序线程来继续唤醒。

我深入研究代码,发现QuartzScheduler.scheduleJob调用notifySchedulerThread
这使用布尔信号signalOnSchedulingChange确定是否真正唤醒
我看不到设置此布尔值的方法

请问这里推荐的方法是什么?

最佳答案

我找到了答案
您可以使用StdSchedulerFactory的自定义子类将signalOnSchedulingChange标志设置为false。
例如

    /**
     * Custom StdSchedulerFactory
     *
     * Sets signalOnSchedulingChange to false so the SchedulerThread does not wake on every scheduleJob
     */
    public class CustomStdSchedulerFactory extends StdSchedulerFactory {

        private static final Logger LOG = LoggerFactory.getLogger(CustomStdSchedulerFactory.class);

        @Override
        protected Scheduler instantiate(QuartzSchedulerResources rsrcs, QuartzScheduler qs) {

            LOG.info("setting signalOnSchedulingChange to false");
            qs.setSignalOnSchedulingChange(false);

            return super.instantiate(rsrcs, qs);
        }
    }

10-08 19:35