2016-03-24 31 views
0

Her iki dakikada bir keşif yöntemini çalıştıran zamanlanmış fasulyem var.Zamanlanmış bir EJB görevini Java EE'de durdurun EE

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

Yukarıdaki yaklaşımın problemi, sonsuza kadar sürmesidir. Bulma tamamlandıktan sonra yöntemi tekmelemeyi durdurmanın bir yolu var mı? Şartlı olarak çalışabilir miyim/durdurabilir miyim?

cevap

2

İki yaklaşım: fasulyenizde bir boole ayarlayabilir ve discover()'u çalıştırıp çalıştırmadığını kontrol edebilirsiniz. Bu, yine de hiçbir şey yapmamak için her iki dakikada bir discover() çağrılmasına yol açacaktır. Ancak bu, sonraki bir tarihte almak için resumeDiscovery() yöntemini eklemenize izin verecektir.

@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 
    } 
} 

Alternatif olarak, işi işleyen Timer iptal edebilirsiniz. Bu daha kalıcı bir çözümdür; Bu programlanmış EJB'yi yeniden başlatamayacaksınız ... en azından kolay değil. Yani bu şekilde görünecektir:

@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 
    } 
} 

Pekala sen keşif vazgeçerseniz, keşif çalıştırmayı dener dahaki sefere bu fasulye zamanlayıcı iyi için iptal edilecektir.