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

问题描述 投票:0回答:6

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

java timer jboss ejb-3.0
6个回答
30
投票

stop()
方法放入您的 bean 中,并使用您的 计时器名称 作为参数来调用它。它将迭代所有计时器并停止您的计时器。

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

3
投票

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

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

2
投票

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


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

1
投票

自 EJB 3.1 起,

TimerService
上有新方法,它们采用
TimerConfig
而不是
Serializable
负载。使用
TimerConfig
可以使
Timer
变得非持久性。

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

0
投票

尝试在要关闭的 bean 中使用

@PreDestroy
注释。

例如:

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

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

© www.soinside.com 2019 - 2024. All rights reserved.