EJB 2.x – Session Beans (implementácia – 1. časť)
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ť ibacreate
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í ajjava.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.
Mohlo by vás také zajímat
-
9 nejzajímavějších doménových koncovek
19. srpna 2024 -
AI v programování: Jak používat GitHub Copilot (část 1)
12. února 2024 -
Proč investovat do nejvýkonnějších VPS s AMD EPYC procesory
14. června 2024
Nejnovější
-
Jak rozšířit úložiště Macu za pětinovou cenu?
16. prosince 2024 -
Nové trendy v doménách pro osobní projekty – DIY, LIVING a LIFESTYLE
9. prosince 2024 -
Jak chránit webové stránky před Web/AI Scrapingem
27. listopadu 2024 -
Jaký monitor je nejlepší k novému Macu Mini?
25. listopadu 2024