【问题标题】:How to stop endless EJB 3 timer?如何停止无尽的 EJB 3 计时器?
【发布时间】:2011-01-07 21:42:57
【问题描述】:

我是 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


    【解决方案1】:
        public void stop(String timerName) {
        for(Object obj : timerService.getTimers()) {
            Timer t = (Timer)obj;
            if (t.getInfo().equals(timerName)) {
            t.cancel();
            }
        }
    }
    

    【讨论】:

    • 三年后,非常感谢 :)
    • 这会取消所有计时器,但如果您咨询“getTimers()”,它们仍然存在:/
    • 不!这将只取消与timerName 同名的计时器。
    【解决方案2】:

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

    【讨论】:

    • 如果计时器是持久的,则不太可能
    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:

      另一种方法是使用“信息”属性创建自动计时器 (@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
      

      【讨论】:

        【解决方案5】:

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

        例如:

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

        一般来说资源的解除分配在这里完成。

        【讨论】:

          【解决方案6】:

          从 EJB 3.1 开始,TimerService 上有一些新方法,它们采用 TimerConfig 而不是 Serializable 有效负载。使用TimerConfig 允许使Timer 非持久化。

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2012-05-05
            • 2014-08-24
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多