У нас есть приложение Spring Boot, которое мы запускаем в состоянии Spring Test.Это приложение запускает задание, которое просто уменьшает значение CountDownLatch
(без блокирующего кода внутри и т. Д.).
На этой защелке просто ожидают тест, чтобы узнать, выполняет ли это задание Quartz или нет.
Кварц настроен с базой данных, в кластерном режиме, не допускает одновременного выполнения одного задания.Контекст приложения останавливается и воссоздается для каждого теста.(то есть: кварц останавливается между каждым тестом)
Все работает нормально, но иногда этот тест не удался, потому что защелка никогда не уменьшалась.После анализа мы обнаружили, что при выполнении нескольких тестов экземпляр нашей работы из предыдущего теста все еще выполняется.Таким образом, задание экземпляра нашего теста никогда не запускается (из-за отсутствия одновременного выполнения).И мы получили тайм-аут на этом тесте.
Чтобы проверить это, UUID генерируется в контексте приложения.Этот UUID затем печатается в работе и в тесте.Каждый раз, когда тест не пройден, UUID отличается в работе и в тесте.Это означает, что контекст приложения Spring не совпадает между заданием и тестом.
Кварц останавливается с помощью метода @PreDestroy
на бобе, чем при выполнении quartzScheduler.shutdown(true)
(т.е. Spring будет косвенно вызывать этот методв конце теста)
Мы пришли к выводу, что задание Quartz все еще выполняет предыдущий тест.Но мы не понимаем, почему он все еще работает.
- Есть ли у вас какие-либо рекомендации о том, как остановить Quartz между юнит-тестами?(мы следовали за этим Кварцевым варочным панелью, чтобы остановить планировщик: http://www.quartz -scheduler.org / documents / quartz-2.x / cookbook / ShutdownScheduler.html )
- У вас есть какие-либо объясненияпочему задание все еще выполняется и не остановлено корректно тестом?
С уважением