Это должно быть очень просто. Я использую Quartz, работающий под Apache Tomcat 6.0.18, и у меня есть файл jobs.xml, который устанавливает мое запланированное задание, которое выполняется каждый мин.
То, что я хотел бы сделать, - это если задание все еще выполняется, когда время следующего триггера сворачивается, я не хочу запускать новое задание, поэтому я могу оставить старый экземпляр завершенным.
Есть ли способ указать это в jobs.xml(предотвратить одновременные экземпляры)?
Если нет, есть ли способ, по которому я могу предоставить доступ к одиночному ядру в памяти в моем приложении Job (это через JobExecutionContext?), чтобы я мог сам обрабатывать concurrency? (и определить, работает ли предыдущий экземпляр)
update: После того, как вы столкнулись в документах, рассмотрим несколько подходов, которые я рассматриваю, но либо не знаю, как заставить их работать, либо возникают проблемы.
-
Используйте 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, не уверен, есть ли побочные эффекты. Кроме того, я действительно не хочу, чтобы они были истинными синглонами, просто что-то, что связано с определением конкретной работы. -
Внедрите собственный Trigger, который расширяет SimpleTrigger и содержит общее состояние, которое может запускать собственный TriggerListener.
Опять же, я не знаю, как настроить XML файл для использования этого триггера, а не стандартного
<trigger><simple>...</simple></trigger>
.