Enterprise JavaBeans
De Enterprise JavaBeans specificatie is één van de Java APIs in de J2EE standaard. EJBs zijn bedoeld om in een meer-lagen model de zogenaamde business logica te bevatten.
EJBs bieden de volgende mogelijkheden:
- communicatie met andere componenten via CORBA
- persistentie
- transacties
- parallelle uitvoering
- gebruik maken van Java Messaging Service
- gebruik van naming en directory services (JNDI)
- beveiliging
- in gebruik nemen van componenten in een EJB container in een J2EE applicatie server
Verder definieert de EJB specificatie de rollen die de EJB container en de EJBs spelen. Ook wordt beschreven hoe EJBs in gebruik worden genomen in de container. De plaats van EJB in de gelaagde J2EE architectuur is als volgt:
cliënt laag: web browser/HTML pagina's web laag: Servlets/JSPs business logica: EJB
Typen EJBs
EJBs zijn te onderscheiden in 3 types:
- session beans (stateless of stateful)
- entity beans
- message driven beans
stateless session bean
Een stateless session bean is een gedistribueerd object dat geen status bijhoudt en dus door meerdere clients gebruikt kan worden.
stateful session bean
Een stateful session bean is een gedistribueerd object dat status bijhoudt tussen aanroepen. De EJB container associeert een instantie van stateful session bean met één bepaalde cliënt. Voor elke cliënt die gebruik maakt van de J2EE applicatie wordt dus een stateful session bean geïnstantieerd op het moment dat deze nodig is.
entity beans
Een entity bean is een object met een persistente status. Deze status kan door de bean zelf (Bean Managed Persistency of BMP) of door de container (Container Managed Persistency) worden vastgelegd.
message driven beans
Een message driven bean is een object dat boodschappen ('messages') van een message queue verwerkt.
EJB techniek
EJBs worden gebruikt in een EJB container in een applicatie server. De EJB specificatie beschrijft hoe een EJB samenwerkt met een container en hoe een cliënt met de combinatie van de EJB container en de EJB samenwerkt.
Elke EJB bestaat uit een Java implementatie class en twee Java [[interface}interfaces]]. De EJB container instantieert objecten van de de implementatie class om de EJB implementatie te leveren. De twee interfaces worden gebruikt door de cliënt die de EJB aanroept. Dit kan een 'echte' cliënt zijn, maar ook een andere EJB. De twee interfaces, de home en de remote interface, specificeren de methodes van de EJB die aanroepbaar zijn door de cliënt.
Deze methodes worden verdeeld in twee groepen:
- methodes die niet gekoppeld zijn aan een specifieke instantie van de EJB, bijvoorbeeld de methodes om een EJB te creëren of om een bestaande EJB te vinden. Deze worden gedefinieerd in de home interface.
- methodes voor een specifieke instantie van een EJB. Deze worden in de remote interface geplaatst.
Omdat deze twee interfaces alleen maar interfaces zijn en dus zelf geen implementatie bevatten moet de EJB container implementatie classes genereren die als proxy in de cliënt kunnen worden gebruikt. De cliënt code roept een methode op de proxy aan die vervolgens de argumenten naar de EJB server stuurt. Deze proxies gebruiken Java RMI om met de EJB server te communiceren.
De server roept vervolgens een methode op een instantie van een EJB in de container. Deze methode correspondeert met de methode die op de proxy werd aangeroepen.
Home Interface
Zoals hierboven opgemerkt bevat de home interface de methoden die de cliënts in staat stellen om bepaalde class methoden aan te roepen, dat wil zeggen methoden die niet geassocieerd zijn met een bepaalde instantie van een class. De EJB standaard beperkte de functionaliteit van deze methodes tot het creëren van een EJB of het vinden van een EJB als deze een entity bean is. Sinds de EJB 2.0 specificatie is er meer functionaliteit toegestaan dan creatie, verwijderen en vinden.
Remote Interface
De remote interface definieert de methodes die op een instantie van een EJB kunnen worden aangeroepen. Over het algemeen zullen dit de methodes zijn die de echte functionaliteit van een EJB implementeren.
EJB implementatie class
De implementatie class wordt door de programmeur geschreven. Deze class implementeert de business logica (of bevat data ten behoeve van business logica in andere classes). Deze class implementeert altijd de methodes van de remote interface en mogelijk methodes van de home interface.
Overeenkomsten tussen interface methods en implementatie methods
De aanroep van een method van de home interface wordt door de EJB container doorgestuurd naar een corresponderende methode op de implementatie class, voorafgegaan door een 'ejb' voorvoegsel. De eerste letter van de home interface methode wordt hierbij in een hoofdletter vertaald (dit is in overeenstemming met de richtlijnen voor namen van methods zoals die door Sun worden beschreven). Uiteraard moet de implementatie methode exact dezelfde argumenten accepteren als de methode van de home interface.
Aanroepen van methodes op de remote interface worden door de EJB container doorgegeven aan de corresponderende implementatie method, waarbij de naam en argumenten precies hetzelfde zijn.
Communicatie met andere componenten
De EJB specificatie eist dat EJB containers toegang tot EJBs mogelijk maken via RMI-IIOP. Dit maakt EJBs toegankelijk vanuit elke CORBA applicatie.
Persistentie
EJB containers moeten zowel CMP als BMP ondersteunen.
Transacties
EJB containers moeten container en bean managed transactions ondersteunen. Container managed transactions worden beschreven in een declaratieve syntax in de deployment descriptor.
Boodschappen
JMS wordt gebruikt om asynchroon boodschappen uit te wisselen tussen componenten. Dit maakt het ook mogelijk om een J2EE applicatie via een message queue (bijvoorbeeld IBM MQSeries of Oracle Advanced Queueing) te communiceren met andere applicaties.
Beveiliging
De EJB container moet er voor zorgen dat EJBs alleen kunnen worden aangeroepen door cliënts die hiervoor geautoriseerd zijn.
EJBs in gebruik nemen (deployment)
De EJB specificatie beschrijft ook het mechanisme dat het mogelijk maakt om EJBs in gebruik te nemen op een standaard manier, ongeacht welke J2EE applicatie server er gebruikt wordt. Informatie over hoe de EJB moet worden gebruikt zoals de namen van de remote en de home interfaces, of en hoe de bean in een database moet worden opgeslagen wordt beschreven in de deployment descriptor.
Dit XML document heeft een voorgeschreven opbouw met een beschrijving voor elke EJB die in gebruik genomen moet worden. Deze beschrijving bevat de volgende informatie voor elke EJB:
- Naaam van de home interface
- Java class van de EJB
- Java interface voor de home interface
- Java interface voor het object
- Een beschrijving van eventuele persistente opslag
- Een beschrijving van rollen en permissies voor toegangscontrole.
Er moet wel worden opgemerkt dat veel EJB containers extra beschrijvingen gebruiken om EJBs in gebruik te nemen. Deze informatie moet dan worden vastgelegd in een extra file of in een ander formaat. De meeste leveranciers van EJB containers leveren ook gereedschappen die deze extra informatie gebruiken en mogelijk ook de home en remote interfaces genereren aan de hand van deze extra informatie.