我们在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
答案 0 :(得分:0)
当quartz希望运行你的触发器时,它会调用这个方法:
triggers = qsRsrcs.getJobStore().acquireNextTriggers(now + idleWaitTime, Math.min(availThreadCount, qsRsrcs.getMaxBatchSize()), qsRsrcs.getBatchTimeWindow());
其中:
idleWaitTime
是org.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是没有意义的。