2016-03-24 13 views
0

我有下面每兩分鐘運行一次發現方法的預定bean。在Java EE中停止預定的EJB任務

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

上述方法的問題是它永遠運行。 有沒有辦法阻止一旦發現完成後踢腳踢的方法?我可以有條件地運行/停止嗎?

回答

2

兩種方法:你可以在你的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的定時器將取消爲好。