270 likes | 432 Views
Enterprise JavaBeans. Tomek Juranek. Tematy. Specyfikacja i architektura Role Typy komponentów Budowa komponentu Proces tworzenia (przykład) Kiedy stosować EJB Inne technologie. Enterprise JavaBeans.
E N D
Enterprise JavaBeans Tomek Juranek
Tematy • Specyfikacja i architektura • Role • Typy komponentów • Budowa komponentu • Proces tworzenia (przykład) • Kiedy stosować EJB • Inne technologie
Enterprise JavaBeans • Specyfikacja Enterprise JavaBeans definiuję architekturę i metodę budowy rozproszonych komponentów obiektowych uruchamianych po stronie serwera aplikacji. • Komponenty są wykorzystywane do budowy złożonych aplikacji rozproszonych na zasadzie „składania z klocków”.
Ogólna architektura Program Java realizowany w technologii EJB składa się z dwóch elementów: lokalnej aplikacji klienta i zdalnych komponentów przetwarzania danych. Aplikacja klienta komunikuje się poprzez sieć komputerową z komponentami, przesyłając do nich żądania zdalnego wykonania metod. Wyniki działania tych metod są następnie tą samą drogą odsyłane do aplikacji klienta.
Składniki J2EE • Komponenty EJB • Serwlety Javy • Strony JSP • Interfejs JNDI • Architektura transakcji – JTA • Usługa przesyłania komunikatów – JMS • Poczta elektroniczna JavaMail • Interfejs API J2EE Connector • Obsługa XML
Role Specyfikacja Enterprise JavaBeans określa 6 ról, które są wykorzystywane w tworzeniu, wdrożeniu, jak i określaniu komponentów systemu: • Producent – Wykonawca odpowiedzialny za stworzenie komponentów EJB wielokrotnego użytku. Komponenty te są zamieszczane w specjalnym pliku (ejb-jar).
Role… • Monter aplikacji – Tworzy i montuje aplikację z kolekcji plików ejb-jar. Wchodzi w to napisanie aplikacji, która wykorzystuje zbiór EJB (np. serwlety, strony JSP, GUI). • Wdrożeniowiec – Bierze zestaw plików od montera i (lub) dostawcy i osadza je w środowisku uruchomieniowych – w jednym lub więcej kontenerów EJB.
Role… • Dostawca kontenera EJB – Dostarcza środowisko uruchomieniowe i narzędzia, które wykorzystuje się do wdrożenia, administracji i uruchamiania komponentów EJB. • Administrator systemu – Zarządza różnymi komponentami i usługami, tak by były skonfigurowane i poprawnie współdziałały. Dba również o to, by system działał.
Kontener EJB • Jest bezpośrednim środowiskiem uruchomieniowym dla każdego komponentu EJB. • Całkowicie pośredniczy w komunikacji pomiędzy komponentem EJB a światem zewnętrznym. • Oferuje komponentowi szereg usług o charakterze systemowym: ochrona dostępu, obsługa transakcji, itp.
Typy komponentów • Sesyjne (Session Bean) – modelują procesy biznesowe. Można je rozumieć jak czasowniki, ponieważ odpowiadają konkretnym akcjom np. zliczenie wartości transakcji. • Encyjne (Entity Bean) – modelują dane biznesowe. Są jak rzeczowniki, ponieważ są obiektami danych, czyli obiektami Javy tymczasowo przechowującymi informacje z bazy danych np. konto bankowe czy produkt.
Typy komponentów… • Komponenty sterowane komunikatami (Message-Driven Bean) – Są podobne do komponentów sesyjnych, są również akcjami. Różnica między nimi polega na sposobach wywoływania komponentów. MDB możemy uruchomić, wysyłając jedynie odpowiednią wiadomość do komponentu np. komponent działający w oparciu o komunikaty o autoryzacji kart kredytowych lub rynku akcji.
Sesyjne komponenty • Stanowe (stateful) – są przez cały czas życia skojarzone z jedną i tą samą aplikacją klienta i pamiętają swój stan obiektu. • Bezstanowe (stateless) – nie gwarantują pamiętania swojego stanu obiektu i mogą być przy każdym wywołaniu wykorzystywane przez inną aplikację klienta.
Encyjne komponenty • Z trwałością obsługiwaną przez komponent (BMP – Bean-Managed Persistency) – Muszą same umieszczać swój stan w bazie danych, korzystając np. z JDBC lub SQLJ. • Z trwałością obsługiwaną przez kontener EJB (CMP – Container-Managed Persistency) – Polegają na funkcjonalności kontenera EJB, którego zadaniem jest w tym wypadku zapisywanie i odczytywanie stanu komponentu z/do bazy danych.
Budowa komponentu EJB • Egzemplarz komponentu EJB – Jest egzemplarzem obiektu klasy komponentu napisanej w Javie. Zawiera implementacje metod biznesowych zdefiniowanych w zdalnym i (lub) lokalnym interfejsie. • Interfejs zdalny (Remote) – Odzwierciedla skład metod naszego komponentu EJB, który chcemy udostępniać na zewnątrz. W technologii EJB klient zawsze komunikuje się ze zdalnym interfejsem, a nigdy bezpośrednio z egzemplarzem komponentu EJB. Interfejs ten gra podobną rolę do interfejsu CORBA IDL.
Budowa komponentu EJB… • Interfejs domowy (Home) – Interfejs ten jest używany jako fabryka dla naszych egzemplarzy EJB. Klienci wykorzystują interfejs Home w celu odnalezienia instancji komponentu EJB lub też stworzenia nowej. • Plik opisu wdrożenia – Plik XML zawiera informacje o komponencie EJB takie jak nazwy interfejsów domowego i odległego wymagane przez kontener; nazwę publikowaną w JNDI dla interfejsu domowego; parametry transakcyjności dla każdej metody komponentu, itp.
Przykład komponentu encyjnego o trwałości zarządzanej przez kontener (CMP Entity Bean)
Produkt.java – interfejs zdalny package produkt; import javax.ejb.*; import java.rmi.RemoteException; public interface Produkt extends javax.ejb.EJBObject { public String getNazwa() throws RemoteException; public void setNazwa(String nazwa) throws RemoteException; public String getOpis() throws RemoteException; public void setOpis(String opis) throws RemoteException; public int getCena() throws RemoteException; public void setCena(int cena) throws RemoteException; public String getIdentyfikatorProduktu() throws RemoteException; }
ProduktDomowy.java – interfejs domowy package produkt; import javax.ejb.*; import java.util.Collection; import java.rmi.RemoteException; public interface ProduktDomowy extends javax.ejb.EJBHome { public Produkt create(String nazwa, String opis, int cena, String identyfikatorProduktu) throws CreateException, RemoteException; public Collection findZaPomocaNazwy(String nazwa) throws FinderException, RemoteException; public Collection findZaPomocaOpisu(String opis) throws FinderException, RemoteException; public Collection findDrogieProdukty(int cenaMinimalna) throws FinderException, RemoteException; public Collection findTanieProdukty(int cenaMaksymalna) throws FinderException, RemoteException; public Collection findWszystkieProdukty() throws FinderException, RemoteException; public Collection findZaPomocaCeny(int cena) throws FinderException, RemoteException; public Produkt findByPrimaryKey(String identyfikatorProduktu) throws FinderException, RemoteException; }
ProduktKomponent.java – klasa komponentu Produkt package produkt; import javax.ejb.*; abstract public class ProduktKomponent implements EntityBean { EntityContext entityContext; public String ejbCreate(String nazwa, String opis, int cena, String identyfikatorProduktu){ setIdentyfikatorProduktu(identyfikatorProduktu); setNazwa(nazwa); setOpis(opis); setCena(cena); return identyfikatorProduktu; } public void ejbPostCreate(String nazwa, String opis, int cena, String identyfikatorProduktu){} public void ejbRemove() throws RemoveException { } public void ejbLoad() { } public void ejbStore() { } public void ejbActivate() { } public void ejbPassivate() { } public void unsetEntityContext() { this.entityContext = null; } public void setEntityContext(EntityContext entityContext) { this.entityContext = entityContext; } public abstract String getNazwa(); public abstract void setNazwa(String nazwa); public abstract String getOpis(); public abstract void setOpis(String opis); public abstract int getCena(); public abstract void setCena(int cena); public abstract String getIdentyfikatorProduktu(); public abstract void setIdentyfikatorProduktu(String identyfikatorProduktu); }
ejb-jar.xml – deskryptor rozmieszczenia dla komponentu Produkt <ejb-jar> <enterprise-beans> <entity> <ejb-name>Produkt</ejb-name> <home>produkt.ProduktDomowy</home> <remote>produkt.Produkt</remote> … <cmp-field> <field-name>cena</field-name> </cmp-field> … <query> <query-method> <method-name>findZaPomocaNazwy</method-name> <method-params> <method-param>java.lang.String</method-param> </method-params> </query-method> <ejb-ql>select object(k) from Produkt k where k.nazwa = ?1</ejb-ql> </query>
weblogic-cmp-rdbms-jar.xml <weblogic-rdbms-jar> <weblogic-rdbms-bean> <ejb-name>Produkt</ejb-name> <data-source-name>myJNDIDataSource</data-source-name> <table-map> <table-name>PRODUKTY</table-name> <field-map> <cmp-field>identyfikatorProduktu</cmp-field> <dbms-column>IDENTYFIKATOR</dbms-column> <dbms-column-type>LongString</dbms-column-type> </field-map> <field-map> <cmp-field>nazwa</cmp-field> <dbms-column>NAME</dbms-column> <dbms-column-type>LongString</dbms-column-type> </field-map> … </weblogic-rdbms-bean> <database-type>ORACLE</database-type> </weblogic-rdbms-jar>
ProduktKlient.java package produkt; import javax.ejb.*; import javax.naming.*; import java.rmi.*; import java.util.*; public class ProduktKlient { public static void main(String[] args) throws Exception { ProduktDomowy domowy = null; try { Hashtable env = new Hashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory"); env.put(Context.PROVIDER_URL, "t3://serverek:7001"); Context kontekst = new InitialContext(env); domowy = (ProduktDomowy) javax.rmi.PortableRemoteObject.narrow(kontekst.lookup("ProduktRemote"), ProduktDomowy.class); domowy.create("123-456-7890", "P5-350", 200, "350 Mhz Pentium"); domowy.create("123-456-7891", "P5-400", 300, "400 Mhz Pentium"); Iterator i = domowy.findZaPomocaNazwy("SD-64").iterator(); System.out.println("Opisy nastepujacych produktow pasuja do nazwy SD-64:"); while (i.hasNext()) { Produkt prod = (Produkt) javax.rmi.PortableRemoteObject.narrow(i.next(), Produkt.class); System.out.println(prod.getOpis()); }
ProduktKlient.java… System.out.println("Wywolanie metody wyszukujacej wszystkie produkty, ktorych cena jest rowna 200 zlotych"); i = domowy.findZaPomocaCeny(200).iterator(); while (i.hasNext()) { Produkt prod = (Produkt) javax.rmi.PortableRemoteObject.narrow(i.next(), Produkt.class); System.out.println(prod.getOpis()); } } catch (Exception e) { e.printStackTrace(); } finally { if (domowy != null) { System.out.println("Usuwanie produktow.."); Iterator i = domowy.findWszystkieProdukty().iterator(); while (i.hasNext()) { try { Produkt prod = (Produkt) javax.rmi.PortableRemoteObject.narrow(i.next(), Produkt.class); if (prod.getIdentyfikatorProduktu().startsWith("123")) { prod.remove(); } } catch (Exception e) { e.printStackTrace(); } } } } } }
Kiedy nie należy korzystać z EJB • Nie można zaakceptować ograniczeń EJB takich jak wątki, zmienne statyczne, kod natywny. • Aplikacja jest dużym interfejsem do bazy danych. • Aplikacja jest prosta. • Wymagane jest niezwykle szybkie stworzenie początkowego systemu.
Kiedy należy korzystać z EJB • W długim okresie czasu system jest tworzony szybciej i jest bardziej elastyczny. • Potrzebne są różne interfejsy użytkownika. • Duże skalowalne systemy (Amazon.com).
Inne technologie • Microsoft DNA (Distributed interNet Applications Architecture) ----------------------- Systemy trwałości: • JDO (Java Data Objects) • Castor • Hibernate