В одном экземпляре Tomcat У меня есть поток, который был запущен, когда контекст был инициализирован. Что-то вроде этого:
Tomcat Cluster 6 и ContextListener
public class MyContextListener implements ServletContextListener {
private MyThread thread = null;
@Override
public void contextInitialized(ServletContextEvent sce) {
//Start thread...
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
//Stop thread...
}
}
Этот поток выполняет некоторые важные рабочие места в системе каждые 10 минут, и он работает нормально.
Теперь я переключился на кластер из экземпляров tomcat, и этот поток работает на двух экземплярах. Я пытаюсь добиться другого поведения.
То, что я пытаюсь достичь:
- Этот поток должен быть запущен только на одном экземпляре в то время.
- Если первый экземпляр не работает (по которому выполнялся поток), поток должен запускаться во втором экземпляре.
Я был бы признателен за любые рекомендации.
Что такое логика приложения?
логика приложения, которая выполняется нитью выглядит следующим образом:
- чтения из БД н.
- Анализ информации о БД.
- Выполнение HTTP-запроса к внешней системе, если необходимо.
- Сонная нить еще 10 минут.
Дело: Если у меня будет 2 экземпляра кота, только один должен выполнить эту логику
Я предполагаю, что вы на самом деле делаете ** чисто логику приложения **, и я предполагаю (как вы не упомянули), что вы не используете какие-либо базовые инфраструктурные компоненты (например, сеансы и т. Д.), Которыми управляет Tomcat, для достижения что вы пытаетесь сделать. Следовательно, наименее вероятно, что кластеризация по своей сути поддержит это. – Santosh
Спасибо за ответ. Я не использую сеансы. Логика приложения, выполняемая потоком, выглядит следующим образом: 1. Прочтите sth из DB. 2. Проанализируйте информацию БД. 3. Выполняйте запрос HTTP к внешней системе, если это необходимо. 4. Сонная нить еще 10 минут. Дело в том, что если у меня будет 2 экземпляра tomcat, только одна должна выполнить эту логику. – Lewy