Nessun risultato. Prova con un altro termine.
Guide
Notizie
Software
Tutorial
  • Lezione 12 di 68
  • livello ninja
Indice lezioni

Timer Service: Timer automatici

Concludiamo il nostro approfondimento sulla schedulazione dei metodi con il Timer Service analizzando un esempio di Timer automatico.
Concludiamo il nostro approfondimento sulla schedulazione dei metodi con il Timer Service analizzando un esempio di Timer automatico.
Link copiato negli appunti

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

Ti consigliamo anche