2010-01-21 3 views
14

Я новичок в EJB 3. Я использую следующий код, чтобы начать бесконечный EJB 3 таймер затем развернуть его на JBOSS 4.2.3Как остановить бесконечный таймер EJB 3?

@Stateless 
public class SimpleBean implements SimpleBeanRemote,TimerService { 

@Resource 
TimerService timerService; 
private Timer timer ; 
@Timeout 
public void timeout(Timer timer) { 
    System.out.println("Hello EJB"); 

} 
} 

затем назвав его

timer = timerService.createTimer(10, 5000, null); 

Он хорошо работает. Я создал класс клиента, который вызывает метод, который создает таймер и метод, который вызывается, когда таймер отключается.

Я забыл называть отмену , тогда он не останавливается. Redeploy с отменой вызова никогда не останавливает его. Перезапустите Jboss 4.2.3, не останавливайте его. Как я могу остановить таймер EJB? Спасибо за помощь.

ответ

26
public void stop(String timerName) { 
    for(Object obj : timerService.getTimers()) { 
     Timer t = (Timer)obj; 
     if (t.getInfo().equals(timerName)) { 
     t.cancel(); 
     } 
    } 
} 
+2

После трех лет, большое спасибо :) – mebada

+0

Это отменяет все таймеры, но если вы обратитесь к «getTimers()», они все еще там:/ – jmlv21104

+0

Нет! Это отменит только таймеры с таким же именем, как 'timerName'. –

2

Вы также можете развернуть свое приложение, это «убьет» все таймеры.

3

У меня была та же проблема, с моей JBoss AS 6.1.
После убийства этих бесконечные (постоянные) таймеров я нашел следующее решение остерегаясь проблем в будущем:
С JBoss AS 6.1 (EJB 3.1), то можно создать непостоянные автоматические таймеры, они НЕ Пережить сервер рестарт:

@Schedule(minute=”*/10”, hour=”*”, persistent=false) 
public void automaticTimeout() { 
2

Другой метод автоматического Ethe создающего таймер (@Schedule) с атрибутом «Info», а затем проверить в службе таймера для таймеров с той же информацией и при наличии его отмене:

@Schedule(hour="*", minute="*",second="3", persistent=false,info="AUTO_TIMER_0") 
void automaticTimeOut(){ 

    if(timerCount==0){System.out.println("FROM AUTOMATIC TIME OUT -----------------> CALLED");timerCount++;} 
    else{ 

     Iterator<Timer> timerIterator=timerService.getTimers().iterator(); 

     Timer timerToCancel=null; 
     while(timerIterator.hasNext()){ 

      Timer tmpTimer=timerIterator.next(); 
      if(tmpTimer.getInfo().equals("AUTO_TIMER_0")){timerToCancel=tmpTimer;break;} 

     }//while closing 

     if(timerToCancel!=null){ 

      timerToCancel.cancel(); 
      System.out.println("AUTOMATIC TIMER HAS BEEN CANCELED ----------------->>>>"); 

     }//if closing 

    }//else closing 

}//automaticTimeOut closing 
0

Попробуйте аннотацию @PreDestroy внутри компонента, где вы хотите закрыть.

Например:

@PreDestroy 
private void undeployTimer() { 
//.. 
} 

Обычно ресурс-де-распределение делается здесь.

0

Начиная с EJB 3.1, есть новые методы на TimerService, которые принимают TimerConfig вместо полезной нагрузки Serializable. Использование TimerConfig позволяет сделать Timer непостоянным.

timerService.createIntervalTimer(10, 5000, new TimerConfig(null, false));