Управление выполнением пакетной программы, работающей в другой JVM на другом сервере

1

У меня есть пакетная программа (программа для вставки/обновления/запроса базы данных) с использованием Java Timer для запуска один раз в день. Эта пакетная программа работает на двух разных серверах в apache tomcat.

Теперь моя проблема заключается в том, что Java Timer API запускает работу параллельно на обоих серверах, из-за чего моя программа выполняется дважды, поэтому я получаю одну и ту же запись, обработанную дважды, с другим Первичным ключом.

Мне нужно убедиться, что моя программа запускается только один раз, что запуск должен происходить динамически независимо от серверов. После запуска одной партии другие не должны запускаться или другие не должны обрабатываться.

Здесь Tomcat размещен на двух серверах, в каждом из которых есть одно и то же приложение, развернутое в нем. У меня есть одна База данных, которая совместно используется обоими серверами.

Используются Java и весна.

Нужно предложить/помочь в решении вышеупомянутой проблемы.

Теги:
spring
tomcat
jvm

1 ответ

0

Используйте библиотеку планирования заданий, например Quartz, которая поддерживает выполнение заданий в кластерной среде.
Кварц имеет возможность убедиться, что именно один узел будет запускать задание, тем самым предотвращая дублирование выполнения заданий. Вы можете прочитать об этом здесь.
Spring предоставляет абстракции для асинхронного выполнения и планирования задач с интерфейсами TaskExecutor и TaskScheduler. Spring также имеет классы интеграции для поддержки планирования с помощью Quartz Scheduler. Для получения дополнительной информации смотрите здесь.

Если вы хотите продолжать использовать Java-таймеры, вам придется самостоятельно следить за синхронизацией. Решение общего пользования использует общую таблицу базы данных блокировок. Вы должны быть осторожны, чтобы не сталкиваться с проблемами параллелизма, когда два узла пытаются одновременно читать и писать из таблицы блокировки.

  • 0
    Спасибо, но я хочу, чтобы то же самое было достигнуто в самом Java Timer.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню