- Ottenere un riferimento all'oggetto EJBContext (SessionContext e MessageDrivenContext rispettivamente per gli stateless e message-driven bean)
- Ottenere un riferimento a TimerService attraverso l'EJBContext del punto precedente
- Creare il Timer attraverso TimerService
1. Ottenere un riferimento all'EJBContext:
Le specifiche EJB 3.0 permettono di ottenere tale riferimento attraverso la tecnica della Dependency Injection
@Resource |
Quando il container crea un' istanza di un enterprise bean processa tutte le relative annotazioni ed esegue le Dependency Injection. Quindi il risultato è che i riferimenti di sessionCtx e messageDrivenCtx sono popolati con un istanza rispettivamente di SessionContext e MessageDrivenContext.
2. Ottenre un riferimento a TimerService:
Questa è un'operazione relativamente semplice e intuitiva
TimerService timerService = sessionCtx.getTimerService(); |
3. Creazione del Timer:
Esistono due tipologie di Timer: ad azione singola e ad intervallo, a seconda delle esigenze
Calendar now = Calendar.getInstance(); |
Un timer può essere eliminato nei seguenit casi:
- invocando esplicitamente il metodo di eliminazione: timer.cancel();
- quando il tempo di scedulazione scade (per i Timer ad azione singola)
La tabella di gestione dei timer deve necessariamente definire una tabella EJB__TIMER__TBL (tipicamente Glassfish, l'application server di riferimento della SUN, usa un DBMS Derby) definita dal seguente listato SQL:
CREATE TABLE EJB__TIMER__TBL ( CREATIONTIMERAW BIGINT NOT NULL, BLOB BLOB(2G) , TIMERID VARCHAR(255) NOT NULL, CONTAINERID BIGINT NOT NULL, OWNERID VARCHAR(255) NOT NULL, STATE INTEGER NOT NULL, PKHASHCODE INTEGER NOT NULL, INTERVALDURATION BIGINT NOT NULL, INITIALEXPIRATIONRAW BIGINT NOT NULL, LASTEXPIRATIONRAW BIGINT NOT NULL, CONSTRAINT PK_EJB__TIMER__TBL PRIMARY KEY (TIMERID) ) ; |
Può essere necessario tuttavia definire un database su un altro DBMS, per esempio MySQL, quando si vuole gestire uno stesso timer da parte di due o piu Application Server che operano all'interno di un cluster.
Per fare cio è necessario:
- creare un connection pool (mysqltimerpool) che faccia riferimento al database creato su MySQL
- creare una risorsa JDBC (mysqltimer) relativa al connection pool del punto precedente
- istruire il container circa la risorsa JDBC da usare per la gestione del Timer Service
http://www.javabeat.net/articles/3-ejb-30-timer-services-an-overview-2.html
Nessun commento:
Posta un commento