Spring 启动 - @EnableScheduling 结合 spring-boot-starter-quartz

Spring Boot - @EnableScheduling combined with spring-boot-starter-quartz

我们有一个项目通过上述依赖关系使用大约十个 Quartz 作业。有一段时间一切似乎都运行良好,但我们有两个作业随机停止工作(所有作业都安排为每五秒 运行)。我们的缓解策略是将这些作业迁移到 Spring 的 'own' 调度,因为它们不需要任何输入数据。添加@EnableScheduling 和适当的@Scheduled 注释后,它们工作正常并且每五秒运行。问题是现在 'old' Quartz 作业似乎已经停止工作(至少在我们的集成测试中,它们等待 20 秒执行)。 Quartz 作业永远不会触发。当增加超时时,Quartz 作业有时会在计划后约 30 秒开始。虽然他们正在 运行ning,但 Spring 工作似乎在等待。我们已经尝试将 Quartz 和 Spring 的线程数设置为 > 50,但似乎没有任何帮助。我们有点没思路,有人知道解决方案吗?

我们正在使用 Spring Boot 2.3.3。和最新的 Quartz,2.3.2.

谢谢。

好吧,问题似乎出在我们的@Transactional 管理上——我们似乎以某种方式获得了一个锁,阻止 Quartz 的调度器找到被安排立即执行的触发器( 似乎有相同的问题,但与 Spring 调度无关)。我们'fixed'问题通过设置

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

这显然不是修复,而是等待 30 秒(Quartz 的默认空闲等待时间,最初使作业仅在所述时间后执行),调度程序仅等待 5 秒来搜索触发器找不到之后。这会使我们的即时作业延迟五秒触发,但这在我们的用例中不是问题。

当然,这不是真正的解决方案,改进我们的@Transactionals 可能是正确的解决方案,但我们现在不能这样做,也许在将来的某个时候。

为什么问题开始出现在@EnableScheduling 之后而不是之前,我们不知道。