2016-03-24 9 views
0

私は発見方法に2分ごとに実行される予定の豆の下に持っているでスケジュールEJBタスクを停止します。のJava EE

@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()チェックを持つことができます。これはまだだけ何もしないように、しかし2分毎に呼び出されて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のタイマーが良いためにキャンセルされます。