Enterprise JavaBeans 1. Wprowadzenie. 2. Przegląd komponentów EJB. komponenty encyjne, komponenty sesyjne, komponenty sterowane komunikatami. 3. Kontener komponentów EJB: JBoss. 1
Enterprise JavaBeans Enterprise JavaBeans (EJB) to specyfkacja modelu komponentów serwerowych używanych w rozproszonych aplikacjach biznesowych. Komponenty EJB reprezentują procesy biznesowe (sprzedaż, magazynowanie, rozliczenia itp.). Aplikacja biznesowa to zbiór takich komponentów. Komponenty są udostępniane i zarządzane poprzez kontenery EJB. Komponenty działające w ramach jednej aplikacji nie muszą znajdować się na jednym serwerze (kontenerze). 2
Enterprise JavaBeans partnerzy biznesowi aplety, aplikacje, RMI, CORBA przeglądarka www serwlety strony JSP komponenty EJB komponenty encyjne złącza inny system wewnętrzny partner biznesowy SQL 3
Przegląd komponentów Podstawowe części, z których tworzone są aplikacje biznesowe to: utrwalanie danych - odbywa się w abstrakcyjnej warstwie ponad JDBC. Polega na odwzorowaniu obiektów na zapis w bazie danych. Utrwalanie zostało określone poprzez Java Persistence API, które defniuje odwzorowanie dla zwykłych obiektów Javy (POJO) zwanych także komponentami encyjnymi. przesyłanie komunikatów - komponenty jak również aplikacje mogą wymieniać sie wiadomościami. EJB wspiera asynchroniczną i synchroniczną wymianę komunikatów poprzez Java Message Service (JMS) oraz komponenty message-driven beans. usługi web services usługi realizowane poprzez sieć internet za pośrednictwem Simple Object Access Protocol (SOAP) lub Web Service Description Language (WDSL). 4
Komponent encyjny Komponent encyjny (entity bean) to POJO, odwzorowany w relacyjnej bazie danych. Komponenty encyjne modelują elementy aplikacji biznesowych, które wyrażają się rzeczownikami. Implementacją komponentu encyjnego jest klasa oznaczona jako @javax.persistence.entity zawierająca atrybut poprzedzony adnotacją @javax.persistence.id (klucz główny) 5
Komponent encyjny import javax.persistence.*; @Entity @Table(name="USERS") public class User { private int id; private String name; private int age; @Id @GeneratedValue @Column(name="USER_ID") public int getid( ) { return id;' public void setid(int pk) { this.id = pk; 6
Komponent encyjny @Column(name="USER_NAME") public String getname( ) { return name; public void setname(string str) { this.name = str; @Column(name="USER_AGE") public int getage( ) { return age; public void setage(int v) { this.age = v; 7
Komponent korporacyjny Komponenty korporacyjne (enterprise bean) dzielą się na dwa typy: sesyjne (session bean) i sterowane komunikatami (message-driven bean). Komponenty sesyjne służą do zarządzania zadaniami realizowanymi przez aplikację, natomiast komponenty przenoszące komunikaty pozwalają koordynować zadania realizowane przez inne komponenty. 8
Komponent sesyjny Implementacja komponentu sesyjnego składa się z: zdalnego interfejsu oznaczonego @javax.ejb.remote i określającego metody dostępne dla aplikacji na zewnątrz kontenera, lokalnego interfejsu oznaczonego @javax.ejb.local i określającego metody dostępne dla komponentów działających w ramach tego samego kontenera, końcowego interfejsu oznaczonego @javax.jws.webservice i określającego metody dostępne z zewnątrz poprzez protokół SOAP, klasy implementującej komponent oznaczonej @javax.ejb.stateful albo @javax.ejb.stateless. 9
Komponent sesyjny import javax.ejb.remote; @Remote public interface CalculatorRemote { public int add(int x, int y); public int subtract(int x, int y); import javax.ejb.*; @Stateless public class CalculatorBean implements CalculatorRemote { public int add(int x, int y) { return x + y; public int subtract(int x, int y) { return x - y; 10
Komponenty stanowe i bezstanowe Komponenty sesyjne stanowe przechowują informację o stanie interakcji z klientem. Stan nie jest zapisywany w bazie danych. Jest on utrzymywany dopóki klient aktywnie korzysta z komponentu. Później jest bezpowrotnie tracony. W komponentach bezstanowych wywołania metod są niezależne. Komponenty bezstanowe charakteryzują się większą wydajnością i efektywniejszym zarządzaniem pamięcią ponieważ jeden komponent może obsługiwać wielu klientów. 11
Komponenty stanowe i bezstanowe @Stateful public class TravelAgentBean implements TravelAgentRemote { // Referencja do usługi wypełniana przez kontener EJB @PersistenceContext private EntityManager entitymanager; // Referencja do komponentu wypełniana przez kontener EJB @EJB private ProcessPaymentRemote process; private Customer customer; private Cruise cruise; private Cabin cabin; public void setcustomer(customer cust) { // Nowy rekord w bazie danych entitymanager.create(cust); customer = cust; public void setcabinid(int id) { cabin = entitymanager.find(cabin.class, id); 12
Komponenty stanowe i bezstanowe public void setcruiseid(int id) { cruise = entitymanager.find(cruise.class, id); public Reservation bookpassage(string card, double price) throws IncompleteConversationalState { if (customer == null cruise == null cabin == null){ throw new IncompleteConversationalState( ); try { // Nowy komponent Reservation reservation = new Reservation( customer,cruise,cabin,price,new Date( )); // zapis w bazie danych entitymanager.persist(reservation); process.bycredit(customer,card,price); // komponent zwracany klientowi jako POJO return reservation; catch(exception e){ throw new EJBException(e); 13
Komponenty sterowane komunikatami Implementacja komponentu do obsługi komunikatów: interfejsu Message określającego metody za pomocą których JMS dostarcza komunikaty do komponentu klasy implementującej komponent oznaczonej @javax.ejb.messagedriven implementującej interfejs javax.jms.messagelistener. 14
Komponenty sterowane komunikatami @MessageDriven public class ReservationProcessorBean implements javax.jms.messagelistener { // Referencja do usługi wypełniana przez kontener EJB @PersistenceContext private EntityManager entitymanager; // Referencja do komponentu wypełniana przez kontener EJB @EJB private ProcessPaymentRemote process; public void onmessage(message message) { try { MapMessage reservationmsg = (MapMessage)message; // Odebranie referencji komponentu z wiadomości Customer customer = (Customer)reservationMsg.getObject("Customer"); // Odebranie innych danych int cruisepk = reservationmsg.getint("cruiseid"); int cabinpk = reservationmsg. getint("cabinid"); double price = reservationmsg.getdouble("price"); String card = reservationmsg.getstring("card"); 15
Komponenty sterowane komunikatami // Wstawienie komponentu do bazy danych entitymanager.persist(customer); // Odnalezienie komponentów Cruise cruise = entitymanager.find(cruise.class, cruisepk); Cabin cabin = entitymanager.find(cabin.class, cruisepk); // Nowy komponent encyjny Reservation reservation = new Reservation( customer,cruise,cabin,price,new Date( )); entitymanager.create(reservation); // Wywołanie metody komponentu sesyjnego process.bycredit(customer,card,price); catch(exception e) { throw new EJBException(e); 16
Kontener EJB Kontener to środowisko, w ramach którego działa serwer komponentów. Kontener zarządza obiektami EJB, pomaga im tworzyć komponenty oraz udostępnia usługi związane z transakcjami, bezpieczeństwem, współbieżnością i wyszukiwaniem komponentów. Komponenty mają dostęp do kontenera poprzez interfejs javax.ejb.ejbcontext (javax.ejb.sessioncontext, javax.ejb.messagedriven-context) dzięki czemu podczas obsługi żądań klientów mogą używać przechowywanych tam informacji. 17
JBoss - instalacja Wymagania: JDK Instalacja: pobranie http://www.jboss.org/ rozpakowanie lub uruchomienie instalatora Uruchomienie: run.sh (run.bat) w podkatalogu bin. strona główna: http://localhost:8080/, sterowanie http://localhost:8080/jmx-console, zatrzymanie: shutdown.sh (shutdown.bat). 18
Struktura katalogów bin skrypty startowe i związane z nimi pliki. client przechowuje pliki konfguracyjne i pliki jar, które mogą być wykorzystane przez aplikacje klienckie lub zewnętrzne kontenery. lib wewnętrzne biblioteki serwera JBoss. server każdy z podkatalogów umieszczonych tutaj określa inną konfgurację serwera. Konfguracja może być przekazana przy uruchomieniu serwera poprzez opcje -c <nazwa konfiguracji>. 19
Konfguracja serwera W podkatalogu server początkowo znajdują sie trzy konfguracje: minimal niezbędne minimum do uruchomienia serwera aplikacji. Zawiera usługi logowania, JNDI oraz skaner nowych aplikacji. Nie zawiera kontenera serwletów, EJB i JMS. default domyślna konfguracja, zawierająca usługi wchodzące w skład specyfkacji J2EE. all uruchamia wszystkie dostępne usługi. Zawiera RMI/IIOP, obsługę klastrów oraz narzędzia dla usług webowych (web-services deployer), które nie znajdują sie w konfguracji domyślnej. 20
Konfguracja serwera Pojedyncza konfguracja serwera składa się z podkatalogów: conf zawiera plik jboss-service.xml konfgurujący podstawowe usługi serwera oraz pliki konfguracyjne pozostałych usług. data - katalog na dane dla wbudowanej bazy Hypersonic. Używany ponadto przez JBossMQ (implementacja JMS) do przechowywania komunikatów. deploy miejsce na aplikacje użytkownika (pliki jar, war oraz ear). lib biblioteki jar używane w danej konfguracji serwera. Można tutaj umieszczać własne pliki: np. biblioteki JDBC. log miejsce na logi serwera - tworzone są z wykorzystaniem log4j. tmp katalog tymczasowy do przechowywania rozpakowanych aplikacji, work katalog roboczy wykorzystywany przez Tomcat'a do kompilacji plików. 21
Uruchomienie aplikacji Technologia J2EE została zaprojektowana tak, aby kod aplikacji był niezależny od serwera na którym jest ona uruchamiana. Deskryptory dla EJB oraz aplikacji (odpowiednio ejb-jar.xml i web.xml) także nie muszą być modyfkowane przy zmianie kontenera J2EE. Jednakże w celu uruchomienia aplikacji na konkretnym serwerze zwykle należy dostarczyć specyfczne deskryptory oraz skrypty sterujące pracą bazy danych. JBoss używa następujących dodatkowych plików: jboss.xml opis EJB, jboss-web.xml opis aplikacji, application-client.xml, jbosscmp-jdbc.xml. 22
Uruchomienie prostej aplikacji Aplikację przygotowujemy tak jak dla serwera Tomcat i kopiujemy ją(plik jar, war lub ear) do podkatalogu \server\default\deploy a następnie w przeglądarce uruchamiamy stronę: http://localhost:8080/nazwa_aplikacji/skrypt_lub_servlet 23
Podsumowanie partnerzy biznesowi aplety, aplikacje, RMI, CORBA przeglądarka www serwlety strony JSP komponenty EJB komponenty encyjne złącza inny system wewnętrzny partner biznesowy SQL 24