Vytváranie inštancií enterprise beanov je podstatne odlišné od vytvárania klasických inštancií Java objektov v rámci jednej JVM. V skutočnosti nemusí ani prísť k vytvoreniu novej inštancie beanu, ale EJB kontajner môže využiť už existujúce zdroje z takzvaného bean poolu, čo je niečo ako zásobník EJB objektov.

Vytváranie EJB objektov

Ak chcete vytvoriť novú inštanciu beanu, respektíve získať referenciu na lokálne alebo vzdialené rozhranie existujúceho beanu, musíte ísť cez home rozhranie. Potom, čo klient obdržal referenciu na home rozhranie (zatiaľ ešte nevieme ako), získame referenciu na inštanciu beanu prostredníctvom jednej z create metód. Predpokladajme, že máme referenciu na home rozhranie OrderProcessorBean beanu už alokovanú. Potom nasledujúci fragment kódu zobrazuje, ako získame referenciu na remote rozhranie beanu:

// sem patrí kód potrebný na získanie referencie na home rozhranie
OrderProcessor remoteProcessor = null;
remoteProcessor = orderProcessorHome.create();

Create metóda rozhrania OrderProcessorHome vráti referenciu na remote rozhranie novo vytvoreného objektu EJB. Tento objekt môže pochádzať aj zo zásobníka už existujúcich beanov, pretože záleží vyslovene na EJB kontajneri, akým spôsobom získa požadovaný objekt. Dokonca niektoré z EJB kontajnerov nevytvoria či nevyberú inštanciu beanu ani po zavolaní metódy create(), ale čakajú, až kým klient prvý krát nevykoná remote volanie vzdialenej metódy.

Aktivácia a pasivácia EJB objektov

Keďže systémové zdroje EJB kontajnera nie sú neobmedzené, často je nutné dočasne presunúť EJB objekty na nejaké sekundárne úložisko a tým uvoľniť používané zdroje na ďalšie účely. Tento proces sa označuje ako pasivácia a opačný proces ako aktivácia.

Pasivácia a aktivácia je súčasťou bežného manažmentu zdrojov EJB kontajnera a obvykle to neznamená, že sa deje len vtedy, ak sa blíži vyčerpanie systémových zdrojov. V skutočnosti môže kontajner oveľa skôr, ako by prišlo k takému stavu, vykonať pasiváciu na jednom alebo viacerých nepoužívaných EJB objektoch. Kedy presne a v akých prípadoch sa tak udeje, je striktne na dodávateľovi kontajnera a jeho implementácii. Avšak môže nastať situácia, že EJB objekt je uprostred vykonávanej transakcie alebo práve obsluhuje klienta a kontajner sa môže pokúsiť o jeho pasiváciu. To by mohlo spôsobiť, že stav aplikácie sa dostane do nepredvídateľného stavu. Z toho dôvodu je takáto možnosť ošetrená v špecifikácii EJB.

Všetky entity a session beans sú povinné implementovať metódy ejbPassivate a ejbActivate. Tieto metódy sú deklarované v rozhraniach javax.ejb.EntityBean a javax.ejb.SessionBean. Metóda ejbPassivate sa volá tesne predtým, ako kontajner odstráni inštanciu EJB objektu z pamäti, alebo tesne predtým, ako ju premiestni do zásobníka objektov. (O tomto zásobníku si povieme neskôr viac.) Metóda ejbActivate sa volá potom, čo je EJB objekt „vzkriesený“ zo zásobníka, a predtým, ako budú uskutočnené akékoľvek klientské volania.

Po ukončení pasivačnej metódy sa musí bean provider (programátor) uistiť, že bean je možné odložiť. To znamená, že všetky externé zdroje, ktoré bean využíval (napríklad JDBC, socket spojenie), musia byť uvoľnené. Najjednoduchšie sa to dá tak, že referencie odkazujúce na tieto zdroje sa nastavia na null.

Keďže spomenuté metódy sa nachádzajú v rozhraniach, ktoré vaše beany musia implementovať, každý bean musí tieto metódy obsahovať. V prípade, že bean nedrží žiadne zdroje, ktoré musia byť uvoľnené pred pasiváciou, nie je nutné vkladať do metódy žiadnu logiku. Napriek tomu musia byť prítomné. Nasledujúci výpis ilustruje prázdnu implementáciu pasivačnej a aktivačnej metódy.

OrderProcessorBean implementujúci ejbPassivate a ejbActivate
OrderProcessorBean implementujúci ejbPassivate a ejbActivate (plná velikost, cca 10 kB)

Ako je vidieť z ukážky kódu, existujú ešte ďalšie metódy, ktoré musíte implementovať a ich prítomnosť je vyžadovaná EJB kontajnerom. Session bean musí napríklad obsahovať metódu ejbRemove a setSessionContext. Objekt SessionContext poskytuje prístup k prostrediu, v ktorom EJB kontajner beží.

Mazanie EJB objektov

Na odstránenie inštancie vášho enterprise beanu je možné využiť niektorú z remove metód dostupných cez home alebo component rozhranie. Ktorá metóda bude použitá, záleží od typu EJB a tiež od toho, na aké rozhranie máte referenciu. Entity bean aj session bean obsahujú vo svojich component rozhraniach bezargumentové remove metódy. Podobne môžete zavolať niektorú z remove metód z home rozhrania EJB objektu. Ďalej môžete použiť remove metódu, ktorej predáte referenciu na objekt Handle v prípade obidvoch typov EJB (entity a session). Špeciálne pre entity bean existuje remove metóda očakávajúca ako parameter primárny kľúč.

Podobne ako pri vytváraní nových EJB objektov, aj v prípade ich mazania je samotná realizácia výlučne na pleciach EJB kontajnera. V skutočnosti totiž vôbec nemusí prísť k odstráneniu objektu z pamäte, ale iba k presunutiu do zásobníka beanov.

Súhrn

Niekoľkokrát sme spomenuli, že EJB kontajner obvykle využíva zásobník EJB objektov v záujme zachovania rýchlej odozvy a šetrenia systémových prostriedkov. Toto je veľmi zaužívaný návrhový vzor pre optimalizáciu výkonu. Vy ako vývojári beanov si však nemusíte nutne uvedomovať toto správanie sa kontajnera v oblasti manažmentu zdrojov. Jedine v zmysle uvedomenia si, že medzi volaním metódy create a vytvorením novej inštancie EJB nie je žiadna priama spojitosť.

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

Odpovědět