在 Java EE 中停止计划的 EJB 任务

Stop a scheduled EJB task in Java EE

我有以下预定 bean,它每两分钟运行一次发现方法。

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

上述方法的问题在于它永远运行。 一旦我的发现完成,有什么办法可以停止踢球的方法吗?我可以有条件地 run/stop 吗?

两种方法:您可以在 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 上的计时器将被永久取消。