我们有一些在Spring Test条件下运行的Spring Boot应用程序。
此应用程序启动的工作只是递减CountDownLatch
(内部没有阻塞代码或如此)。
仅在此闩锁上等待测试,以了解Quartz是否运行作业。
Quartz是使用集群模式配置的数据库,不允许同时执行一项作业。停止应用程序上下文,并为每个测试重新创建。 (即:在每次测试之间停止石英)
一切正常,但有时,此测试失败,因为闩锁从未减小。经过分析,我们检测到在运行多次测试时,来自先前测试的工作实例仍在运行。因此,我们测试的实例作业永远不会开始(因为没有并发执行)。而且此测试超时。
要对此进行检查,会在应用程序上下文中生成一个UUID。然后,此UUID将打印在作业和测试中。每次测试失败,作业和测试中的UUID都会不同。这意味着作业和测试之间的Spring Application Context不同。
在bean上使用@PreDestroy
方法停止运行Quartz而不是运行quartzScheduler.shutdown(true)
(即:Spring将在测试结束时间接调用此方法)
我们的结论是,Quartz作业仍在运行先前的测试。但是我们不明白为什么它仍在运行。
致谢
答案 0 :(得分:2)
未关闭Quartz-Scheduler,因为未关闭ApplicationContext。 Spring缓存上下文以供重用。您需要对所有启动Quartz调度程序的测试使用@DirtiesContext
来强制关闭。