Enterprise Java Beans Narzędzia i Aplikacje Java EE Michał Piotrowski Michał Wójcik Waldemar Korłub Katedra Architektury Systemów Komputerowych Wydział Elektroniki, Telekomunikacji i Informatyki Politechnika Gdańska 30 października 2017 Waldemar Korłub (KASK, ETI, PG) EJB 30 października 2017 1 / 26
Enterprise Java Beans Enterprise Java Beans (EJB): beany zarządzane przez kontener serwera aplikacji, kontener udostępnia programiście dodatkowe usługi jak zarządzanie transakcjami, bezpieczeństwem, itd, potrafi równoważyć obciążenie na kilka serwerów aplikacji (skalowalność), klientem dla EJB może być wiele typów aplikacji (nie tylko moduł war), bardzo dobrze nadają się do duzych aplikacji rozproszonych, dzięki uproszczonemu tworzeniu i wdrażaniu EJB dobrze wspomagają tworzenie mniejszych aplikacji. Waldemar Korłub (KASK, ETI, PG) EJB 30 października 2017 2 / 26
Rodzaje EJB Rodzaje EJB: Sesyjne wykonują określone zadania dla klienta: bezstanowe, stanowe, singleton; sterowane komunikatami (message-driven) dają możliwość luźnego łączenia komponentów aplikacji. Waldemar Korłub (KASK, ETI, PG) EJB 30 października 2017 3 / 26
Interfejsy EJB Sesyjne EJB mogą udostępniać dwa rodzaje interfejsów: lokalny: może być zadeklarowany jako interfejs Javy lub być w postaci metody publicznych implementacji EJB, może być spakowany w module EJB jak i w module webowym, klienty muszą działać w tej samej maszynie wirtualnej co serwer, mogą z nich korzystać aplikacje webowe i inne EJB, ich położenie nie jest przezroczyste dla klienta; zdalny: muszą być spakowane w module EJB, klienty mogą działać w innej maszynie wirtualnej niż EJB, mogą z nich korzystać aplikacje webowe, inne EJB, oddzielne aplikacje klienckie, ich położenie jest przezroczyste dla klienta. Waldemar Korłub (KASK, ETI, PG) EJB 30 października 2017 4 / 26
Interfejsy EJB różnice Pisząc aplikację wykorzystującą interfejsy zdalne należy pamiętać o kilku ważnych aspektach: argumenty i rezultaty metod EJB muszą być serializowalne, nie jest możliwe przekazywanie z warstwy EJB obiektów encyjnych, których pola są pobierane z opóźnieniem (tzw. lazy fetch): można wymusić stosowanie natychmiastowego pobierania wszystkich pól, można udostępnić zestaw funkcji pozwalających na pobieranie dodatkowych danych z opóźnieniem; może być wymagane spaczkowanie definicji interfejsów EJB i klas encyjnych zarówno z modułem EJB jak i z wykorzystującymi go modułami webowymi lub klienckiki: jeśli wyłączy się ww. elementy do oddzielnego archiwum JAR trzeba inaczej adnotować klasy EJB i definiować jednostkę trwałości. Waldemar Korłub (KASK, ETI, PG) EJB 30 października 2017 5 / 26
Tworzenie EJB Na EJB składają się: klasy implementujące funkcjonalność EJB, opcjonalne interfejsy biznesowe: remote dla dostępu zdalnego do EJB, local dla dostępu lokalnego do EJB; inne klasy z których korzystają EJB, opcjonalne deskryptory opisujące EJB. Waldemar Korłub (KASK, ETI, PG) EJB 30 października 2017 6 / 26
Sesyjne EJB Klasa beana: musi posiadać odpowiednią adnotację (@Stateless, @Statefull, @Singleton), musi być publiczna i nie może być abstrakcyjna ani finalna, musi implementować metody biznesowe, musi mieć publiczny, bezparametrowy konstruktor, nie może definiować metody finalize(), może posiadać metody asynchroniczne (@Asynchronous), nazwy metod nie mogą zaczynać się od prefiksu ejb. Waldemar Korłub (KASK, ETI, PG) EJB 30 października 2017 7 / 26
Sesyjne EJB Możliwość definiowania metod wywoływanych na określonych etapach cyklu życia EJB poprzed odpowiednie adnotacje na metodach o sygnaturze void...(): @PostConstruct wywołana po wstrzyknięciu zależności, @PreDestroy wywołana przed usunięcie beana przez kontener, @PrePassivate wywołana przed zatrzymaniem beana stanowego, @PostActivate wywołana po aktywowaniu zatrzymanego beana stanowego. Waldemar Korłub (KASK, ETI, PG) EJB 30 października 2017 8 / 26
Timer Service Timer Service: usługa serwera aplikacji, która umożliwia wywoływanie określonych działań o określonym czasie i co określony czas, zdarzenia, które wysyła usługa timera mogą odbierać EJB: sesyjne bezstanowe, message-driven; EJB z przypisanym timerem musi: implementować bezargumentową lub jednoargumentową metodę adnotowaną @Timeout lub @Schedule, lub implementować interfejs javax.ejb.timedobject; domyślnie uruchomione timery są zapamiętywane pomiędzy uruchomieniami serwera. Waldemar Korłub (KASK, ETI, PG) EJB 30 października 2017 9 / 26
Java Message Service Java Message Service: komunikacja p2p luźno powiązana, komunikacja asynchroniczna, dostarczenie wiadomości jest gwarantowane, dostępna jest opcja niegwarantowanego dostarczania wiadomości, może być wykorzystywana nie tylko z Java EE, administrator tworzy: cel (destination): queue może mieć tylko jednego konsumenta, topic może mieć dowolną liczbę konsumentów; fabryki połączeń (connection factories). Waldemar Korłub (KASK, ETI, PG) EJB 30 października 2017 10 / 26
Java Message Service Java Message Service: nadawca i odbiorca nie muszą o sobie wiedzieć, elementy: JMS provider system wymiany wiadomości, implementacja Java EE musi go zawierać, JMS clients konsumenci i producenci wiadomości, Messages obiekty wymieniane w wiadomościach, Administered objects obiekty wykorzystywane przez klientów: cele, fabryki połączeń. Waldemar Korłub (KASK, ETI, PG) EJB 30 października 2017 11 / 26
JMS cele Kolejka: tylko jeden konsument na wiadomość, brak zależności czasowych, odbiorca potwierdza przetworzenie wiadomości. Temat: możliwość istnienia wielu konsumentów na wiadomość, zależności czasowe. Waldemar Korłub (KASK, ETI, PG) EJB 30 października 2017 12 / 26
JMS wymiana wiadomości Konsumpcja wiadomości: synchroniczna: blocking receive, asynchroniczna: message listener. Waldemar Korłub (KASK, ETI, PG) EJB 30 października 2017 13 / 26
JMS wiadomości Wiadomości składają się z: nagłówka: część pól ustawiana jest automatycznie, część można ustawić ręcznie; właściwości: mogą służyć do filtrowania wiadomości, np. typy, kategorie, wiadomości; ciała wiadomości: zależy od typu wiadomości. Waldemar Korłub (KASK, ETI, PG) EJB 30 października 2017 14 / 26
JMS wiadomości Wiadomości JMS: dostępnych jest sześć typów wiadomości: TextMessage przesyłanie obiektów String, MapMessage mapy String dowolny typ prymitywny, BytesMessage wiadomość binarna, StreamMessage strumień wartości prymitywnych typów, ObjectMessage serializowalny obiekt, Message zawiera tylko nagłówek i właściwości (bez ciała wiadomości); mozliwe jest ustawienie priorytetów wiadomości i czasu ważności, JMS ma własny mechanizm transakcji dostępny dla klientów, którzy nie wykonują się w serwerze aplikacji. Waldemar Korłub (KASK, ETI, PG) EJB 30 października 2017 15 / 26
Message-Driven EJB Message-Driven EJB: pozwala na asynchroniczne przetwarzanie komunikatów, klienty nie korzystają z nich przy pomocy interfejsów, ten typ EJB składa się tylko z klasy beana, nie posiadają stanu, wykorzystują Java Message Service (JMS). Waldemar Korłub (KASK, ETI, PG) EJB 30 października 2017 16 / 26
Klasy Message-Driven EJB Klasy Message-Driven EJB: posiadają adnotację @MessageDriven i implementują interfejs MessageListener, implementują jedną metodę onmessage, która jest wywoływana po otrzymaniu wiadomości tu znajduje się cała logika biznesowa, może zawierać metody wywoływane w określonych etapach cyklu życia beana. Waldemar Korłub (KASK, ETI, PG) EJB 30 października 2017 17 / 26
Cykl życia bezstanowego sesyjnego EJB 1 2 Dependency injection, if any PostConstruct callback, if any Does Not Exist Ready PreDestroy callback, if any Rysunek: Bezstanowy sesyjny EJB Waldemar Korłub (KASK, ETI, PG) EJB 30 października 2017 18 / 26
Cykl życia sesyjnego singletona EJB 1 2 Dependency injection, if any PostConstruct callback, if any Does Not Exist Ready PreDestroy callback, if any Rysunek: Sesyjne singleton EJB Waldemar Korłub (KASK, ETI, PG) EJB 30 października 2017 19 / 26
Cykl życia stanowego sesyjnego EJB 1 2 3 4 Create Dependency injection, if any PostConstruct callback, if any Init method, or ejbcreate<method>, if any PrePassivate callback, if any Does Not Exist Ready Passive 1 2 Remove PreDestroy callback, if any PostActivate callback, if any Rysunek: Stanowy sesyjny EJB Waldemar Korłub (KASK, ETI, PG) EJB 30 października 2017 20 / 26
Cykl życia EJB sterowanego komunikatami 1 2 Dependency injection, if any PostConstruct callback, if any Does Not Exist onmessage Ready PreDestroy callback, if any Rysunek: Message driven EJB Waldemar Korłub (KASK, ETI, PG) EJB 30 października 2017 21 / 26
Persistence w warstwie EJB Persistence w warstwie EJB: klasy encyjne (mechanizmu trwałości) w warstwie EJB tworzy się tak samo jak w warstwie webowej, bezpośrednio mogą z nich korzystać wyłącznie inne klasy znajdujące się w tym samym module EJB, inne moduły (warstwy) aplikacji korzystają z klas encyjnych za pomocą odpowiednio stworzonych fasad, typowo fasadami są bezstanowe, sesyjne EJB. Waldemar Korłub (KASK, ETI, PG) EJB 30 października 2017 22 / 26
Transakcje Transakcje zarządzane przez kontener: W przypadku transakcji zarządzanych przez kontener to kontener rozpoczyna i kończy transakcje bazując na odpowiednich adnotacjach. Dostępne są następujące opcje transkacji: 1 Required (domyślne ustawienie), 2 RequiresNew, 3 Mandatory, 4 NotSupported, 5 Supports, 6 Never. Waldemar Korłub (KASK, ETI, PG) EJB 30 października 2017 23 / 26
Transakcje zarządzane przez kontener Transakcje zarządzane przez kontener: można wyspecyfikować typ transakcji dla: całego beana, wybranych metod biznesowych a w beanach typu message-driven dla metod onmessage; anulowanie transakcji zarządzanych przez kontener następuje: przez wywołanie setrollbackonly() na EJBContext dostęp do EJBContext można uzyskać adnotacją @Resource, automatycznie jeśli wystąpi wyjątek systemowy; używając tego typu transakcji nie wolno korzystać z: metod: commit, setautocommit, rollback klasy java.sql.connection, metod klasy javax.transaction.usertransaction. Waldemar Korłub (KASK, ETI, PG) EJB 30 października 2017 24 / 26
Tworzenie aplikacji klienckiej Java EE Aplikacje kliencie: klientem EJB może być dowolna aplikacja napisana w Javie (inne języki i środowiska są możliwe), w aplikacji klienckiej można korzystać wyłącznie z interfejsów zdalnych EJB, dostęp do EJB uzyskuje się przy pomocy adnotacji lub JNDI: adnotacje działają tylko w klasie głównej aplikacji; aplikacja kliencka może mieć deskryptor application-client.xml, klasa główna aplikacji i zależności od innych bibliotek są podawane w manifeście JAR-a, do uruchomienia aplikacji klienckiej potrzebny jest dostęp do: bibliotek klienckich serwera aplikacji, bibliotek z interfejsami zdalnymi EJB oraz klasami (interfejsami) współdzielonymi w aplikacji klienckiej i module EJB. Waldemar Korłub (KASK, ETI, PG) EJB 30 października 2017 25 / 26
Uruchamianie aplikacji klienckiej Java EE Aplikacje kliencie: aplikacja kliencka uruchamiana jest w specjalnym kontenerze klienckim, sposób uruchamiania aplikacji jest zależny od serwera aplikacji. Często dołączany jest skrypt lub program uruchamiający, jeśli aplikacja kliencka jest uruchamiana na innym komputerze niż serwer aplikacji, to musi mieć otwarty dostęp do odpowiednich portów serwera aplikacji, m.in.: usługi JNDI, portów pozwalających na wołanie EJBContext,... jest możliwe uruchomienie aplikacji klienckiej bez kontenera klienckiego, ale wymaga to dodatkowych działań konfiguracyjnych oraz dołączenia bibliotek klienckich serwera aplikacji. Waldemar Korłub (KASK, ETI, PG) EJB 30 października 2017 26 / 26