Quartz触发器提前触发

时间:2013-06-06 11:01:37

标签: triggers quartz-scheduler

我们在64位机器上使用石英2.1.5(集群,2个实例,16GB内存)。我们在系统中有大约8000个触发器。

每秒我们都有大约50个触发器 - 它们每秒都会被触发。

org.quartz.threadPool.threadCount = 50
org.quartz.scheduler.batchTriggerAcquisitionMaxCount=100
org.quartz.scheduler.idleWaitTime=15000
#org.quartz.scheduler.batchTriggerAcquisitionFireAheadTimeWindow=0 (this is not set)

Quartz能够处理负载,但触发器会提前触发吗?

batchTriggerAcquisitionMaxCount - 我们可以将它增加到500并将batchTriggerAcquisitionFireAheadTimeWindow保持在1000(1秒),这些配置是否有任何缺点?

还有其他方式吗?

使用以下配置,它似乎工作正常。

org.quartz.threadPool.threadCount = 100
org.quartz.scheduler.batchTriggerAcquisitionMaxCount=500
org.quartz.scheduler.batchTriggerAcquisitionFireAheadTimeWindow=1000
org.quartz.scheduler.idleWaitTime=25000

1 个答案:

答案 0 :(得分:0)

当quartz希望运行你的触发器时,它会调用这个方法:

triggers = qsRsrcs.getJobStore().acquireNextTriggers(now + idleWaitTime, Math.min(availThreadCount, qsRsrcs.getMaxBatchSize()), qsRsrcs.getBatchTimeWindow());

其中:

  • idleWaitTimeorg.quartz.scheduler.idleWaitTime
  • availThreadCount是免费线程数(将小于或等于org.quartz.threadPool.threadCount
  • qsRsrcs.getMaxBatchSize()org.quartz.scheduler.batchTriggerAcquisitionMaxCount
  • qsRsrcs.getBatchTimeWindow()org.quartz.scheduler.batchTriggerAcquisitionFireAheadTimeWindow

它会导致SQL请求,如:

SELECT * FROM TRIGGERS WHERE NEXT_FIRE_TIME <= now + idleWaitTime + qsRsrcs.getBatchTimeWindow() LIMIT Math.min(availThreadCount, qsRsrcs.getMaxBatchSize())

所以,是的,Quartz总是提前使用idleWaitTime + qsRsrcs.getBatchTimeWindow()运行触发器。如果将getBatchTimeWindow设置为零,并将idleWaitTime设置为1000(它是最小值),则所需的最小触发器数量。在这种情况下,除了那些预计会运行的触发器之外,它仍然需要提前1秒发生的触发器。

如果你想提前完全停止触发,你可以将batchTriggerAcquisitionMaxCount设置为1.这种情况的缺点是你可能会得到太多的SQL请求。您可以尝试使用batchTriggerAcquisitionMaxCount参数,找到最适合您的值。

BTW查看Quartz代码,您可以看到将batchTriggerAcquisitionMaxCount设置为大于threadCount是没有意义的。