Как остановить бесконечный таймер EJB 3? - PullRequest
14 голосов
/ 21 января 2010

Я новичок в 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? Спасибо за помощь.

Ответы [ 6 ]

26 голосов
/ 22 апреля 2010
    public void stop(String timerName) {
    for(Object obj : timerService.getTimers()) {
        Timer t = (Timer)obj;
        if (t.getInfo().equals(timerName)) {
        t.cancel();
        }
    }
}
3 голосов
/ 04 октября 2012

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

@Schedule(minute=”*/10”, hour=”*”, persistent=false)
public void automaticTimeout () {
2 голосов
/ 24 декабря 2014

Другой метод - создать автоматический таймер (@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
2 голосов
/ 29 марта 2012

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

0 голосов
/ 22 марта 2017

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

timerService.createIntervalTimer(10, 5000, new TimerConfig(null, false));
0 голосов
/ 22 января 2016

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

Например:

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

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

...