EJB 2.x – Session Beans (implementácia – 1. časť)

18. června 2007

Home rozhranie pre session beans deklaruje metódy určené na vytváranie a mazanie session objektov. Na rozdiel od entity beans nie je možné v home rozhraní deklarovať vyhľadávacie metódy, respektíve home metódy. V prípade finder metód by to ani nemalo zmysel, pretože identita session objektu je z pohľadu klienta ukrytá. Keď klient potrebuje získať referenciu na session bean objekt, ktorákoľvek inštancia objektu poskytnutá EJB kontajnerom je rovnako dobrá ako akákoľvek iná. Home metódy sú tiež zbytočné, pretože biznis metódy session beans majú danú flexibilitu manipulovať s niekoľkými entitami uloženými v databáze súčasne (najčastejšie cez prístup k niekoľkým entity beans objektom.)

Vytvorenie session bean – create()

Kľúčovým prvkom v procese získania referencie na komponentné rozhranie konkrétnej session beany je volanie metódy create() deklarovanej v home rozhraní tejto beany. Na rozdiel od entity beany ste povinní deklarovať aspoň jednu takúto metódu. Zdôvodnené je to tým, že session beans nepodporujú koncept používania vyhľadávacích metód a preto musí byť nový session objekt vždy „vytvorený“ pre klienta aby ten mohol s ním pracovať. Tie úvodzovky sú tam úmyselne, v skutočnosti EJB kontajner vždy má nejaké session objekty v zálohe.

Je možné zadefinovať viacej rôznych create() metód, ak potrebujete dať klientom možnosť inicializovať session objekt rôznymi spôsobmi. Avšak tento prístup je možné uplatniť iba v prípade SfSB (stateful session beans) z dôvodu ich schopnosti manažovať svoj vnútorný stav aj medzi jednotlivými volaniami metód. V prípade SlSB (stateless session beans) je možné deklarovať iba jedinú create() metódu a to nasledovným spôsobom:

public AuctionHouse create() throws CreateException, RemoteException;

Všetky takéto metódy musia spĺňať nasledovné:

  • Názov musí začínať na create, v prípade SlSB musí byť iba create a metóda nesmie akceptovať žiadne argumenty.
  • Musí vrátiť remote interface typ ak sa nachádza v remote home rozhraní alebo local interface typ ak sa nachádza v lokálnom home rozhraní.
  • Musí do throws klauzule zahrnúť výnimku javax.ejb.CreateException a ak sa nachádza v remote rozhraní aj java.rmi.RemoteException.

Rovnako ako pri entity beans aj teraz musíte implementovať korešpondujúcu metódu ejbCreate() pre každú create() metódu ktorú ste deklarovali, avšak na rozdiel od entity beans tu neplatí koncept ejbPostCreate() metód. V podstate tu platia pravidlá definované už pri entitných objektoch, ale navyše deklarácie vašich create metód musia obsahovať všetky aplikačné výnimky deklarované v throws klauzule korešpondujúcej ejbCreate() metódy. Vyžadovaná výnimka CreateException je štandardná aplikačná výnimka, ktorú môžete použiť na reportovanie problémov s inicializačnými parametrami predanými metóde create().

Odstránenie session bean – remove()

Keď remote klient ukončil prácu so session bean objektom, mal by zavolať metódu remove() deklarovanú rozhraním EJBObject, alebo metódu remove(Handle handle) deklarovanú rozhraním EJBHome. Lokálny klient má iba jednu možnosť a to zavolať metódu remove() deklarovanú v rozhraní EJBLocalObject. Pre obidva typy klientov by zavolanie metódy remove(Object primaryKey) deklarovanej v EJBHome alebo EJBLocalHome spôsobilo vyhodenie výnimky RemoveException, pretože session beana nemá primárny kľúč.

Typicky je celý process taký, že klient zavolá metódu create() aby získal referenciu na komponent interface session objektu, následne môže zavolať nad touto referenciou potrebné biznis metódy a potom zavolá metódu remove() aby uvoľnil použitú inštanciu. Akonáhle je inštancia uvoľnená akékoľvek volanie nad jej remote rozhraním spôsobí vyvolanie výnimky java.rmi.NoSuchObjectException a volanie nad jej lokálnym rozhraním vyvolanie výnimky javax.ejb.NoSuchObjectLocalException.

Rozhranie – AuctionCheckoutHome

Nasledovný výpis obsahuje deklaráciu home rozhrania pre AuctionCheckout stateful session bean. Toto rozhranie ilustruje použitie viacerých create metód.

Home rozhranie pre AuctionCheckout SfSB – AuctionCheckoutHome.java:

/**
* Title: AuctionCheckoutHome
* Description: Home rozhranie pre AuctionCheckout stateful session bean
*/

import java.rmi.RemoteException;
import javax.ejb.CreateException;
import javax.ejb.EJBHome;
public interface AuctionCheckoutHome extends EJBHome {
 /**
 * Vytvorí session objekt s použitím štandardnej inicializácie
 */

 public AuctionCheckout create() throws CreateException, RemoteException;
 /**
 * Vytvorí session objekt s použitím parametrov ID aukcie a primárnym kľúčom dražiteľa
 */

 public AuctionCheckout create(int auctionId, int bidderId)
  throws CreateException, RemoteException;
}

Zatiaľ sme sa bližšie nevenovali rozhraniam AuctionManagerHome a AuctionHouseHome. Tieto rozhrania však nie sú ničím výnimočné, pretože všetko čo treba v home rozhraniach pre SlSB urobiť, je deklarovať jednu metódu create, ktorá nebude akceptovať žiadne argumenty.

Implementujeme Session bean – I.časť

Až doteraz sme si ukazovali ako deklarovať komponentné a home rozhrania pre session bean, preto ďalším krokom je implementovať session bean triedy samotnú. V tejto časti bude veľmi dôležité pochopiť ktoré metódy je vhodné implementovať, ako EJB kontajner spravuje životný cyklus session beany a ako pristupovať k iným EJBčkam a iným zdrojom (napr. databázy) priamo z metód session beany.

Rozhranie – SessionBean

Všetky SB musia implementovať toto rozhranie, ktoré súčasne rozširuje EnterpriseBean rovnako ako rozhranie EntityBean. EJB kontajner používa metódy deklarované v tomto rozhraní, na notifikáciu jednotlivých inštancií session beanov pri udalostiach životného cyklu. Tieto ejb callback metódy vám určite budú známe, pretože sme sa s nimi stretli už pri EB (Entity Beans). Nasledovná tabuľka popisuje metódy deklarované v rozhraní SessionBean.

Návratový typ Názov metódy Popis metódy
void ejbActivate() Volaná kontajnerom hneď potom, ako je inštancia SB aktivovaná zo svojho pasívneho stavu.
void ejbPassivate() Volaná kontajnerom tesne predtým, ako je inštancia SB pasivovaná.
void ejbRemove() Volaná kontajnerom tesne predtým, ako je inštancia SB odstránená
void setSessionContext (SessionContext ctx) Volaná kontajnerom s cieľom asociovať runtime session context s konkrétnou inštanciou SB.

Rozhranie – SessionContext

Objekt SessionContext predávaný inštancii SB prostredníctvom spomínanej metódy setSessionContext, poskytuje prístup k runtime session context-u, ktorý spravuje kontajner v životnom cykle inštancie. SB ukladá objekt SessionContext do premennej inštancie, a uchováva jeho stav počas celej konverzácie. Ako vidieť v nasledovnej tabuľke, rozhranie SessionContext deklaruje metódy potrebné na získanie referencie na component rozhranie SB.

Návratový typ Názov metódy Popis metódy
void getEJBObject() Vráti objekt EJBObject remote rozhrania aktuálne asociovaného s danou inštanciou.
void getEJBLocalObject() Vráti objekt EJBLocalObject lokálneho rozhrania aktuálne asociovaného s danou inštanciou.

Rozhranie SessionContext rozširuje rozhranie EJBContext a preto má prístup k metódom definovaným v ňom.

Upozornenie na záver, pretože SB nie je povinná mať obidve lokálne aj remote rozhrania, volanie metódy getEJBLocalObject alebo getEJBObject nie je vždy validné. Ak zavoláte metódu pre korešpondujúce rozhranie ktoré neexistuje, vyvolá to výnimku IllegalState. To isté platí pre volania metód getEJBHome a getEJBLocalHome. V budúcej časti si dokončíme implementáciu SB, pričom si povieme niečo aj o jej životnom cykle.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Předchozí článek tropicbar.cz
Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *