java - quartz 线程执行并行还是顺序?

标签 java scheduling quartz-scheduler

我们有一个基于 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 队列上发送一条消息。 我们已将 quartz 的线程数指定为 100,甚至尝试将其增加到 200 或更多,但没有任何收获。我们注意到的另一件事是,来自调度程序的日志在前 1 分钟后按顺序出现,即

[Quartz_Worker_28] <Some log statement>
..
..
[Quartz_Worker_29] <Some log statement>
..
..
[Quartz_Worker_30] <Some log statement>
..
..

所以这表明 quartz 在一段时间后几乎按顺序运行线程。发生这种情况的原因可能是将作业完成通知持久性存储(在本例中是一个单独的 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 触发,而 quartz 仍然不认为它是 misfire。不应该是失火了吗?

最佳答案

尝试玩下面的东西,它应该会改善行为

org.quartz.scheduler.batchTriggerAcquisitionMaxCount
org.quartz.jobStore.acquireTriggersWithinLock
org.quartz.scheduler.idleWaitTime

关于java - quartz 线程执行并行还是顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11361939/

相关文章:

java - X-B3-SpanId 常量在哪里定义?

java - JAXB 生成的类无法识别

java - 当我们使用合并时,JPA 不会从一对多关系中插入新的 child

Java用一个字符替换字符串中的多个字符

python - 类似 cron 的循环任务调度程序设计

c++ - 如何对进程的 'manager' 和 'worker' 线程进行优先级排序(或设置调度策略)?

java - Spring-Boot @Scheduled Cron 表达式在两个任务之间稍微延迟?

c++ - 使 Thread 本地队列带有计数器

grails - Grails 中的 Quartz 工作

java - 如何使用sql手动更改quartz作业计划时间?