如果我们重复调度作业,则调度程序线程似乎不断被唤醒。
因此,它会继续运行“查找工作”查询,这很昂贵。
我们已经看到此查询每秒运行多次。
我们添加的所有作业将在将来运行,例如从现在起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);
}
}