我下面有安排的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上的计时器将被永久取消。