Quartz线程并行执行还是顺序执行?

我们有一个基于石英的调度程序应用程序,该应用程序每分钟运行约1000个作业,每分钟的秒数均匀分布,即每秒约16-17个作业。理想情况下,这16-17个作业应同时触发,但是该作业的execute方法的第一个语句(仅记录执行时间)非常晚。例如,假设我们从05:00到05:04每分钟安排1000个作业。因此,理想情况下,计划在05:03:50进行的作业应该在05:03:50记录了execute方法的第一条语句,但是,它是在大约05:06:38进行的。我已经跟踪了计划的工作所花费的时间,大约15到20毫秒。此计划的作业足够快,因为我们只在ActiveMQ队列上发送一条消息。我们已将石英的螺纹数指定为100,甚至尝试将其增加到200和更多,但没有收益。我们注意到的另一件事是,调度程序的日志在前1分钟后连续出现,即

[Quartz_Worker_28] <Some log statement>

..

..

[Quartz_Worker_29] <Some log statement>

..

..

[Quartz_Worker_30] <Some log statement>

..

..

因此,这表明一段时间后,石英几乎按顺序运行线程。可能由于将作业完成通知到持久性存储(在这种情况下为单独的postgres数据库)和/或上下文切换而花费了时间。

这种奇怪行为的背后原因可能是什么?

编辑:更详细的日志

[06/07/12 10:08:37:192][QuartzScheduler_Worker-34][INFO] org.quartz.plugins.history.LoggingTriggerHistoryPlugin - Trigger [<trigger_name>] fired job [<job_name>] scheduled at:  06-07-2012 10:08:33.458, next scheduled at:  06-07-2012 10:34:53.000

[06/07/12 10:08:37:192][QuartzScheduler_Worker-34][INFO] <my_package>.scheduler.quartz.ScheduledLocateJob - execute begin--------- ScheduledLocateJob with key: <job_name> started at Fri Jul 06 10:08:37 EDT 2012

[06/07/12 10:08:37:192][QuartzScheduler_Worker-34][INFO] <my_package>.scheduler.quartz.ScheduledLocateJob <some log statement>

[06/07/12 10:08:37:192][QuartzScheduler_Worker-34][INFO] <my_package>.scheduler.quartz.ScheduledLocateJob <some log statement>

[06/07/12 10:08:37:192][QuartzScheduler_Worker-34][INFO] <my_package>.scheduler.quartz.ScheduledLocateJob <some log statement>

[06/07/12 10:08:37:220][QuartzScheduler_Worker-34][INFO] <my_package>.scheduler.quartz.ScheduledLocateJob - execute end--------- ScheduledLocateJob with key: <job_name> ended at Fri Jul 06 10:08:37 EDT 2012

[06/07/12 10:08:37:220][QuartzScheduler_Worker-34][INFO] org.quartz.plugins.history.LoggingTriggerHistoryPlugin - Trigger [<trigger_name>] completed firing job [<job_name>] with resulting trigger instruction code: DO NOTHING. Next scheduled at: 06-07-2012 10:34:53.000

我对以上日志的这一部分表示怀疑

scheduled at:  06-07-2012 10:08:33.458, next scheduled at:  06-07-2012 10:34:53.000

因为这项工作原定于10:04:53进行,但在10:08:33才被解雇,但石英公司仍然不认为这是失火。难道不是失火吗?

回答:

尝试使用以下方法,它应该改善行为

org.quartz.scheduler.batchTriggerAcquisitionMaxCount

org.quartz.jobStore.acquireTriggersWithinLock

org.quartz.scheduler.idleWaitTime

以上是 Quartz线程并行执行还是顺序执行? 的全部内容, 来源链接: utcz.com/qa/428611.html

回到顶部