有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何停止无尽的EJB3计时器?

我是EJB3新手。我使用以下代码来启动无尽的EJB3计时器 然后在JBoss4.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);

它工作得很好。我创建了一个客户端类,它调用一个创建计时器的方法,以及一个在计时器超时时调用的方法

我忘了打电话取消 然后它不会停止。使用取消呼叫重新部署永不停止。重新启动Jboss 4.2.3永远不要停止它。如何停止EJB计时器? 谢谢你的帮助


共 (6) 个答案

  1. # 1 楼答案

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

  2. # 2 楼答案

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

    自从EJB3.1以来,在TimerService上出现了一些新方法,它们采用TimerConfig而不是Serializable负载。使用TimerConfig可以使Timer非持久化

    timerService.createIntervalTimer(10, 5000, new TimerConfig(null, false));
    
  4. # 4 楼答案

    我也有同样的问题,我的JBoss是6.1
    在杀死这个无止境(持久)计时器之后,我找到了以下解决方案来避免这种情况 未来的问题:
    使用JBoss AS 6.1(EJB 3.1)可以创建非持久性自动计时器,但它们在服务器重启后无法生存:

    @Schedule(minute=”*/10”, hour=”*”, persistent=false)
    public void automaticTimeout () {
    
  5. # 5 楼答案

    另一种方法是创建具有“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
    
  6. # 6 楼答案

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

    例如:

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

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