Sei sulla pagina 1di 38

Progettazione del Software II

Enterprise Java Beans (EJB)

Enterprise Beans
Gli Enterprise Java Beans (EJBs) sono componenti scritti in Java che realizzano la logica di business (Application Layer) di una applicazione
La business logic il codice che realizza lobiettivo dellapplicazione. Ad esempio in una applicazione di e-Commerce, il metodo orderProduct pu essere usato da un client (Presentation Layer) per ordinare un prodotto.

Vivono in un EJB Container, un runtime environment nellApplication Server.


Il Container gestisce lintero ciclo di vita di un EJB e le sue invocazioni. Fornisce meccanismi ausiliari, come la transazionalit e la sicurezza, in modo trasparente ai client
Massimiliano de Leoni - Enterprise Java Beans 2

Benefici degli EJBs


Gli EJBs realizzati coerentemente con le specifiche J2EE possono essere dispiegati (to deploy) su differenti Application Server J2EE-Compliant Gli EJBs gestiscono la business logic in modo trasparente ai client. Quindi i client possono essere pi leggeri (non fat clients), un aspetto importante per quei client eseguiti su low-profile devices (es. PDA, SmartPhone, PC poco potenti, ecc...). Gli EJBs sono portabili e pi EJBs possono essere assemblati a formare di nuovi

Massimiliano de Leoni - Enterprise Java Beans

Tipi di Enterprise Beans


Tipo di Enterprise Bean
Session Beans

Uso
Rappresentano le sessioni di interazione con i client. Sono transienti: il loro stato non viene memorizzato in modo persiste in un database o simili. Rappresentano gli oggetti di business dellapplicazione. Sono memorizzati in modo persistente. Spesso, unistanza di Entity Bean corrisponde ad una tupla di un DB. Rimangono in ascolto su un topic/coda JMS e si attivano quando un messaggio inviato a quel topic/coda .
4

Entity Beans

Message-Driven Beans

Massimiliano de Leoni - Enterprise Java Beans

Interazione tra i Bean / 1


Application Server

Swing-based Application

Inter. Sincrona

Session Bean

Entity Bean

Inter. Asincrona

Storage
Message Bean
Segnalazione

JMS
Massimiliano de Leoni - Enterprise Java Beans

Interazione tra i Bean / 2


Application Server
Inter. Sincrona

Session Bean

Entity Bean

JSP / Servlet Container (Tomcat)


Inter. Asincrona

Storage
Message Bean
Segnalazione

Internet Browser

JMS

Massimiliano de Leoni - Enterprise Java Beans

Session Beans
Un Session Bean rappresenta un singolo client nellApplication Server. Il client accede al Business Layer di una applicazione invocando i metodi di Session Beans. I Session Beans nascondono la complessit dietro a semplici chiamate Dal punto di vista del client, ogni Session Bean associato ad uno ed uno solo Client
Lo stato dellinterazione con un client (lo stato Session Bean) transiente: quando termina la sessione a cui associato, un Session Bean viene distrutto, insieme con lo stato. Una sessione termina quando lutente esplicitamente la rimuove oppure per un periodo di attivit superiore ad un tempo prefissato

Esistono due tipi di Session Beans: stateless e stateful


Massimiliano de Leoni - Enterprise Java Beans 7

Stateless Session Beans


Non mantengono lo stato conversazionale per il client con cui interagiscono: qualsiasi informazione di stato associata con un bean stateless locale al metodo invocato e non al Session Bean Poich non previsto uno stato conversazione, il container pu assegnare un qualsiasi session EJB stateless gi esiste a qualsiasi client
Il Container pu perfino associare lo stesso Stateless Bean a pi client per risparmiare memoria. Questa politica di allocazione dei Stateless Bean dipende dallimplementazione del EJB Container ed trasparente ai client che credono di avere un stateless session bean dedicato.

Quindi, sono pi efficienti dei fratelli stateful e sono utilizzati per ottenere elevata scalabilit
Massimiliano de Leoni - Enterprise Java Beans 8

Stateful Session Beans


Contengono variabili di istanza che rappresentano lo stato conversazionale della sessione del client. Per stato conversazionale ci si riferisce alla comunicazione fra il client e il bean stateful.
Lo stato conversazionale (le variabili di istanza) modificato dalle successive invocazioni di metodi sul Bean ed generalmente perso quando il Bean viene distrutto

Ogni Stateful Session Bean associato sempre ad un solo client. Per esempio, un carrello della spesa un candidato EJB Session Stateful
Linvocazione ad opportuni metodi add permettono di aggiungere oggetti al carrello e un metodo completeOrder chiude lordine, invocando un Entity Bean per la memorizzazione dellordine.
Massimiliano de Leoni - Enterprise Java Beans 9

Creazione di Session Bean Stateless : Remote Interface


1. Scrivere linterfaccia remota che descrive i metodi implementati dal Bean per fornire il servizio specifico.
una interfaccia che eredita dallinterfaccia javax.ejb.EJBObject public interface Crypt extends javax.ejb.EJBObject { String crypt(String origine,int key) throws java.rmi.RemoteException; String decrypt(String criptata,int key) throws java.rmi.RemoteException; }

Massimiliano de Leoni - Enterprise Java Beans

10

Creazione di Session Bean Stateless : Implementazione


2. Scrivere la classe che fornisce limplementazione del servizio, cio del Bean.
una classe che implementa linterfaccia javax.ejb.SessionBean Tale interfaccia definisce dei metodi obbligatori che i client non possono usare ma sono invocati dal Container per allertare il bean di particolari eventi (ad esempio alla creazione del Bean)

public class CryptBean implements javax.ejb.SessionBean { public void ejbCreate() { System.out.println(Creazione di un CryptBean);} public void ejbRemove() {System.out.println(Rimozione);} public void ejbActivate() {} public void ejbPassivate() {} public void setSessionContext(javax.ejb.SessionContext ctx) {} ...
11

Metodi obbligatori

Massimiliano de Leoni - Enterprise Java Beans

Creazione di Session Bean Stateless : Implementazione


Metodi della logica di business
} ... public String crypt(String origine,int key) { char dest[]=new char[origine.length()]; for(int i=0;i<origine.length();i++) dest[i]=(char)(((int)origine.charAt(i))+key); return(new String(dest)); } public String decrypt(String criptata,int key) { char dest[]=new char[criptata.length()]; for(int i=0;i<criptata.length();i++) dest[i]=(char)(((int)criptata.charAt(i))-key); return(new String(dest)); }
Massimiliano de Leoni - Enterprise Java Beans 12

Ciclo di vita di Session Bean Stateless I metodi ejbActivate() e ejbPassivate() di un


Quando il client richiede la creazione del Session Bean Stateless, lEJB Container pu:
a. Creare un nuovo EJB, aggiungere al pool dei EJB Stateless di quel dato tipo. Ci comporta anche linvocazione dei metodi 1 e 2. Da questo punto in poi, il bean nello stato Ready e il client pu invocare i business methods Restituire un EJB Stateless del tipo che esiste gi Ready dal pool.

Session Bean Stateless possono essere definiti anche vuoti perch mai chiamati

Does not exist


1. setSessionContext 2. ejbCreate n. ejbRemove

b.

Ready
3..(n-1).Invocazione dei metodi della logica di business

Quando la sessione termina, il Container pu:


a. b. Eliminare lEJB dal pool, non prima di invocare ejbRemove Non effettuare alcuna azione

Massimiliano de Leoni - Enterprise Java Beans

13

Creazione di Session Bean Stateless : Home Interface


3. Scrivere linterfaccia home remota usata per fornisce servizi di factory. I client che vogliono usare EJB devono usare questa interfaccia per crearli.
una interfaccia che eredita dallinterfaccia javax.ejb.EJBHome Il metodo create definito nellinterfaccia home quello che verr usato per creare un EJB Il metodo create deve essere definito in modo tale che rilanci almeno le eccezioni di tipo RemoteException e CreateException public interface CryptHome extends javax.ejb.EJBHome { Crypt create() throws java.rmi.RemoteException, javax.ejb.CreateException; }
Massimiliano de Leoni - Enterprise Java Beans 14

Compilazione di un EJB
La compilazione delle interfacce remota ed home e dellimplementazione richiede le classi definite nel jar: {dir. inst}\client\jboss-j2ee.jar

Massimiliano de Leoni - Enterprise Java Beans

15

Packaging di un Session Bean Stateless


Per poter fare il deploy del Session su JBoss occorre creare un file JAR oppure una directory con estensione .jar (esempio crypt.jar) con la seguente struttura:

Root
META-INF Directory
I file .class che compongono lo EJB

ejb-jar.xml

jboss.xml

Un file XML che specifica le informazioni sul bean (Deployment descriptor)

Un file XML che specifica le informazioni per il look-up con JNDI

Include anche tutte le eventuali classi non standard che sono usate
16

Massimiliano de Leoni - Enterprise Java Beans

Deployment descriptor
<?xml version="1.0" encoding="UTF-8"?>

Il nome dellEJB per uso interno

<!DOCTYPE ejb-jar PUBLIC ... Il nome dellinterfaccia home <ejb-jar> <enterprise-beans> <session> Il nome dellinterfaccia remote <ejb-name>ConvertEJB</ejb-name> <home>CryptHome</home> La classe che implementa il Session <remote>Crypt</remote> Bean <ejb-class>CryptBean</ejb-class> <session-type>Stateless</session-type> Il tipo di Session: <transaction-type>Container</transaction-type> Stateful o Stateless </session> </enterprise-beans> Il tipo di transizione: </ejb-jar>

ignorare! lasciare cos come !

Massimiliano de Leoni - Enterprise Java Beans

17

Il file jboss.xml
<?xml version="1.0" encoding="UTF-8" ?> <jboss> <enterprise-beans> <session> <ejb-name>ConvertEJB</ejb-name> <jndi-name>Convert</jndi-name> </session> </enterprise-beans> </jboss> Il nome per il look-up JNDI Il nome dellEJB per uso interno (lo stesso definito nel Deployment Descriptor)

Massimiliano de Leoni - Enterprise Java Beans

18

Deploy del Session Bean


Per realizzare il deploy copiare la cartella o il file jar convert.jar nella directory {InstDir}\server\default\deploy Se tutto va ha buon fine nel Prompt di Comandi nel quale stato avviato JBoss si vedr:

Massimiliano de Leoni - Enterprise Java Beans

19

Scrittura del client / 1


Il codice del client tipicamente fa le seguenti cose:
1. 2. 3. 4. Effettua il look-up per ottenere un riferimento allinterfaccia home Usa linterfaccia home per creare un oggetto EJB Chiama i metodi di business sulloggetto EJB (Eventualmente) Rimuove loggetto EJB

Per potersi compilare ed eseguire, il client richiede:


1. Le librerie client dellApplication Server che risiedono nel file:
{dir. inst}\client\jbossall-client.jar

2. Una copia dellinterfaccia home e remota:


Crypt.class e CryptHome.class

Supponendo che Crypt.class e CryptHome.class siano copiate nella stessa directory del client, il CLASSPATH potr essere ad esempio:
C:\Programmi\jboss-4.0.3SP1\client\jboss-all-client.jar;. 20

Massimiliano de Leoni - Enterprise Java Beans

Scrittura del client / 2


public static void main(String args[]) { Properties prop = new Properties(); prop.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory"); prop.put(Context.URL_PKG_PREFIXES, "org.jnp.interfaces"); prop.put(Context.PROVIDER_URL, "localhost"); Context ctx = new InitialContext(prop); Object obj = ctx.lookup(Convert"); ConvertHome home = (ConvertHome) javax.rmi.PortableRemoteObject. narrow(obj,ConvertHome.class); Crypt convert = home.create(); String cryptArgs0=convert.crypt(args[0],3); System.out.println(La stringa criptata : + cryptArgs0); }

Informazioni necessarie per inizializzare il Context JNDI Init del Context JNDI Acquisizione del riferimento allinterfaccia Home Creazione del Session Bean richiesto

Il nome JNDI del EJB


21

Massimiliano de Leoni - Enterprise Java Beans

Le interfacce locali
Le interfaccie home e remote realizzano invocazioni, passaggio dei parametri e dei valori di ritorno attraverso la serializzazione e il Marshalling
Lo stesso vale anche nel caso di client locali eseguiti nella stessa JVM (ad esempio una servlet, una JSP o un altro EJB), sebbene non sia necessario

La local interface e la local home interface sono versioni pi efficienti delle interfacce remote e home.
In questo modo, le chiamate ad EJB nella stessa JVM non necessitano di stub/skeleton, marshalling, ecc...

public interface CryptLocal extends javax.ejb.EJBLocalObject { String crypt(String origine, int key); String decrypt(String criptata, int key); } Massimiliano de Leoni - Enterprise Java Beans

public interface CryptLocalHome extends javax.ejb.EJBLocalHome { Crypt create(); }

22

Ciclo di vita di Session Bean Stateful / 1


Il client inizia il ciclo, invocando il metodo create Quando il client richiede la creazione di Session Bean Stateless, lEJB Container crea un nuovo Session Stateful, usato solo da quel client, ed invoca sulla nuova istanza i metodi 2 e 3. LEJB ora Ready per ricevere invocazioni remote.

Does not exist


1. create 2. setSessionContext 3. ejbCreate n. ejbRemove ejbActivate

Ready
ejbPassivate 4..(n-1).Invocazione dei metodi della logica di business

Passive

Massimiliano de Leoni - Enterprise Java Beans

23

Ciclo di vita di Session Bean Stateful / 2


Mentre un bean nello stato Ready, lEJB Container pu decidere di disattivare il bean (Passivate), facendo lo swap in memoria secondaria per risparmiare memoria
Il Container invoca il metodo ejbPassivate immediatamente prima di disattivarlo. Poi passa nello stato Passive

Does not exist


1. create 2. setSessionContext 3. ejbCreate n. ejbRemove ejbActivate

Ready
ejbPassivate 4..(n-1).Invocazione dei metodi della logica di business

Passive

Se un client invoca un metodo sul Bean mentre passivo, il Container lo riattiva, chiama il metodo ejbActivate e lo porta nello stato Ready per eseguire il metodo
Massimiliano de Leoni - Enterprise Java Beans

24

Ciclo di vita di Session Bean Stateful / 3


Alla fine del ciclo, quando il client termina la sessione esplicitamente o scade il timeout, il Container distrugge il Bean, non prima di chiamare ejbRemove Nessuno di questi metodi, tranne create, invocato dal Bean: il Container che li invoca!!

Does not exist


1. create 2. setSessionContext 3. ejbCreate n. ejbRemove ejbActivate

Ready
ejbPassivate 4..(n-1).Invocazione dei metodi della logica di business

Passive

Massimiliano de Leoni - Enterprise Java Beans

25

Overloading di create
Nel caso Stateful, possibile definire nellinterfaccia home pi metodi create con diversi parametri a patto che limplementazione definisca altrettanti metodi ejbCreate con gli stessi parametri Per ogni invocazione di create del Client, il Container alloca un nuovo EJB e lo inizializza invocando il metodo ejbCreate corrispondente

public interface CryptHome extends EJBHome { Crypt create() throws ... ; Crypt create(String user, String pass) ... ; } public class CryptBean implements SessionBean { public void ejbCreate() { ... } public void ejbCreate(String u, String p) {...} } 26

Massimiliano de Leoni - Enterprise Java Beans

Message-Driven Beans/1
Un Message-Driven Bean un componente EJB che consuma messaggi da una queue/topic inviati da un valido client JMS Un MDB disaccoppiato da qualsiasi client che invia messaggi JMS
Un client non pu accedere al Bean attraverso alcuna interfaccia. Il MDB non ha home, local o remote interfaces. Un MDB non ritorna valori n rilancia mai eccezioni ai client I MDBs sono stateless (non c stato conversazionale)

Un MDB una classe che implementa le interfacce java.jms.MessageListener e javax.ejb.MessageDrivenBeans


Massimiliano de Leoni - Enterprise Java Beans 27

Message-Driven Beans/2
Quando viene fatto il deploy di un MDB, su esso vengono chiamati i metodi setMessageDrivenContext e ejbCreate. A questo punto il MDB pronto a ricevere messaggi Da questo punto in poi, per ogni messaggio consumabile dal MDB il metodo onMessage(Message) viene invocato. Il Container responsabile di serializzare i messaggi: ogni MDB pu processare al pi un solo messaggio alla volta Quando viene fatto lundeploy di un MDB, il metodo ejbRemove viene invocato. Does not

public interface javax.jms.MessageListener { void onMessage(Message message) } public interface javax.ejb.MessageDrivenBean { void ejbCreate(); void ejbRemove(); void setMessageDrivenContext (MessageDrivenContext ctx) }

exist
1. setMessageDrivenContext 2. ejbCreate n. ejbRemove

Ready
3..(n-1). onMessage

Massimiliano de Leoni - Enterprise Java Beans

28

Esempio
public class MessaggioBean implements MessageDrivenBean, MessageListener { public void ejbCreate() { ... } public void ejbRemove() { ... } public void setMessageDrivenContext (javax.ejb.MessageDrivenContext ctx){ ... } public void onMessage(Message m) { if (m instanceOf TextMessage) { try { TextMessage tm = (TextMessage)m; String text=tm.getText(); System.out.print(Ricevuto messaggio:); System.out.println(text); } catch(JMSException e) {e.printStackTrace();} } } }
Massimiliano de Leoni - Enterprise Java Beans

29

Compilazione e Deploy
La Compilazione e il deploy di un MDB necessita delle stesse classi J2EE di un SessionBean (quindi il CLASSPATH lo stesso) La struttura del JAR/directory la medesima
Necessit di definire un ejb-jar.xml e di un jboss.xml

Il file jboss.xml nel caso MDB si occupa di associare il componente alla coda/topic su cui in ascolto:
<jboss> <enterprise-beans> <message-driven> <ejb-name>SimpleMessageBean</ejb-name> <destination-jndi-name> miaCoda </destination-jndi-name> </message-driven> Associazione del MDB alla coda con </enterprise-beans> JNDI name miaCoda </jboss>

Massimiliano de Leoni - Enterprise Java Beans

30

Deployment descriptor
<?xml version="1.0" encoding="UTF-8"?>

Il nome dellEJB per uso interno

<!DOCTYPE ejb-jar PUBLIC ... <ejb-jar> <enterprise-beans> <message-driven> <ejb-name>SimpleMessageBean</ejb-name> <ejb-class>MessaggioBean</ejb-class> La classe che implementa il <message-driven-destination> Message-Driven Bean <destination-type> javax.jms.Topic Il tipo di Destination su cui </destination-type> in ascolto il MDB: Topic </message-driven-destination> o Queue <transaction-type>Container</transaction-type> </message-driven> </enterprise-beans> </ejb-jar>

Massimiliano de Leoni - Enterprise Java Beans

31

Message Selector
Il Deployment descriptor permette anche di definire dei filtri di Message Selection. I Message Selector sono molto potenti perch permettono di aumentare le performance riducendo la consegna di messaggi non interessanti. Si impostano aggiungendo un elemento messageselector XML come sottoelemento di message-driven
<message-driven> ... <message-selector> JMSType=Log AND LogLevel=1 </message-selector> Qualsiasi condizione pu essere specificata </ message-driven> attraverso una sintassi SQL-Like.
Ovviamente il client che ha prodotto il messaggio deve definire nellheader i campi corrispondenti opportuni Massimiliano de Leoni - Enterprise Java Beans 32

Entity Beans / 1
Rappresenta un oggetto del business conservato in un meccanismo di memoria persistente [database relazionale] (es., consumatori, ordini, e prodotti) tipicamente un entity bean corrisponde ad una tabella in un database relazionale, ed ogni istanza del bean corrisponde ad una riga nella tabella le differenze principali con i session beans
sono persistenti sono condivisi hanno chiavi primarie per identificarli possono essere legati ad altri beans da relazioni

Massimiliano de Leoni - Enterprise Java Beans

33

Entity Beans / 2
Persistenza
Due tipi
Gestita dal bean
Il codice del bean contiene le chiamate al database

Gestita dal contenitore


il container EJB genera automaticamente le chiamate al database

Condivisi
Possono essere condivisi fra vari clienti Poich diversi clienti possono volere cambiare gli stessi dati, importante che siano dotati di un meccanismo di transazioni In genere, il contenitore fornisce la gestione delle transazioni La definizione dei limiti delle transazioni viene data nel deployment descriptor del bean
Massimiliano de Leoni - Enterprise Java Beans 34

Entity Beans / 3
Chiave primaria
Ogni entity bean ha un unico identificatore (es., un entity bean consumatore pu essere identificato da un codice) La chiave primaria permette al cliente di localizzare un particolare entity bean

Relazioni
Come in un database relazionale, gli entity bean possono essere collegati da relazioni Se la persistenza
Gestita dal bean
Il codice del bean deve gestire le relazioni

Gestita dal contenitore


Il container ci pensa lui Massimiliano de Leoni - Enterprise Java Beans 35

Persistenza gestita dal container / 1


Il container EJB gestisce tutti gli accessi al database necessari; il codice del bean non contiene istruzioni SQL
quindi, il bean non legato ad uno specifico database, pertanto se il bean riinstallato su un altro server, non occorre modificare o ricompilare il codice dal bean, il bean molti pi portabile

per generare gli accessi al database il container necessita delle informazioni data dallo schema astratto dellentity bean
parte del deployment descriptor del bean, e definisce i campi persistenti del bean e le sue relazioni con altri entity bean astratto per distinguerlo dallo schema concreto del/dei database a cui il bean sar collegato

Massimiliano de Leoni - Enterprise Java Beans

36

Persistenza gestita dal container / 2


schema astratto dellentity bean (cont.)
si specifica il nome di uno schema astratto nel deployment descriptor questo nome viene usato in query scritte in EJB QL (Enterprise JavaBeans Query Language) occorre definire una query EJB QL per ogni finder method (eccetto findByPrimaryKey) la query EJB QL determina la query che eseguita dal container EJB quando il finder method invocato

campi persistenti
sono immagazzinati nel sottostante database collettivamente costituiscono lo stato del bean a runtime, il container EJB automaticamente sincronizza questo stato con lo stato del database durante il deployment, il container tipicamente mappa lentity bean su una tabella di un database e mappa i campi persistenti sulle colonne di tale tabella

Massimiliano de Leoni - Enterprise Java Beans

37

Persistenza gestita dal container / 3


campo relazione
come una chiave esterna in una tabella di un database, identifica il bean collegato dalla relazione come i campi persistenti, virtuale ed definita nella classe del bean con gli access method

le relazioni gestite dal container


hanno molteplicit
One-to-one One-to-many Many-to-one Many-to-many sono unidirezionali (un solo campo relazione, nel bean di partenza) bidirezionali (due campi relazione, in entrambi i bean)
Massimiliano de Leoni - Enterprise Java Beans 38