先前的Spring Boot测试中的Quartz作业仍然随机运行

时间:2019-02-21 23:59:57

标签: java spring spring-boot testing quartz

我们有一些在Spring Test条件下运行的Spring Boot应用程序。 此应用程序启动的工作只是递减CountDownLatch(内部没有阻塞代码或如此)。

仅在此闩锁上等待测试,以了解Quartz是否运行作业。

Quartz是使用集群模式配置的数据库,不允许同时执行一项作业。停止应用程序上下文,并为每个测试重新创建。 (即:在每次测试之间停止石英)

一切正常,但有时,此测试失败,因为闩锁从未减小。经过分析,我们检测到在运行多次测试时,来自先前测试的工作实例仍在运行。因此,我们测试的实例作业永远不会开始(因为没有并发执行)。而且此测试超时。

要对此进行检查,会在应用程序上下文中生成一个UUID。然后,此UUID将打印在作业和测试中。每次测试失败,作业和测试中的UUID都会不同。这意味着作业和测试之间的Spring Application Context不同。

在bean上使用@PreDestroy方法停止运行Quartz而不是运行quartzScheduler.shutdown(true)(即:Spring将在测试结束时间接调用此方法)

我们的结论是,Quartz作业仍在运行先前的测试。但是我们不明白为什么它仍在运行。

  1. 您对在单元测试之间如何停止Quartz有一些建议? (我们遵循了这个Quartz Cookbock来停止调度程序:http://www.quartz-scheduler.org/documentation/quartz-2.x/cookbook/ShutdownScheduler.html
  2. 您是否有解释为什么作业仍在运行但未被测试正确停止?

致谢

1 个答案:

答案 0 :(得分:2)

未关闭Quartz-Scheduler,因为未关闭ApplicationContext。 Spring缓存上下文以供重用。您需要对所有启动Quartz调度程序的测试使用@DirtiesContext来强制关闭。