如何阻止无休止的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计时器? 谢谢你的帮助。

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

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

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

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

另一种方法是使用’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 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));