我下面有安排的bean,它每两分钟运行一次发现方法。

@Stateless(name="MySchedulerBean)
public class MySchedulerBean
     @Schedule(persistent=false, minute="*/2", hour="*", timezone="GMT"
     public void discover(){
          //run discovery every 2 minute
     }
}


上述方法的问题在于它会永远运行。
一旦发现完成,是否有任何方法可以阻止踢踢的方法?我可以有条件地运行/停止吗?

最佳答案

两种方法:您可以在bean上设置一个布尔值,然后让discover()检查该布尔值是否应该运行。但是,这仍将导致每两分钟调用一次discover(),却什么也不做。但这将允许您添加resumeDiscovery()方法以在以后使用。

@Stateless(name="MySchedulerBean)
public class MySchedulerBean
     private boolean cancelTimer = false;

     public void stopDiscovery() {
        this.cancelTimer = true;
     }

     @Schedule(persistent=false, minute="*/2", hour="*", timezone="GMT"
     public void discover() {
          if (cancelTimer) {
               return;
          }
          //run discovery
     }
}


或者,您可以取消正在处理作业的Timer。这是一个更永久的解决方案。至少不容易,您将无法重新启动此计划的EJB。看起来像这样:

@Stateless(name="MySchedulerBean)
public class MySchedulerBean
     private boolean cancelTimer = false;

     public void stopDiscovery() {
        this.cancelTimer = true;
     }

     @Schedule(persistent=false, minute="*/2", hour="*", timezone="GMT"
     public void discover(Timer timer) {
          if (cancelTimer) {
               timer.cancel();
               return;
          }
          //run discovery
     }
}


因此,现在,如果您决定停止发现,则下次尝试运行发现时,此bean上的计时器将被永久取消。

07-27 23:17