@EnableScheduling与spring-boot-starter-quartz相结合

ftf50wuq  于 2021-07-22  发布在  Java
关注(0)|答案(1)|浏览(417)

我们有一个项目,通过前面提到的依赖关系使用大约10个quartz作业。有一段时间一切似乎都很好,但我们有两个作业只是随机停止工作(所有作业都计划每五秒钟运行一次)。我们的缓解策略是将这些作业迁移到spring的“自己”调度,因为它们不需要任何输入数据。添加@enablescheduling和适当的@scheduled注解后,它们工作正常,每五秒钟运行一次。问题是,现在“旧的”quartz作业似乎已经停止工作了(至少在我们的集成测试中,它们等待20秒执行)。石英的工作永远不会被解雇。当增加超时时间时,quartz作业有时会在计划后大约30秒启动。当他们运行时, Spring 工作似乎在等待。我们已经尝试将quartz和spring的线程数设置为>50,但似乎没有任何帮助。我们有点没主意了,有人知道解决办法吗?
我们使用的是SpringBoot2.3.3。最新的石英2.3.2。
谢谢。

nwnhqdif

nwnhqdif1#

好吧,问题似乎出在我们的@transactional management上——我们似乎以某种方式获得了一个锁,该锁阻止了quartz的调度程序查找被安排立即执行的触发器(quartz trigger不会立即触发似乎有同样的问题,但与spring调度无关)。我们通过设置

spring.quartz.properties.org.quartz.scheduler.idleWaitTime=5000

这显然不是修复,而是等待30秒(quartz的空闲等待时间的默认值,它最初使作业只在所述时间之后执行),调度器在没有找到触发器之后只等待5秒来搜索触发器。这使得我们的即时作业延迟5秒触发,但这在我们的用例中不是问题。
当然,这不是真正的解决方案,优化@transactionals可能是正确的解决方案,但我们现在不能这样做,也许在将来的某个时候。
为什么问题是在@enablescheduling之后而不是在之前出现的,我们不知道。

相关问题