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

时间:2010-01-21 19:27:25

标签: java timer jboss ejb-3.0

我是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 个答案:

答案 0 :(得分:26)

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

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

答案 3 :(得分: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

答案 4 :(得分:0)

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

例如:

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

通常,资源取消分配在这里完成。

答案 5 :(得分:0)

自EJB 3.1起,read -p "Enter the total no of nodes : " totalNodes for (( i=1; i<=totalNodes; i++)); do printf "%d\n" "$i" done 上有一些新方法可以使用TimerService而不是TimerConfig有效负载。使用Serializable可以使TimerConfig非持久性。

Timer