java - every - timer bean example
Cómo detener el temporizador EJB 3 sin fin? (6)
Soy nuevo en EJB 3. Utilizo el siguiente código para iniciar el temporizador EJB 3 sin fin y luego implementarlo en JBOSS 4.2.3
@Stateless
public class SimpleBean implements SimpleBeanRemote,TimerService {
@Resource
TimerService timerService;
private Timer timer ;
@Timeout
public void timeout(Timer timer) {
System.out.println("Hello EJB");
}
}
luego 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.
Me olvidé de cancelar y luego no se detiene. Reanudar con cancelar la llamada nunca detenerlo. reinicie Jboss 4.2.3 nunca lo detenga. ¿Cómo puedo detener el temporizador EJB? Gracias por ayudar.
Desde EJB 3.1, hay nuevos métodos en TimerService
que toman un TimerConfig
lugar de una carga Serializable
. Usar TimerConfig
permite hacer que el Timer
no sea persistente.
timerService.createIntervalTimer(10, 5000, new TimerConfig(null, false));
Otro método es crear el temporizador automático (@Schedule) con el atributo ''info'' y luego verificar el servicio del temporizador para temporizadores con la misma información y, si está disponible, 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
Prueba la anotación @PreDestroy
dentro del bean donde quieras cerrar.
Por ejemplo:
@PreDestroy
private void undeployTimer() {
//..
}
En general, la desasignación de recursos se hace aquí.
También puede anular la implementación de su aplicación, esto "matará" a todos los temporizadores.
Tuve el mismo problema con mi JBoss AS 6.1.
Después de matar 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 un reinicio del servidor:
@Schedule(minute=”*/10”, hour=”*”, persistent=false)
public void automaticTimeout () {
public void stop(String timerName) {
for(Object obj : timerService.getTimers()) {
Timer t = (Timer)obj;
if (t.getInfo().equals(timerName)) {
t.cancel();
}
}
}