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


Answers

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

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

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




从EJB 3.1开始, TimerService上有一些新的方法,它们使用TimerConfig而不是Serializable有效载荷。 使用TimerConfig可以使Timer非持久化。

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



另一种方法是用'info'属性创建ethe自动定时器(@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





Related