2010-01-21 5 views
14

Je suis nouveau à EJB 3. J'utilise le code suivant pour démarrer EJB sans fin 3 timer puis le déployer sur JBOSS 4.2.3Comment arrêter la minuterie EJB 3 sans fin?

@Stateless 
public class SimpleBean implements SimpleBeanRemote,TimerService { 

@Resource 
TimerService timerService; 
private Timer timer ; 
@Timeout 
public void timeout(Timer timer) { 
    System.out.println("Hello EJB"); 

} 
} 

puis l'appeler

timer = timerService.createTimer(10, 5000, null); 

Il fonctionne bien. J'ai créé une classe de client qui appelle une méthode qui crée la minuterie et une méthode qui est appelée lorsque le minuteur expire.

J'oublie d'appeler l'annulation alors il n'arrête pas .redeploy avec annuler l'appel ne l'arrête jamais. redémarrez Jboss 4.2.3 ne l'arrêtez jamais. Comment puis-je arrêter le minuteur EJB? Merci de votre aide.

Répondre

26
public void stop(String timerName) { 
    for(Object obj : timerService.getTimers()) { 
     Timer t = (Timer)obj; 
     if (t.getInfo().equals(timerName)) { 
     t.cancel(); 
     } 
    } 
} 
+2

Après trois ans, Merci beaucoup :) – mebada

+0

Cela annule tous les compteurs, mais si vous consultez la rubrique « getTimers() » ils toujours là:/ – jmlv21104

+0

Non! Cela annulera uniquement les minuteurs portant le même nom que 'timerName'. –

2

Vous pouvez également annuler le déploiement de votre application, ce qui va "tuer" tous les temporisateurs.

3

J'ai eu le même problème avec mon JBoss AS 6.1.
Après avoir tué ce sans fin (persistants) minuteries j'ai trouvé la solution suivante pour éviter ce problème à l'avenir:
Avec JBoss AS 6.1 (EJB 3.1), il est possible de créer des minuteries automatiques non persistants, ils ne ne survivrait pas un serveur redémarrage:

@Schedule(minute=”*/10”, hour=”*”, persistent=false) 
public void automaticTimeout() { 
2

Une autre méthode consiste à creat Ethe minuterie automatique (@Schedule) avec l'attribut « info », puis vérifiez dans le service de minuterie pour minuteries avec les mêmes informations et le cas échéant annuler:

@Schedule(hour="*", minute="*",second="3", persistent=false,info="AUTO_TIMER_0") 
void automaticTimeOut(){ 

    if(timerCount==0){System.out.println("FROM AUTOMATIC TIME OUT -----------------> CALLED");timerCount++;} 
    else{ 

     Iterator<Timer> timerIterator=timerService.getTimers().iterator(); 

     Timer timerToCancel=null; 
     while(timerIterator.hasNext()){ 

      Timer tmpTimer=timerIterator.next(); 
      if(tmpTimer.getInfo().equals("AUTO_TIMER_0")){timerToCancel=tmpTimer;break;} 

     }//while closing 

     if(timerToCancel!=null){ 

      timerToCancel.cancel(); 
      System.out.println("AUTOMATIC TIMER HAS BEEN CANCELED ----------------->>>>"); 

     }//if closing 

    }//else closing 

}//automaticTimeOut closing 
0

Essayez l'annotation @PreDestroy dans le haricot où vous souhaitez fermer.

Par exemple:

@PreDestroy 
private void undeployTimer() { 
//.. 
} 

En général, le de-allocation des ressources se fait ici.

0

Depuis EJB 3.1, il existe de nouvelles méthodes sur TimerService qui prennent un TimerConfig au lieu d'une charge utile Serializable. L'utilisation de TimerConfig permet de rendre le Timer non persistant.

timerService.createIntervalTimer(10, 5000, new TimerConfig(null, false)); 
Questions connexes