#java #quartz-scheduler
#java #quartz-планировщик
Вопрос:
У меня есть приложение, которое использует кластеризованные задания Quartz, и я хотел бы условно отключить некоторые (но не все) задания локально — без переопределения настроек задания в БД. До сих пор я видел решения, которые предлагают полностью отключить Quartz scheduler, что не подходит для моей цели (я хочу, чтобы некоторые задания выполнялись).
В нашей настройке задания обычно выполняются на сервере разработчиков, но поскольку разработчики часто работают над кодом, мы хотим иметь возможность выполнять код локально, в то время как общий доступ к общей базе данных.
Проблема, похоже, в том, что Quartz принимает конфигурацию задания, хранящуюся в БД, как Евангелие, и, похоже, я ничего не могу сделать локально, чтобы сказать «Нет, пожалуйста, не запускайте это задание!» Если я не создам экземпляр триггера задания, Quartz все равно создаст экземпляр QuartzJobBean и попытается его запустить.
Есть два решения, которые я вижу, но которые мне не нравятся:
-
Сбросьте расписание на «0 0 0 0 0?». Это отключило бы задание, но не только локально — оно переопределило бы настройку задания в БД, пока другой (активный) экземпляр не будет запущен в том же кластере, и расписание снова будет сброшено … беспорядочно.
-
Притворитесь выполняемым. При вызове «executeInternal()» пропустите выполнение. Это заставило бы Quartz думать, что задание было выполнено, хотя на самом деле это было не так. Опять же, хорошо для меня, но не хорошо для кластера.
Есть ли у Quartz возможность для приложения сказать «Игнорируйте меня! Этот экземпляр приложения не активен для выполнения этого конкретного задания», или это, по сути, «все или ничего», когда речь идет об отдельных заданиях?
Комментарии:
1. Является ли БД также локальной ?. Или это просто приложение, которое работает локально?
2. Приложение @TheLostMind является локальным, но БД является общей (я понимаю, что это часть проблемы, но нам нужно использовать общую БД).
3. В этом случае не обновляйте базу данных — это опасно. Я бы рекомендовал иметь в вашем приложении свойство, которое можно переопределить при локальном запуске приложения. Затем на основе значения этого свойства (LOCAL или PROD) создайте шаблон стратегии для каждого задания quartz и выберите соответствующую стратегию. ЛОКАЛЬНОЕ задание должно быть просто БЕЗОПЕРАЦИОННЫМ.
4. @TheLostMind некоторые задания, которые мы хотим выполнять локально. Для других нелокальных заданий выполнение без операции — это мой «вариант № 2», и проблема в том, что Quartz подумает, что задание выполнено успешно (и не будет пытаться задействовать для этого другой узел), хотя на самом деле это не так.
5. Ну, вы просите о чем-то, что трудно сделать.. Потому что вы нарушаете порядок использования quartz. Почему вы хотите выполнить задание на одном компьютере и не выполнять его на другом?. И поскольку все компьютеры (приложения) подключаются к одной и той же базе данных, вы не можете контролировать, какое устройство будет выбрано для запуска задания quartz. Честно говоря, я не вижу способа решить вашу проблему.. Могу я спросить вас, почему вы хотите, чтобы это было так?