I Timer Automatici vengono creati in fase di deploy grazie alle annotazioni @Schedule
e @Schedules
aggiunte sui metodi
del bean che intendiamo utilizzare come task di scheduling. Implementiamo quindi la versione automatica dello Scheduler.
Come fatto in precedenza
realizziamo l'interfaccia contratto e le interfacce local
e remote
che la estendono:
package it.html.progetto1.ejb32;
import javax.ejb.Timer;
public interface AutomaticScheduler {
void singleTask(Timer timer);
void intervalTask(Timer timer);
void calendarTask(Timer timer);
void removeTimers();
}
package it.html.progetto1.ejb32;
import javax.ejb.Local;
@Local
public interface AutomaticSchedulerLocal extends AutomaticScheduler {}
package it.html.progetto1.ejb32;
import javax.ejb.Remote;
@Remote
public interface AutomaticSchedulerRemote extends AutomaticScheduler {}
In questo caso i metodi dell'interfaccia non solo creano oggetti Timer ma rappresentano metodi registrati con uno specifico Timer per essere eseguiti
allo scadere del Timer stesso. La classe bean in questo caso è la seguente:
package it.html.progetto1.ejb32;
import java.util.Collection;
import javax.annotation.Resource;
import javax.ejb.Schedule;
import javax.ejb.Singleton;
import javax.ejb.Timer;
import javax.ejb.TimerService;
@Singleton
public class AutomaticSchedulerBean implements AutomaticSchedulerLocal, AutomaticSchedulerRemote {
@Resource
private TimerService timerService;
@Schedule(minute="30", hour="*")
public void singleTask(Timer timer) {
System.out.println("Timer single task dopo 30 minuti ogni ora");
}
@Schedule(minute="*", hour="*")
public void intervalTask(Timer timer) {
System.out.println("Timer single task ad intervali di un minuto ogni ora");
}
@Schedule(dayOfMonth="1", month="*", year="*",hour="0", minute="0", second="0")
public void calendarTask(Timer timer) {
System.out.println("Timer ogni primo del mese");
}
@Override
public void removeTimers() {
/*Ejb 3.2 nuova caratteristica*/
Collection<Timer> timers = timerService.getAllTimers();
for(Timer t : timers){
t.cancel();
}
}
}
Come possiamo notare dal codice della classe, l'annotation @Schedule
crea un Timer per ciascun metodo sul quale viene posta.
Il metodo verrà poi eseguito allo scadere del Timer stesso (evento di timeout). Sull'annotation @Schedule
utilizziamo gli attributi del calendario visti ad inizio capitolo.
Non possiamo definire un caso
di test JUnit per l'attivazione di un Timer automatico in quanto creato in fase di deploy, Possiamo però definire un metodo di test
per la cancellazione dei Timer automatici creati:
@Test
public void testRemoveAutomaticTimers() throws NamingException {
automaticSchedulerRemote = (AutomaticSchedulerRemote) namingContext.lookup(AUTOMATIC_TIMER_SINGLETON_REMOTE_JNDI_NAME);
automaticSchedulerRemote.removeTimers();
}