2010-01-21 13 views
14

Sono nuovo di EJB 3. Io uso il seguente codice per avviare infinita EJB 3 timer poi distribuirlo su JBoss 4.2.3Come fermare il timer EJB 3 senza fine?

@Stateless 
public class SimpleBean implements SimpleBeanRemote,TimerService { 

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

} 
} 

poi definendolo

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

Funziona bene. Ho creato una classe client che chiama un metodo che crea il timer e un metodo che viene chiamato quando scade il timer.

Ho dimenticato di chiamare l'annullamento quindi non si ferma .Registrare con la chiamata di annullamento non fermarlo mai. riavviare Jboss 4.2.3 non fermarlo mai. Come posso fermare il timer EJB? Grazie per l'aiuto.

risposta

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

dopo tre anni, grazie mille :) – mebada

+0

Questo annulla tutti i timer, ma se consultare le "getTimers()" che ancora ci:/ – jmlv21104

+0

No! Questo annullerà solo i timer che hanno lo stesso nome di 'timerName'. –

2

È anche possibile annullare la distribuzione dell'applicazione, che "ucciderà" tutti i timer.

3

Ho avuto lo stesso problema, con il mio JBoss AS 6.1.
Dopo aver ucciso questo timer infinito (persistente) ho trovato la seguente soluzione per EVITARE questo problema in futuro:
Con JBoss AS 6.1 (EJB 3.1) è possibile creare timer automatici non persistenti, NON SOPRAVVIVONO un riavvio del server:

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

Un altro metodo è quello di creat ethe timer automatico (@Schedule) con l'attributo 'informazioni' e poi il check-in al servizio timer per i timer con le stesse informazioni e, se disponibile annullarlo:

@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

Prova l'annotazione @PreDestroy all'interno del bean in cui desideri chiudere.

Ad esempio:

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

Generalmente la risorsa de-allocazione è fatto qui.

0

Da EJB 3.1, ci sono nuovi metodi su TimerService che prendono uno TimerConfig invece di un payload Serializable. L'utilizzo di TimerConfig consente di rendere non persistente il valore Timer.

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