У меня есть кластерный кварцевый планировщик (3 запущенных экземпляра Java, ссылающихся на одну и ту же БД, где присутствуют кварцевые таблицы). Ниже то, что у меня есть в моем файле свойств кварца. org.quartz.scheduler.instanceId = AUTO org.quartz.jobStore.isClustered = true
ниже код java
import org.quartz.JobKey;
import org.quartz.Scheduler;
boolean interruptResult = scheduler.interrupt(new JobKey(jobName,groupName));
Вариант использования:
Дело 1 :
Задания выполняются в экземпляре «A» и
когда запрос на прерывание поступает в экземпляр «B», он не может прерваться, и interruptResult
становится ложным.
Случай 2: Задания выполняются в экземпляре «А» и когда запрос на прерывание приходит к экземпляру «А», он отлично выполняет свою работу, прерывая работу.
Кто-нибудь может мне помочь ? Мне не хватает дополнительной конфигурации для установки с несколькими экземплярами (кластерами)?
Спасибо заранее !!!
Так работает Кварц. Когда вы думаете об этом, кластер Quartz — это «просто» набор автономных экземпляров Quartz, которые используют одно и то же хранилище заданий JDBC. Экземпляры Quartz могут приходить и уходить когда угодно, и им не нужно регистрироваться/отменять регистрацию, нет центрального узла, который бы отслеживал текущую топологию кластера и координировал выполнение запланированных заданий.
У этой схемы есть некоторые преимущества (например, более простая реализация, более высокая надежность и отказоустойчивость из-за отсутствия централизованного узла/менеджера) и некоторые недостатки (например, операции в масштабе кластера, такие как прерывание заданий, несколько сложнее реализовать, балансировка примитивная).
Для реализации варианта использования вам необходимо:
Переберите все ваши кластеризованные планировщики Quartz и планировщик запросов, чтобы получить список всех текущих заданий, выполняемых в этом конкретном экземпляре планировщика.
Найдите экземпляр планировщика Quartz, который в данный момент выполняет ваше задание.
Вызовите операцию прерывания для найденного экземпляра планировщика Quartz.
Поскольку вам придется выполнять удаленные вызовы, вы не можете использовать локальный Quartz API. Я рекомендую использовать Quartz JMX API для этой работы, или вы можете использовать Quartz RMI API. Оба довольно просты в использовании, и в Google должно быть достаточно примеров.
@puclanac Сначала вам нужно заставить планировщики Quartz экспортировать (зарегистрировать) свои MBean-компоненты в реестр MBean-компонентов JVM. Это достигается добавлением org.quartz.scheduler.jmx.export = true в вашquartz.properties. Затем вам нужно будет включить удаленный доступ к серверу MBean JVM, добавив несколько свойств sys в командную строку JVM планировщика Quartz. Вы можете найти список в главе 3.1 в этом документе: quardesk.com/downloads/documents/howto/… . Затем вам нужно реализовать приложение с описанной выше логикой.
Чтобы удаленно подключиться к серверу JMX, получить справочник Quartz MBean и вызвать на нем методы, вам потребуется изучить API-интерфейсы Java JMX, просмотреть несколько примеров и поиграть. Это интерфейс Quartz MBean, который вы хотите получить из реестра, и чьи методы (getCurrentlyExecutingJobs, interruptJob) вам нужно будет вызвать: jmx/… .
Я изо всех сил пытаюсь реализовать это, можете ли вы указать мне какой-либо пример Quartz JMX API о том, как реализовать ваше предложение?