Enterprise Java Beans 3 (EJB3) jsou řízené, serverové komponenty umožňující modulární tvorbu podnikových aplikací. Specifikace EJB3 je součástí množiny aplikačního programového rozhraní (API) definující Java Enterprise Edition (Java EE). EJB3 vychází z vlastností klasických Java Beans. Cílem EJB je oddělit business logiku aplikace od prezentační (viz např. JSP) a persistentní vrstvy (viz CRUD operace), ale také zajistit předpoklady pro integraci s ostatními technologiemi – JMS, JNDI a CORBA. Vývojáři podnikových systémů tak mohou využívat výhody plynoucí z užití EJB – znovu-použitelnost kódu, oddělení logiky aplikace, transakční zpracování, bezpečnost, jednodušší testování a integrace apod.
Ve specifikaci EJB je také detailněji popsáno, jakým způsobem má aplikační server spolu s EJB kontejnerem poskytovat základní funkcionalitu (persistenci přes Java Persistence API, transakční zpracování, řízení souběžného přístupu, události pomocí JMS, jmenné a adresářové služby JNDI, bezpečnost – JCE a JAAS, nasazení softwarových komponent na aplikační server, vzdálené volání procedur pomocí RMI-IIOP, zpřístupnění business metod ve formě webových služeb).

EJB kontejner

[editovat | editovat zdroj]

Představuje dedikovaný virtuální prostor v aplikačním serveru, kam se nasazují EJB komponenty. Kontejner řeší zejména následující problematiku[1]:

Embedded kontejner

[editovat | editovat zdroj]

Nabízí možnost spouštět EJB aplikace v prostředí Java SE. Usnadňuje testování a ladění, ale podporuje jen podmnožinu EJB Lite (bez MDB, vzdálených rozhraní, webových služeb, …).

Rozhraní

[editovat | editovat zdroj]

Rozhraní slouží pro definování metod, které bude muset bean implementovat a poskytovat navenek pro manipulaci s jeho datovými atributy. Každý EJB musí implementovat aspoň jedno z níže uvedených rozhraní:

Typy EJB

[editovat | editovat zdroj]

V EJB kontejneru nalezneme dva druhy EJB – Session Beans a Message Driven Beans.

Stateless Session Beans (bezstavové beany)

[editovat | editovat zdroj]

Bezstavové beany neuchovávají stav relevantní pro klienta mezi obsluhou jeho jednotlivých požadavků. Pro obsloužení každého požadavku klienta je mu vždy na serveru přidělena samostatná instance, která je vyhrazena pouze tomuto klientovi v rámci jednoho daného požadavku – z tohoto důvodu jsou bezstavové beany přirozeně vláknově bezpečné. V rámci jednoho volání metody (požadavku) lze použít i datové atributy instance beanu, ale není zaručeno, že se jejich obsah při dalším volání nezmění. Bezstavové beany se na serveru obvykle sdružují v poolu, ze kterého jsou odebírány pro obsloužení požadavku a následně se do něj zpět vrací. Třída představující bezstavový bean musí být anotována @Stateless

Životní cyklus stateless beanu

[editovat | editovat zdroj]


Cyklus beanu začíná ze stavu „neexistence“ vytvořením nové instance a jejím zařazením do poolu na serveru. Při vytváření instance server do beanu injektuje případné reference a volá metodu anotovanou @PostConstruct, pokud taková existuje, která může sloužit například k otevření JDBC připojení. Když je bean ve stavu method-ready-pool může obsluhovat klientské požadavky (poskytovat své business metody). V případě, že se server rozhodne uvolnit paměť zabranou beany nebo je ukončován standardním způsobem, volají se případné metody rušeného beanu anotované @PreDestroy, které slouží jako inverzní operace k post-constructu (tedy např. uzavírání databázového spojení). Stateless bean může skončit svou existenci také vyhozením systémové výjimky, která způsobí okamžité odstranění beanu z paměti (nevolá se @PreDestroy).

Stateful Session Beans (stavové beany)

[editovat | editovat zdroj]

Jsou objekty, které si uchovávají svůj stav mezi voláním metod (obsluhy požadavků klienta) v rámci jedné session. Pro každého unikátního klienta se vytvoří v paměti na serveru samostatná instance stavového session beanu, která patří pouze tomuto klientovi a při dalším volání metod se použije vždy stejný objekt obsahující data z předchozí interakce klienta. Stavový bean si můžeme představit jako prodlouženou ruku klienta na serveru. V rámci životního cyklu stavového beanu může dojít k jeho pasivaci (uložení pomocí persistentní vrstvy) prováděnou kontejnerem za účelem uvolnění paměti na serveru. Pouze ve stavových beanech lze použít tzv. JPA rozšířený JPA persistence kontext (JPA). Doba života tohoto kontextu je svázána s životem stavového beanu, na rozdíl od implicitního transakčního kontextu, jehož doba života je vymezena transakcí (typicky voláním business metody). Třída představující stavový bean musí být anotována @Stateful

Životní cyklus stavového beanu

[editovat | editovat zdroj]


Životní cyklus stavového beanu je podobný bezstavovému. Vytváření, rušení beanu a volání metod stateful beanu je shodné jako u stateless. Rozdíl nastává, pokud se server rozhodne uvolnit část prostředků z vlastní paměti, tehdy dochází k pasivaci stavových beanů tj. jejich uložení v serializované podobě na server a jejich odpojení od SessionContextu (přesto ale zůstávají v ExtendedSessionContextu; viz EntityManager a SessionContext). Před provedením pasivace server vyhledá a zavolá metodu beanu anotovanou @PrePasivate (resp. @PostActivate se zavolá po obnovení beanu). Bean může také přestat existovat, pokud vyprší jeho časová životnost na serveru (timeout) nebo nastane-li systémová výjimka (opět jako u stateless EJB).

Singleton Session Beans

[editovat | editovat zdroj]

Jsou business objekty s globálně sdíleným stavem. Synchronizovaný přístup k tomuto typu objektů může být řízen buď kontejnerem (Container-managed concurrency) anebo samotným beanem (bean-managed concurrency) pomocí anotace @Lock a příslušným parametrem zámku pro čtení nebo zápis při volání metod. Pomocí anotace @Startup je možné vytvářet instance sinlgetonových beanů již při startu EJB kontejneru a načítat takto jejich obsah. Tento přístup je vhodný při načítání statických hodnot (obvykle číselníků – např. seznamy PSČ), čímž dochází k úsporám systémových prostředků a také času při opakovaném načítání stejných hodnot z databáze v pozdější fázi běhu aplikace (kešování). Třída singletonu je označena anotací @Singleton

Message Driven Beans

[editovat | editovat zdroj]

Zprávami řízené beany byly navrženy ve specifikaci EJB 2.0 (od J2EE 1.3). MDB spojuje Java Message Service (JMS) s EJB a tak vzniká nový typ beanu ovládající asynchronní JMS nebo jiné typy zpráv. Hlavní charakteristikou MDBeanů je především jejich asynchronní chování. MDB tedy slouží k obsluze operací, které nevyžadují okamžitou odpověď. Tento typ beanů se může registrovat k JMS, k message queues nebo message topics, které byly přidány v EJB 2.0, aby umožnily událostně-řízené zpracování uvnitř EJB kontejneru.

Poznámka: Od EJB v. 3.1 lze jako asynchronní označit přímo některou třídu nebo metodu (anotace @Asynchronous), taková metoda pak nevrací přímo výsledek (návratový typ void), ale pomocí určitých konstruktů si ho lze později vyzvednout (viz java.util.concurrent.Future).

Příklady

[editovat | editovat zdroj]

Deklarace Enterprise Java Beanu s lokálním a vzdáleným rozhraním:

@javax.ejb.Stateless
@javax.ejb.Local (MyLocalInterface.class)
@javax.ejb.Remote (MyRemoteInterface.class)
public class MyStatelessBean implements MyLocalInterface, MyRemoteInterface { ...implementace metod rozhraní v beanu... }

kde MyLocalInterface a MyRemoteInterface jsou vlastní deklarovaná rozhraní, která bean musí implementovat. Anotace @Local může být uvedena přímo v deklaraci rozhraní (viz níže), anebo v záhlaví deklarace beanu, kam se doplní příslušný typ rozhraní (.class).

@javax.ejb.Local
public interface MyLocalInterface {
	public void addCustomer(Customer customer);
	//... další metody rozhraní
}

Reference

[editovat | editovat zdroj]

V tomto článku byl použit překlad textu z článku Enterprise JavaBean na anglické Wikipedii.

  1. ŠLAJCHRT, Z.: Vývoj podnikových aplikací na platformě Java – část 4. [online] 2010; http://java.vse.cz/wiki/uploads/4it447/4it447-prednaska4.ppt

Externí odkazy

[editovat | editovat zdroj]