Cuando se utiliza un método timeout anotado con @timeout, la especificación nos dice que el método debe retornar void y sólo recibir como parámetro un objeto javax.ejb.TimerService o en su defecto, no debe recibir parámetros.
Para registrar un timeout podemos hacerlo de la siguiente manera (de acuerdo a la tercera forma):
createTimer(long duracionInicial, long duracionIntervalo, serializable objetoAsociado);
Así que puedes crearlo así:
@Resource TimerService timer; // opcional, aquí inyectamos al objeto TimerService
public void doSomething(Objeto obj) {
timer.createTimer(15*60*1000, 15*60*1000, obj);
}
Lo que se ha hecho es crear un TimerService cuya primera véz de ejecución será un timeout de 15 minutos y el intérvalo entre ejecuciones será de 15 minutos también. Así mismo, hemos asociado al TimerService un objeto que debe implementar Serializable.
Bien, ahora el método que se ejecutará luego del registro del TimerService será:
@timeout doOtherThing
(Timer timer
) { Objeto obj = (Objeto) timer.getInfo();
// hacer otras cosas...
}
El método getInfo() retorna el objeto asociado al TimerService. Si al momento de crear el TimerService en lugar de un objeto se declara null, el valor devuelto será null también.
Ahora, si estoy en lo correcto, podemos cancelar un TimerService. Por ejemplo si en lugar de un objeto le hemos asociado un nombre, podríamos detenerlo así:
public void stop
(String timerName
) { for(Object obj
: timerService.
getTimers()) { if (t.getInfo().equals(timerName)) {
t.cancel();
}
}
}
Pero si no hemos asociado un nombre, podemos detenerlos iterando el conjunto de TimerService:
public void stop() {
List<Timer> timers = timerService.getTimers();
if (timers != null)
{
t.cancel();
}
}
}
Salu2.
PD: Usa las etiquetas Geshi para colocar código.
Muchas gracias por tu ayuda, pero tengo algunas dudas de implementación.
Si quisiera controlar el timeout de un método como el anterior, ¿sería algo así?
import java.io.Serializable;
import javax.annotation.Resource;
import javax.ejb.Stateless;
import javax.ejb.Timeout;
import javax.ejb.Timer;
import javax.ejb.TimerService;
@Stateless
public class TimeoutRespuesta {
@Resource TimerService timer;
public void doSomething
(Object obj
) { }
@Timeout
void doOtherThing
(Timer timer
) {
}
public int sum(int i){
return i;
}
}
import timeout.TimeoutRespuesta;
public class Suma {
public static void main
(String[] args
) {
int res = (new TimeoutRespuesta()).sum(sumar(1,2));
}
public static int sumar(int a, int b){
return a+b;
}
}
Gracias.