minutes example every ejemplo bean java timer jboss ejb-3.0

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(); } } }