giovedì 14 maggio 2009

EJBTimer

Gli EJB Timer  sono oggetti tipicamente creati da stateless o message-drive session bean (la creazione all'interno di uno statefull session bean genera IllegalStateException). Per creare un oggetto Timer è necessario seguire i seguenti passi:
  1. Ottenere un riferimento all'oggetto EJBContext (SessionContext e MessageDrivenContext rispettivamente per gli stateless e message-driven bean)
  2. Ottenere un riferimento a TimerService attraverso l'EJBContext del punto precedente
  3. 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
private SessionContext sessionCtx;
@Resource
private MessageDrivenContext messageDrivenCtx;


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();
TimerService timerService = messageDrivenCtx.getTimerService();

3. Creazione  del Timer:
Esistono due tipologie di Timer: ad azione singola e ad intervallo, a seconda delle esigenze

Calendar now = Calendar.getInstance();
Timer singleExpirationTimer = timerService.createTimer(now.getTimeInMillis() + (10 * 1000), null);
long oneWeek = (7 * 24 * 60 * 60 * 1000);
Timer intervalExpirationTimer = timerService.createTimer(firstMarch2007, oneWeek, null);


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)
I timer sono degli oggetti persistenti gestiti da un DBMS la cui creazione e cancellazione avvengono all'interno di una transazione, per cui se tale transazione va in roll-back anche la creazione o cancellazione viene annullata.
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: