V minulej časti seriálu sme si vysvetlili, že pri snahe o prístup k EJB, musí klient vždy použiť príslušné rozhranie danej EJB komponenty. Ktorý typ rozhrania bude použitý záleží na tom, či ide o lokálneho alebo vzdialeného klienta.

Prístup k EJB objektu cez component rozhranie

V prípade, že k EJB budú pristupovať lokálni klienti, musíte vytvoriť rozhranie, ktoré rozširuje rozhranie javax.ejb.EJBLocalObject. Toto rozhranie označujeme ako rozhranie komponentu (component interface), a bude lokálne sprístupňovať EJB objekt a zároveň definovať biznis metódy dostupné pre lokálneho klienta (obvykle iný EJB komponent). Nasledujúca tabuľka popisuje metódy definované v rozhraní EJBLocalObject.

Návratový typ Metóda Popis Výnimka
EJBLocalHome getEJBLocalHome Metóda vráti referenciu na home rozhranie príslušnej EJB. EJBException
Object getPrimaryKey Metóda vráti primárny kľúč EJB objektu. Túto metódu môžete zavolať len pre Entity Bean, v opačnom prípade bude vyhodená výnimka. EJBException
boolean isIdentical Metóda porovnáva dva EJB objekty, či sú identické. EJBException
void remove Metóda odstráni EJB lokálny objekt. Ak EJB kontajner neumožňuje likvidovať objekty, bude vyhodená výnimka RemoveException. EJBException, RemoveException

Popis metód definovaných v rozhraní EJBLocalObject

Na druhej strane, ak váš enterprise bean bude dostupný pre vzdialených klientov, v tom prípade musí rozhranie komponentu rozširovať rozhranie javax.ejb.EJBObject. Nasledujúca tabuľka popisuje metódy definované v rozhraní EJBObject.

Návratový typ Metóda Popis Výnimka
EJBHome getEJBHome Metóda vráti referenciu na remote rozhranie príslušnej EJB. RemoteException
Handle getHandle Metóda vráti referenciu na objekt Handle príslušnej inštancie EJB. Tento objekt môže byť neskôr použitý na opätovné získanie referencie na EJB objekt, napr. z inej JVM. RemoteException
Object getPrimaryKey Metóda vráti primárny kľúč EJB objektu. Túto metódu môžete zavolať len pre Entity Bean, v opačnom prípade bude vyhodená výnimka RemoteException. RemoteException
boolean isIdentical Metóda porovnáva dva EJB objekty, či sú identické. RemoteException
void remove Metóda odstráni EJB objekt. Ak EJB kontajner neumožňuje likvidovať objekty, bude vyhodená výnimka RemoveException. RemoteException, RemoveException

Popis metód definovaných v rozhraní EJBObject

Niektoré z uvedených metód môžu mať odlišné správanie v závislosti na type enterprise beanu. Napríklad session bean nemá primárny kľúč, takže nemôžete použiť metódu getPrimaryKey. Podobne aj metóda remove má odlišný efekt podľa toho či ide o session alebo entity bean. Neskôr si túto vlastnosť priblížime detailnejšie.

Teraz sa dostávame k jednému paradoxu. Predpokladám že viete, že Java rozhrania sú určené na to, aby boli implementované nejakou Java triedou, prípadne môžu byť rozširované iným rozhraním. V prípade EJB to tak celkom neplatí. EJB trieda v skutočnosti nebude implementovať svoje vlastné component rozhranie, ale musí zároveň obsahovať všetky biznis metódy, ktoré toto rozhranie definuje. Teda ako keby toto rozhranie implementované bolo. Je to trochu zvláštne, ale má to dva základné dôvody.

Prvý dôvod je ten, že component rozhranie môže rozširovať buď rozhranie EJBLocalObject alebo rozhranie EJBObject, v závislosti od typu beanu. Obidve tieto rozhrania obsahujú metódy, ktoré by mal obsluhovať EJB kontajner a nie inštancia beanu samotná. Z toho dôvodu nemôže inštancia priamo implementovať spomenuté rozhranie, pretože kontajner by nikdy tieto metódy nedokázal obslúžiť.

Druhý dôvod prečo by nemal enterprise bean priamo implementovať svoje component rozhranie súvisí s prístupom k inštancii beanu. Ako sme už spomínali v predošlých častiach seriálu, klient nikdy nepristupuje k inštancii beanu priamo, namiesto toho volá metódy component rozhrania. Tento prístup umožní kontajneru realizovať všetky potrebné system-level služby: napr. transakcie, súčasný prístup viacerých klientov, otázky zabezpečenia a pod. ešte predtým, ako sa zavolá inštancia beanu. Ak by mal klient možnosť volať inštanciu beanu priamo, všetky tieto služby by boli obídené.

Na získanie referencie na objekt implementujúci vaše component rozhranie môžete použiť buď javax.ejb.SessionContext alebo javax.ejb.EntityContext, v závislosti od typu enterprise beanu. Obidve rozhrania obsahujú metódy getEJBLocalObject a getEJBObject, ktoré vrátia inštanciu lokálneho respektíve vzdialeného rozhrania.

Možno by bolo dobré po všetkej tej teórii vytvoriť si malú ukážku lokálneho a vzdialeného component rozhrania. Nasledujúce výpisy zobrazujú použitie týchto rozhraní pre enterprise bean s názvom OrderProcessorBean. Obidve rozhrania deklarujú metódu s názvom completeOrder, pričom toto je jediná metóda dostupná pre klienta.

OrderProcessorLocal.png, 3 kB
Lokálne component rozhranie pre OrderProcessorBean

OrderProcessor.png, 4 kB
Vzdialené component rozhranie pre OrderProcessorBean

Špecifikácia EJB popisuje uvedené rozhrania a definuje, že kontajner generuje objekt implementujúci niektoré z rozhraní, pre každú inštanciu enterprise beanu. Okrem toho zabezpečuje spomenuté system-level služby. Dodávatelia EJB kontajnerov majú k dispozícii určitú slobodu v tom, ako presne implementovať túto funkcionalitu.

Lokalizácia EJB s využitím home rozhrania.

Predtým ako klient zavolá metódu component rozhrania pre EJB, musí najprv získať referenciu na objekt, ktorý toto rozhranie implementuje. Komponent, ktorý je zodpovedný za vytváranie inštancií component rozhrania pre EJB, sa označuje ako home rozhranie pre EJB. Toto je druhé z rady rozhraní, ktoré musí byť vytvorené pre každý enterprise bean, ktorý má byť nasadený.

Každý EJB komponent, ktorý má byť k dispozícii klientom, musí mať home rozhranie. Toto rozhranie definuje metódy, ktoré umožnia klientovi vytvárať, vyhľadávať alebo odstraňovať EJB objekty. Podľa typu klienta, musí home rozhranie rozširovať jedno z dvoch rozhraní. V prípade lokálneho klienta musíte vytvoriť home rozhranie, ktoré bude rozširovať javax.ejb.EJBLocalHome rozhranie.

Toto rozhranie definuje iba jedinú metódu a to remove, pričom táto metóda môže byť použitá iba pre entity beans, z dôvodu existencie primárneho kľúča. Čo je to primárny kľúč z pohľadu EJB sme si zatiaľ nepovedali. V prípade vzdialeného klienta by malo home rozhranie rozširovať javax.ejb.EJBHome rozhranie. Nasledujúca tabuľka popisuje metódy tohto rozhrania.

Návratový typ Metóda Popis Výnimka
EJBMetaData getEJBMetaData Metóda vráti referenciu na EJBMetaData rozhranie enterprise beanu. RemoteException
HomeHandle getHomeHandle Metóda vráti HomeHandle objekt pre konkrétny home objekt. RemotException
void remove(Handle handle) Metóda odstráni EJB objekt identifikovaný príslušným Handle. RemoteException, RemoveException
void remove(Object primaryKey) Metóda odstráni EJB objekt identifikovaný primárnym kľúčom. Metóda je určená pre entity beans objekty. RemoteException, RemoveException

Popis metód definovaných v rozhraní EJBHome

Ak vás prekvapuje, že v uvedených rozhraniach nie sú prítomné metódy typu create alebo find, tak má to svoje dôvody. Totiž každá z metód by mohla mať niekoľko rôznych vstupných parametrov. Pravdepodobne neexistuje spôsob ako štandardizovať určitú skupinu create alebo find metód tak, aby pracovali za všetkých okolností. Vývojári EJB komponentov potrebujú v tomto prípade určitú flexibilitu, aby mohli predať spomínaným metódam akékoľvek argumenty aké potrebujú, za účelom vyhľadania alebo vytvorenia inštancie beanu.

O niečo vyššie sme si vytvorili ukážku lokálneho a vzdialeného component rozhrania, a teraz si ukážeme príklad lokálneho a vzdialeného home rozhrania.

OrderProcessorHomeLocal.png, 6 kB
Lokálne home rozhranie pre OrderProcessorBean

OrderProcessorHome.png, 5 kB
Vzdialené home rozhranie pre OrderProcessorBean

Hlavným rozdielom medzi uvedenými dvoma home rozhraniami je, že lokálne rozhranie rozširuje EJBLocalHome a vzdialené home rozhranie rozširuje EJBHome. Home rozhranie môže deklarovať nula alebo viac create metód, každú s inou sadou argumentov. Tieto argumenty sa obvykle používajú na inicializáciu stavu vytváraného objektu. V prípade session beans je nutné deklarovať minimálne jednu create metódu, v prípade entity beans to nie je podmienkou.

Rovnako ako v prípade component, aj pri home rozhraniach to funguje tak, že EJB kontajner je zodpovedný za vytvorenie vhodného objektu, ktorý implementuje home rozhranie konkrétneho enterprise beanu.

Záver

Zmyslom objektu implementujúceho home rozhranie, je vytvoriť továreň na objekty implementujúce component rozhranie. Obvykle sa vytvorí jeden objekt implementujúci home rozhranie pre konkrétny bean. Pri požiadavke na referenciu na objekt EJB sa všetci klienti obracajú práve na túto továreň. Home rozhranie spravuje životný cyklus všetkých inštancií konkrétneho EJB, pre ktoré je určené. Čiže ak klient A potrebuje inštanciu OrderProcessorBean beanu, obráti sa na home objekt a ten mu ju poskytne. Ak klient B potrebuje úplne inú inštanciu spomenutého beanu, obráti sa na ten istý home objekt a ten mu ju rovnako poskytne. Ale pozor, pre lokálnych a vzdialených klientov sú použité rôzne home rozhrania a objekty. Aj keď sa jedná o ten istý enterprise bean.

Žádný příspěvek v diskuzi

Odpovědět