2013-07-19 2 views
2

Мне нужно запустить некоторую бизнес-логику один раз и только один раз в кластере Geronimo/Tomcat при развертывании WAR (или EAR) и до того, как приложения начнут обслуживать пользователей.Логика запуска в кластере Geronimo (или Tomcat)

Способ, которым я делал это, был актуальным, был ad-hoc и не является отказоустойчивым. Я использую файл конфигурации на узле 1 и обозначаю его «узел запуска». Когда приложение запускается в кластере, каждый узел записывает свой IP-адрес в базу данных, а затем ожидает ожидания в Servlet.init, который был настроен на загрузку при запуске в web.xml. Когда узел запуска видит, что все ожидаемые узлы создали свой IP-адрес в базе данных, он запускает бизнес-логику. Когда бизнес-логика запуска завершается, он отправляет все-ясно другим узлам, записывая строку подтверждения в базу данных.

Периодически (два раза в секунду) все неиспользуемые узлы опроса базы данных для этого полностью очищенного сигнала, и когда они видят это, они заканчивают свой запуск и возвращаются из Servlet.init. На этом этапе все узлы обслуживают приложение обычно для пользователей.

У меня еще не закончилась логика запуска, но мне было интересно, существует ли какой-либо стандарт Java EE или надежный сторонний библиотечный подход для запуска моей логики запуска только один раз в моем кластере. Благодаря!

Редактировать 2013/07/21: Я вспомнил, что WebLogic Server имел сложные средства запуска, которые могут быть полезны в достижении «INIT только один раз в кластере» логике, что я хочу делать в Geronimo/Tomcat кластера. Я сделал рытье и да, WebLogic может делать именно то, что я хочу! Вот отличная статья по теме: http://developsimpler.blogspot.com/2012/03/weblogic-clusters-and-singleton-service.html

Я не могу позволить себе WebLogic, к сожалению. Итак, есть ли что-то подобное в Geronimo или Tomcat (или других открытых Java-EE-серверах с открытым исходным кодом?) Или существуют ли сторонние библиотеки, которые я мог бы использовать для достижения того же?

ответ

1

Для распределенной координации есть такие инструменты, как Zookeeper.

Я не думаю, что есть стандарт Java EE для того, что вы ищете, и я не могу понять такую ​​возможность использования, можете ли вы описать, почему вы хотите, чтобы одно единственное «главное» приложение ожидало запуска других приложений ?

+0

Несомненно. В моем конкретном приложении мне нужен узел запуска, ожидающий запуска кластера cassandra (каждый узел моего кластера Geronimo также является узлом хранения cassandra). После того, как кольцо Cassandra будет готово, у меня есть узлы, ожидающие, пока узел запуска не сможет внести необходимые изменения схемы, ожидаемые кодом. – DWoldrich

+0

Мне нравится zookeeper, но это область памяти, которая пока оставляет ее в моей лиге. – DWoldrich

+0

Может ли это решить вашу проблему? http://www.datastax.com/drivers/java/apidocs/com/datastax/driver/core/Host.StateListener.html –