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

问题描述:

我是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计时器? 感谢您的帮助。

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

后三年前,非常感谢:) – mebada 2013-09-02 07:54:54

+0

这将取消所有的计时器,但如果你查阅“getTimers()”,他们仍然存在:/ – jmlv21104 2014-03-14 14:32:33

+0

不!这将只取消与'timerName'具有相同名称的定时器。 – 2015-01-21 16:45:12

您也可以取消部署您的应用程序,这将“杀死”所有定时器。

我和我的JBoss AS 6.1有同样的问题。
杀死了这个无休止的(持久)定时器后,我发现了以下解决方案,以避免将来的 问题:
使用JBoss AS 6.1(EJB 3.1),可以创建非持久性自动定时器,它们不会生存服务器重启:

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

另一种方法是用“信息”属性来创造醚:自动计时器(@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 

尝试在要关闭的bean内的@PreDestroy注释。

例如:

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

一般的资源去分配都是在这里完成。

自EJB 3.1以来,在TimerService上有新的方法,其中采用TimerConfig而不是Serializable有效负载。使用TimerConfig可以使Timer为非持久性。

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