如何停止无限的EJB 3计时器?

18

我是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);

它工作得很好。我创建了一个客户端类,调用一个创建计时器的方法和一个在计时器超时时被调用的方法。

我忘记调用取消方法,然后它就无法停止。使用取消调用重新部署无法停止。重新启动Jboss 4.2.3也无法停止它。我如何停止EJB计时器?谢谢帮助。

6个回答

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

2
三年后,非常感谢 :) - mebada
这会取消所有定时器,但如果您查询“getTimers()”,它们仍然存在:/ - jmlv21104
不!这只会取消与“timerName”相同名称的计时器。 - Andrey Luiz

3

我曾经遇到过同样的问题,我的JBoss AS 6.1也出现了这个问题。
在结束这些无限(持久性)计时器后,我找到了以下解决方案,可以避免将来出现此类问题:
在JBoss AS 6.1(EJB 3.1)中,可以创建非持久性自动计时器,它们不会在服务器重新启动后继续存在:

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

2

另一种方法是使用“info”属性创建自动计时器(@Schedule),然后在计时器服务中检查具有相同信息的计时器,如果可用,则取消它:

@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
您可以卸载您的应用程序,这将“杀死”所有计时器。

2
如果计时器是持久的,那么不太可能。 - JJCV

1
自EJB 3.1以来,TimerService上有新方法,它们使用TimerConfig而不是Serializable负载。使用TimerConfig可以使Timer非持久化。
timerService.createIntervalTimer(10, 5000, new TimerConfig(null, false));

0
尝试在您想要关闭的bean中使用@PreDestroy注释。
例如:
@PreDestroy
private void undeployTimer() {
 //..
}

通常在这里进行资源释放。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接