Quartz — невозможно перезапустить планировщик

#tomcat #quartz-scheduler #turbine

#tomcat #quartz-планировщик #турбина

Вопрос:

У меня есть устаревшее веб-приложение, использующее quartz 1.5.0, обернутое с помощью fulcrum.

После сбоя системы при перезапуске Apache tomcat (хостинг приложения) Я получаю сообщение об ошибке:

 Caused by: org.quartz.ObjectAlreadyExistsException: Unable to store Trigger with name: 'xxx' and group: 'yyy', because one already exists with this identification.
at org.quartz.simpl.RAMJobStore.storeTrigger(RAMJobStore.java:309)
at org.quartz.core.QuartzScheduler.scheduleJob(QuartzScheduler.java:652)
at org.quartz.impl.StdScheduler.scheduleJob(StdScheduler.java:249)
at org.apache.fulcrum.quartz.impl.DefaultQuartzScheduler.initialize(DefaultQuartzScheduler.java:170)
at org.apache.fulcrum.yaafi.framework.container.ServiceComponentImpl.initialize(ServiceComponentImpl.java:280)
at org.apache.fulcrum.yaafi.framework.container.ServiceContainerImpl.incarnate(ServiceContainerImpl.java:472)
at org.apache.fulcrum.yaafi.framework.container.ServiceContainerImpl.incarnate(ServiceContainerImpl.java:522)
at org.apache.fulcrum.yaafi.framework.container.ServiceContainerImpl.initialize(ServiceContainerImpl.java:201)
at org.apache.fulcrum.yaafi.framework.factory.ServiceManagerFactory.create(ServiceManagerFactory.java:141)
at org.apache.turbine.services.yaaficomponent.TurbineYaafiComponentService.init(TurbineYaafiComponentService.java:194)
... 13 more
  

Конфигурация Quartz (файл quartz.properties):

 org.quartz.scheduler.instanceName = DefaultQuartzScheduler
org.quartz.scheduler.rmi.export = false
org.quartz.scheduler.rmi.proxy = false
org.quartz.scheduler.wrapJobExecutionInUserTransaction = false
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount = 1
org.quartz.threadPool.threadPriority = 5
org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true
org.quartz.jobStore.misfireThreshold = 60000
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
  

Насколько я понимаю, расписание quartz хранится в оперативной памяти. Верно?

Вопрос 1: Я пытался перезапустить tomcat и даже всю виртуальную машину. Почему ошибка сохраняется? Я полагаю, что ОЗУ должно быть очищено, и все должно быть перезапущено.

Вопрос 2: Предположим, я что-то пропустил, где могут храниться задания quartz? Я посмотрел в базе данных системы, но не смог найти ничего подходящего.

Вопрос 3. Могу ли я каким-то образом принудительно перезапустить quartz без изменения кода приложения?

Пожалуйста, обратите внимание, что это устаревшее веб-приложение, исходного кода которого у меня даже нет.

Комментарии:

1. По-видимому, ваше приложение пытается добавить один и тот же триггер дважды. Самый быстрый способ выяснить причину — запустить ваше приложение в отладчике, поместите точку останова в StdScheduler.java в строке 249 и посмотрите, откуда он вызывается и почему он вызывается дважды для одного и того же триггера (т. Е. Одной и той же клавиши триггера).

2. Большое вам спасибо за ваше время и ваш комментарий. Это приложение работает в 4 экземплярах / настройках более 10 лет, и это происходит впервые. Это происходит только в одном из четырех экземпляров, и это произошло после сбоя, когда мне пришлось перезапустить все вручную. Действительно, отладка была бы наиболее подходящей вещью. Однако для отладки мне потребуется перепроектировать весь двоичный программный стек, который, как вы понимаете, далеко не тривиален. Если мы оставим эту опцию в стороне, не могли бы вы предложить что-нибудь на мои вопросы?

3. Что происходит, когда вы пытаетесь запустить экземпляры приложения один за другим? Вы также получаете ошибку? В хранилище заданий JDBC я бы сказал, что это условие гонки, но в хранилище заданий RAM это должно быть ошибкой в вашем приложении. Если у вас нет исходных текстов вашего приложения, то отлаживать это определенно не совсем тривиально, но, по крайней мере, вы можете узнать происхождение вызова scheduleJob.

4. Все остальные экземпляры работают нормально. Я попытаюсь отключить quartz scheduler, изменив файл свойств. Надеюсь, тогда приложение будет работать, или я увижу другую ошибку, которая может как-то помочь мне. Спасибо за ваше время и понимание.

5. Интересно, может ли где-то храниться какой-нибудь «временный файл» или «файл кэша» (возможно, на сервере приложений Tomcat), который мог бы восстановить состояние аварийной памяти, когда задание уже есть, и мое приложение пытается его восстановить