Это должно быть действительно легко. Я использую Quartz под Apache Tomcat 6.0.18, и у меня есть файл jobs.xml , который настраивает мое запланированное задание, которое выполняется каждую минуту.
Что я хотел бы сделать, так это если задание все еще выполняется, когда наступает время следующего запуска, я не хочу начинать новое задание, поэтому я могу позволить завершить старый экземпляр.
Есть ли способ указать это в jobs.xml (предотвратить одновременные экземпляры)?
Если нет, могу ли я предоставить общий доступ к одноэлементному хранилищу в памяти в реализации Job моего приложения (это через JobExecutionContext ?), Чтобы я мог обработать сам параллелизм? (и определить, работает ли предыдущий экземпляр)
обновление: После суеты в документах я рассмотрел пару подходов, но либо не знаю, как заставить их работать, либо возникли проблемы.
Использование StatefulJob . Это предотвращает одновременный доступ ... но я не уверен, какие другие побочные эффекты возникнут, если я его использую, также я хочу избежать следующей ситуации:
Предположим, что время запуска будет каждую минуту, т.е. триггер № 0 = в момент времени 0, триггер № 1 = 60000 мс, № 2 = 120000, № 3 = 180000 и т. Д., А триггер № 0 в момент времени 0 запускает мою работу, которая занимает 130000 мсек. С простым заданием это будет запускать триггеры № 1 и № 2, пока триггер задания № 0 все еще работает. С StatefulJob это будет запускать триггеры # 1 и # 2 по порядку, сразу после того, как # 0 заканчивается в 130000. Я не хочу этого, я хочу, чтобы # 1 и # 2 не запускались, и следующий триггер, запускающий задание, должен состоится в # 3 (180000 мс). Поэтому мне все еще нужно сделать что-то еще с StatefulJob, чтобы заставить его работать так, как я хочу, поэтому я не вижу большого преимущества в его использовании.
Используйте TriggerListener для возврата true из vetoJobExecution ().
Хотя реализация интерфейса кажется простой, мне нужно выяснить, как декларативно настроить один экземпляр TriggerListener. Не удается найти документы для XML-файла .
Используйте static
разделяемый потокобезопасный объект (например, семафор или любой другой), принадлежащий моему классу, который реализует Job.
Мне не нравится идея использования синглетонов через ключевое слово static
в Tomcat / Quartz, не уверен, есть ли побочные эффекты. Кроме того, я действительно не хочу, чтобы они были настоящими одиночками, просто что-то, что связано с определенным определением работы.
Реализация моего собственного Триггера , который расширяет SimpleTrigger и содержит общее состояние, которое может запускать свой собственный TriggerListener.
Опять же, я не знаю, как настроить файл XML для использования этого триггера вместо стандартного <trigger><simple>...</simple></trigger>
.