2010-01-21 31 views
14

Soy nuevo en EJB 3. Yo uso el código siguiente para iniciar EJB sin fin 3 temporizador desplegarla posteriormente en JBoss 4.2.3¿Cómo detener el temporizador EJB 3 sin 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"); 

} 
} 

continuación, llamándolo

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

Funciona bien. Creé una clase de cliente que llama a un método que crea el temporizador y un método que se llama cuando el temporizador se agota.

Olvidé llamar cancelar y luego no se detiene .replegar con cancelar la llamada nunca detenerlo. reinicie Jboss 4.2.3 nunca lo detenga. ¿Cómo puedo detener el temporizador EJB? Gracias por ayudarme.

Respuesta

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

Después de tres años, gracias mucho :) – mebada

+0

Esto cancela todos los contadores de tiempo, pero si usted consulta a los "getTimers()" Todavía existe:/ – jmlv21104

+0

No! Esto cancelará solo los temporizadores que tengan el mismo nombre que 'timerName'. –

2

También puede anular la implementación de su aplicación, esto "matará" a todos los temporizadores.

3

Tuve el mismo problema con mi JBoss AS 6.1.
Después de eliminar estos temporizadores interminables (persistentes) encontré la siguiente solución para EVITAR este problema en el futuro:
Con JBoss AS 6.1 (EJB 3.1) es posible crear temporizadores automáticos no persistentes, NO SOBREVIVEN a reiniciar el servidor:

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

Otro método es para conformar ethe temporizador automático (@Schedule) con la 'info' atributo y después comprobar en el servicio de temporizador de temporizadores con la misma información y si es posible cancelarlo:

@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

Pruebe la anotación @PreDestroy dentro del bean donde desea cerrar.

Por ejemplo:

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

Generalmente el recurso de-asignación se hace aquí.

0

Desde EJB 3.1, existen nuevos métodos en TimerService que tienen un TimerConfig en lugar de una carga útil Serializable. El uso de TimerConfig permite que el Timer no sea persistente.

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