Singletons с TimerManager в кластере WebSphere - PullRequest
7 голосов
/ 12 мая 2010

Как я могу заставить задачу таймера в кластере WebSphere выполнять один и только один раз? Я знаю, что это возможно на других серверах приложений, но не могу понять, как это сделать в WebSphere.

Ответы [ 4 ]

5 голосов
/ 16 ноября 2011

Вы можете использовать службу планировщика WebSphere, чтобы делать то, что вы хотите. Если вы определите службу планировщика в области действия кластера, каждый член кластера будет запускать демон планировщика, но база данных задач будет общей, то есть только одна из них выполнит добавленную вами задачу. Они опрашивают базу данных каждые 30 секунд (настраивается), и первый видит, что задание выполнит ее.

http://publib.boulder.ibm.com/infocenter/wasinfo/v7r0/topic/com.ibm.websphere.nd.doc/info/ae/ae/welc6tech_sch_adm.html

Имейте в виду, что EJB 3.1 предлагает новые функции, которые могут помочь вам делать то, что вы хотите, но это только WAS 8.

3 голосов
/ 22 октября 2010

Я не уверен, является ли ваша проблема кластером или чем-то еще. Но если вы хотите остановить TimerListener после одного выполнения, вы просто используете введенную переменную таймера и отмените ее.

Ex:

public static class MyTimer implements TimerListener {
     public void timerExpired(Timer timer) {    
         timer.cancel();
     }
}

Если у вас возникли проблемы с кластерной средой, выполняющей задачу один раз за экземпляр, то извиняюсь за публикацию этого простого ответа.

2 голосов
/ 05 февраля 2011

Вам, вероятно, следует прочитать это решение , чтобы оценить, соответствует ли оно вашей ситуации.

0 голосов
/ 19 октября 2012

может быть вы можете использовать терракотовую / ehcache блокировку?http://www.ehcache.org/documentation/2.4/terracotta/explicit-locking

...