EJB Enterprise JavaBeans

Introductie

Enterprise JavaBeans of Enterprise Beans zijn Java componenten met business logic die worden uitgevoerd en gemanaged in een EJB Container. Deze business logic wordt hierin opgenomen om gebruik te maken van standaard services op gebied van transacties, security, communicatie, distributie, schaalbaarheid etc. Een Enterprise Bean kan business logic ook eenvoudig publiceren middels Webservice interfaces. Daarmee is dit bereikbaar via internet voor diverse soorten clients, ook buiten Java.

Er zijn in JEE6 nog maar 2 soorten Enterprise Beans:

  • Session Beans : standaard voor aanroepbare business logic
  • Message-driven Beans : listener voor messages zoals gebruikt met de JMS api.

Er zijn 3 soorten Session Beans:

  • Statefull : Bewaart de state (variabelen) tijdens een session. Is dedicated voor één client en user. Als de client verdwijnt, dan verdwijnt ook de session bean. Kan geen webservice implementeren.
  • Stateless : Is de state kwijt na afloop van een method. Kan door meerdere clients worden gedeeld. Is daarom beter schaalbaar dan Statefull. Worden opgenomen in een pool om door verschillende client calls te kunnen hergebruiken. Kan ook webservices implementeren.
  • Singleton : Een shared bean die eenmalig binnen een applicatie wordt gemaakt. Kan door meerdere client sessions wordt gedeeld. Kan ook webservices implementeren. Is typisch geschikt om applicatie opstart en shutdown taken uit te voeren.

Voorbeeld hieronder toont de definitie van een stateless bean met de @Stateless annotatie. Naangeving conventie is om het woord “Bean” achter de business naam te plakken.

@Stateless
public class DepartmentBean {
}

Enterprise Beans zijn aanroepbaar via een no-interface view of middels een business-interface.

  • No-interface view : alle public methods van de bean zijn direct aanroepbaar door clients.
  • Business-interface : is gelijk aan de standaard Java interface construct. Daarbij maakt de client gebruik van een aparte interface definitie. De bean “implements” de interface definitie. Naamgeving conventie voor interface is om het woord Bean weg te laten.

Clients krijgen toegang tot Session Beans middels Dependency Injection d.m.v. de @EJB annotatie, of door het opvragen (lookup) van het JNDI address.

EJB Dependency Injection

Voorbeeld hieronder toont de injectie van een EnterpriseBean d.m.v. de @EJB annotatie. Deze Enterprise Bean kan via de variabele worden benaderd. De injectie met @EJB kan naar de Bean of naar het business-interface refereren.

@EJB
DepartmentBean depBean;

Local Clients

Een local client bevindt zich in dezelfde applicatie als de Enterprise Bean.
Het is een andere Enterprise Bean of een Web component zoals servlet of JSF pagina.
Java application clients kunnen alleen remote clients zijn.

Een no-interface view is altijd een local view, is dus alleen aanroepbaar door local clients.
Een business-interface is default ook een local interface.
Je kunt een Enterprise Bean en een business-interface voorzien van een @Local annotatie om aan te geven dat deze alleen local kan worden aangeroepen.

@Local
public class …

@Local
public interface …

Remote Clients

Remote clients kunnen zich op een andere machine bevinden dan de Enterprise Bean.
In tegenstelling tot local clients kunnen het nu ook Java application clients zijn.
De Enterprise Bean moet nu een business-interface hebben en implementeren.
De business-interface wordt voorzien van een @Remote annotatie. De Bean wordt voorzien van een @LocalBean annotatie:

@Remote
public interface Calculator {
	public abstract int add(int a, int b);
}

@Stateless
@LocalBean
public class CalculatorBean implements Calculator {
public CalculatorBean() {
}
@Override
public int add(int a, int b) {
        return a + b;
}
}

De remote interface kan ook worden gedefinieerd door de @Remote annotatie toe te voegen aan de Bean. Deze hoeft dan niet worden toegevoegd aan het interface:

@Stateless
@LocalBean
@Remote(Calculator.class)
public class CalculatorBean implements Calculator {
public CalculatorBean() {
}
@Override
public int add(int a, int b) {
        return a + b;
}
}

NB:
Maar remote interfaces aanroepen gaat niet zomaar goed als de aanroeper en de aangeroepene niet in de zelfde JAR/WAR module, dezelfde applicatie, dezelfde server, of zelfs dezelde machine zitten. In die gevallen moet er veelal weer op de ouderwetse manier met xml bestanden geconfigureerd worden.

Als bijv. de eerder gedefinieerde CalculatorBean in project x zit en in project y zit de aanroepende Bean CalculatorFacade, dan zal deze een extra configuratie nodig hebben in de /META_INF/ejb-jar.xml file :

De aanroepende bean CalculatorFacade:

@Stateless
@LocalBean
public class CalculatorFacade {

    @EJB(name="CalcaulatorRef")
    Calculator calculator;

De ejb-jar.xml:

<ejb-jar>
   <enterprise-beans>
     <session>
       <ejb-name>CalculatorFacade</ejb-name>
         <ejb-ref>
           <ejb-ref-name>CalculatorRef</ejb-ref-name>
           <ejb-ref-type>Session</ejb-ref-type>
           <lookup-name>java:global/MyApp/CalculatorBean/Calculator</lookup-name>
       </ejb-ref>
    </session>
  </enterprise-beans>
</ejb-jar>

Hierin wordt voor de Session Enterprise Bean aangegeven welke bean deze aanroept. In het bovenstaande voorbeeld wordt dit gedaan met de tag .
Er wordt met de tag gerefereerd naar de toevoeging “name=” in de @EJB annotatie.
In het voorbeeld wordt in de lookup gebruik gemaakt van de JNDI naam in de Global JNDI space (zie JNDI paragraaf hierna).

JBoss ondersteunt ook gebruik van lookup in de @EJB annotatie:

@EJB(lookup="java:global/CalculatorTE-ejb/CalculatorBean!org.biz.ejb.Calculator")

In de JNDI naam wordt gebruik gemaakt van een volledige pad specificatie :
bean name!interface name

JNDI Lookup

Voorbeeld hieronder toont het opvragen van de Enterprise Bean middels de lookup() method van de javax.naming.InitialContext class.

DepartmentBean depBean = (DepartmentBean) InitialContext.lookup(“java:module/DepartmentBean”);

JNDI kent 3 verschillende namespace scopes:

  • java:global[/application name]/module name/bean name[/interface name]
  • java:module/bean nam/[/interface name]
  • java:app[/module name]/bean name[/interface name]

De interface naam is alleen nodig als er meerdere interfaces zijn gedefinieerd voor een bean.

This entry was posted in JEE and tagged . Bookmark the permalink.

Geef een reactie

Je e-mailadres wordt niet gepubliceerd.

De volgende HTML tags en attributen zijn toegestaan: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>