1 / 27

Enterprise JavaBeans

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.

parvani
Download Presentation

Enterprise JavaBeans

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Enterprise JavaBeans Tomek Juranek

  2. Tematy • Specyfikacja i architektura • Role • Typy komponentów • Budowa komponentu • Proces tworzenia (przykład) • Kiedy stosować EJB • Inne technologie

  3. 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”.

  4. 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.

  5. Architektura…

  6. 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

  7. 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).

  8. 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.

  9. 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ł.

  10. 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.

  11. 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.

  12. 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.

  13. 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.

  14. 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.

  15. 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.

  16. 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.

  17. Przykład komponentu encyjnego o trwałości zarządzanej przez kontener (CMP Entity Bean)

  18. 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; }

  19. 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; }

  20. 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); }

  21. 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>

  22. 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>

  23. 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()); }

  24. 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(); } } } } } }

  25. 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.

  26. 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).

  27. Inne technologie • Microsoft DNA (Distributed interNet Applications Architecture) ----------------------- Systemy trwałości: • JDO (Java Data Objects) • Castor • Hibernate

More Related