Как остановить бесконечный таймер EJB 3?

Я новичок в EJB 3. Я использую следующий код для запуска бесконечного таймера EJB 3  затем развертывание на JBOSS 4.2.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? Спасибо за помощь.

Ответы

Ответ 1

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

Ответ 2

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

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

Ответ 3

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

Ответ 4

Другим методом является автоматический таймер (@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

Ответ 5

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

Например:

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

Как правило, выделение ресурсов выполняется здесь.

Ответ 6

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

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