Sei sulla pagina 1di 4

cosenonjavist e.it http://www.cosenonjaviste.

it/ejb3-stateless-vs-stateful-quale-e-la-differenza/
EJB3 Stateless vs Stateful, quale la differenza?

i
Rate This
La risposta alla domanda quale la dif f erenza f ra ejb statef ul e stateless? sembra evidente: gli
statef ul mantengono lo stato e possono essere usati per il classico carrello della spesa mentre gli
stateless, non avendo uno stato, possono essere usati per implementare dei servizi. Ma siamo sicuri che
la risposta cos semplice? Per quanto viene mantenuto lo stato di un ejb statef ul? Per la durata della
sessione web? Proviamo a f are un po di chiarezza in questo post.
Le annot at ion degli ejb3
Una delle novit della versione 3 degli ejb il supporto alle annotation per i session bean. Per def inire
un ejb necessario scrivere uninterf accia java e una classe che la implementa. Linterf accia pu essere
annotata con @local o @remote: nel primo caso il nostro ejb sar utilizzabile solo nella stessa jvm, nel
secondo anche da jvm diverse (e quindi anche da altri server o cluster). La possibilit di def inire ejb
remoti una delle f eature pi importanti ed molto utile nella costruzione di architetture complesse.
La classe di implementazione di un ejb pu essere annotata con @stateless o @stateful, vediamo le
dif f erenze nel dettaglio ma prima f acciamo un breve richiamo su come viene creato un ejb.
Il lookup jndi
Un ejb (cos come un bean di Spring) non pu essere istanziato a mano usando una new. Per ottenere
un ejb3 dobbiamo eseguire una lookup jndi, chiedendo allapplication server un nuovo oggetto. Il codice
per eseguire una lookup qualcosa di simile al seguente:
1 try {
2 Context ctx =new InitialContext();
3 MyEJBLocal audit = (MyEJBLocal) ctx.lookup("java:comp/env/audit");
4 }catch (NamingException e) {
5 throw new EJBException(e);
6 }
Da notare che purtroppo il nome da passare al metodo lookup non sempre unif orme nei vari
application server, per esempio cambia passando da JBoss a Websphere.
Il metodo lookup ritorna ovviamente un oggetto che implementa linterf accia ejb che abbiamo def inito, ma
tale oggetto non sar mai una istanza della nostra classe. Loggetto ritornato invece un proxy del
nostro oggetto che serve allapplication server per poter gestire i vari servizi messi a disposizione. Per
esempio nel caso in cui un metodo sia in transazione nel metodo del proxy sar presente un blocco
try/catch con allinterno la chiamata al nostro metodo preceduto da un beginTransaction e seguito da
un commit o da un rollback.
In realt non neanche cos semplice: non viene ritornato un proxy del nostro oggetto, ma un oggetto
stub che punta a un pool di proxy! Una rappresentazione schematica la seguente:
Questa separazione f ra stub e ejb
richiamato necessario per gli ejb
remoti, in questo caso il pool di ejb
su un server e gli stub sono
(probabilmente) su un altro. I due
server possono avere conf igurazioni
diverse (per esempio ci possono
essere datasource a database
diversi) quindi gli ejb devono
necessariamente eseguiti sul server in
cui sono def initi.
Ma quindi quale quest a
dif f erenza?
Dopo tutta questa spiegazione
torniamo allargomento di questo
post: quale la dif f erenza f ra ejb
statef ul e stateless? In entrambi i casi
eseguendo un lookup jndi viene
ritornato un oggetto stub e invocando
un metodo su questo oggetto viene
eseguito il corrispondente metodo su
un ejb preso dal pool. La dif f erenza principale proprio sulla scelta dellejb dal pool, se lejb statef ul si
ha la sicurezza che tutte le chiamate a metodi di uno stub generano chiamate sullo stesso ejb. In pratica nel
caso di ejb statef ul lo stub mantiene un rif erimento allejb utilizzato in modo da riusare sempre lo stesso
oggetto, eventuali dati memorizzati come campi delloggetto sono mantenuti f ra chiamate successive.
Per questo motivo un ejb statef ul non pu essere riusato: una volta f inito il proprio ciclo di vita viene
distrutto dallapplication server.
Se lejb stateless viene utilizzato il primo ejb libero nel pool. In questo caso il pool mantenuto
essenzialmente per motivi di perf ormance, semanticamente ogni volta che viene invocato un metodo su
uno stub di un ejb stateless potrebbe essere creato un nuovo ejb su cui invocare il metodo. Per evitare la
creazione di molti oggetti viene mantenuto un pool, quando viene invocato un metodo lejb viene rimosso
dal pool e alla f ine del metodo viene rimesso nel pool per essere utilizzato in f uturo.
Un ejb stateless ha un ciclo di vita diverso rispetto a una Servlet (o a un bean di Spring singleton). Una
Servlet creata una sola volta e lo stesso oggetto viene usato da pi thread in parallelo, per questo non
deve essere memorizzato niente nelle variabili di istanza di una servlet. Di un ejb stateless invece sono
mantenute pi istanze in contemporanea grazie al pool, ogni istanza viene usata sempre e solo da un
thread alla volta. Per questo eventuali variabili di istanze di un ejb possono essere usati allinterno dei
metodi, ovviamente tenendo conto del f atto che i dati saranno persi alla f ine del metodo.
Durat a dello st at o di un ejb st at ef ul
Ma quindi quale la durata dello stato di un ejb statef ul? Possono essere usati per creare un carrello di
un sito web di ecommerce? Dipende da dove viene memorizzato lo stub dellejb ritornato dalla chiamata
jndi. Nel caso in cui lo stub in una variabile locale di un metodo quando il metodo f inisce lo stub si perde
e un lookup jndi successivo comporta la creazione di un nuovo ejb. Nel caso in cui si voglia memorizzare
il carrello in un ejb statef ul necessario salvare il rif erimento allo stub nella sessione web. Ma quindi non
meglio memorizzare i dati del carrello direttamente nella sessione? Probabilmente s, visto che la
gestione degli ejb statef ul pi pesante dal punto vista computazionale.
Il carrello in un ejb statef ul pu essere molto utile se accediamo al nostro sistema ecommerce sia da un
sito web che da una applicazione desktop o da una applicazione mobile. In questo caso usando un ejb
statef ul possiamo scrivere la gestione del carrello una volta sola e usarlo nei vari ambienti, anche in
quelli in cui non abbiamo la sessione web.
Un esempio da provare
Per concludere vediamo un esempio interessante: creiamo un ejb con un metodo solo e mettiamo un log
(o un breakpoint se siamo in debug) nel costruttore dellejb e allinterno del metodo. Creiamo poi una
servlet che esegue due volte un lookup jndi e due chiamate al metodo. Il metodo della servlet pu essere
schematizzato cos:
1 MyEjb eb1 = eseguiLookup();
2 eb1.esegui();
3 eb1.esegui();
4 MyEjb eb2 = eseguiLookup();
5 eb2.esegui();
6 eb2.esegui();
Eseguendo questo codice quante volte viene invocato il costruttore dellejb nel caso che lejb sia def inito
con lannotation statef ul? La risposta corretta 2, ogni volta che si ef f ettua un lookup viene creato un
nuovo ejb. Contenendo uno stato gli ejb statef ul non vengono riciclati.
E nel caso di stateless quante volte viene invocato il costruttore? La risposta giusta non esiste! O
meglio dipende da quante chiamate in parallelo alla Servlet vengono ef f ettuate. Nel caso di una chiamata
unica viene creato un ejb unico che ogni volta viene messo nel pool e subito riestratto. Nel caso di molte
chiamate in parallelo questo codice potrebbe portare anche a 4 istanziazioni dellejb, dipende tutto dal
numero di ejb presenti nel pool al momento della chiamata al metodo.
Conclusioni
In questo post abbiamo visto nel dettaglio alcune caratteristiche degli ejb3. Come abbiamo visto non
stato cos semplice trovare la risposta a una domanda che poteva sembrare banale! Se avete altre
domande semplici come questa lasciate un commento e proveremo a rispondere!
About t he aut hor
Sono un Software Architect che si occupa di progettazione e sviluppo di applicazioni
web enterprise su piattaf orma J2EE.
Presso OmniaGroup ricopro il ruolo di Tech Leader nellambito di progetti di rich
internet application che utilizzano JSF (RichFaces), JPA(EclipseLink o Hibernate) ed
EJB3/Spring su application server IBM Websphere 7.0 e JBoss 7.
Da agosto 2009 sono un freelance android developer, ho rilasciato due
applicazioni nellAndroid Market: Apps Organizer e Folder Organizer.
Follow me on Twitter LinkedIn prof ile Google+