Java wybrane technologie spotkanie nr 7 Enterprise Java Beans
Zagadnienia dotyczące systemów rozproszonych Zdalne wołanie metod (ang. Remote Method Invocation) Wielowątkowość (ang. Threading) Współpraca z bazą danych i systemami spadkowymi (ang. Back-end integration) Transakcje Równoważenie obciążenia (ang. Load balancing) Płynne przejmowanie zadań od komponentów, które uległy awarii (ang. Transparent failover) Czy stan serwera, który uległ awarii jest replikowany na inne serwery (ang. Clustering) Uaktualnienia działającego systemu (ang. Dynamic redeployment) Prowadzenie dziennika i audyt (ang. Logging and auditing) Monitorowanie i administrowanie działającym systemem (ang. System management) 2
Zagadnienia dotyczące systemów rozproszonych... Luźne sprzężenie przy pomocy komunikatów (ang. Message-oriented middleware) Tworzenie/niszczenie komponentów w zależności od obciążenia (ang. Component life cycle) Pule zasobów (ang. Resource pooling) Kontrola bezpieczeństwa na poziomie operacji (ang. Security) Pamięć podręczna (ang. Caching) 3
Serwery aplikacji Podobna funkcja serwera jak dla kontenerów webowych Jak zapewnić usługi śródprogramów (ang. Middleware services) zaprogramować samemu użyć serwera aplikacji Standaryzacja po dokonaniu wyboru nie było odwrotu zatrzymać użytkowników można jedynie przez dbanie o jakość! (patrz IE) Standaryzacja w innych dziedzinach: telewizja, telefony, paliwo samochodowe pozew Departamentu Sprawiedliwości przeciw IBM z 1980 r. (sprzęt, oprogramowani i usługi zostały rozdzielone) wojny przeglądarek pozwy Komisji Europejskiej 4
Technologia Enterprise JavaBeans Zalety: to wszechobecny standard są pracownicy dojrzała technologia (dużo dobrych praktyk i narzędzi) możliwa jest przenośność mimo, że nigdy nie jest za darmo aplikacje powstają szybciej, bo wiele usług jest oprogramowane w serwerach nie wszystkie usługi są wymagana przez specyfikację (używanie dodatkowych usług może ograniczyć przenośność) Dotychczas z EJB było jak z przysłowiową armatą na wróble czy EJB 3.0 to zmieni? Jeżeli nie EJB, to: lekkie zręby o otwartym kodzie (np. Spring).NET-managed components 5
Technologia Enterprise JavaBeans Typowe zastosowania EJB logika biznesowa: np. wyliczanie podatków dla listy zakupów, wysyłanie emaili z potwierdzeniami dostęp do bazy danych integracja z innymi systemami (Java EE Connector Architecture) Typowi klienci aplikacje (biurkowe, applety) dynamiczne WWW Web services (interfejs dla aplikacji) 6
7
Dostęp do usług wprost (ang. explicit) niższa efektywność pracy programistów trudniejsze pielęgnowanie większa kontrola niejawnie (ang. implicite) programiści skupiają się jedynie na logice biznesowej niektóre zmiany nie wymagają poprawiania kodu deksryptory/anotacje EJB zazwyczaj jest wybór między usługami jawnymi i niejawnymi (jak wiele kontroli potrzeba) specyfikacja nie narzuca sposobu realizacji dostępu niejawnego 8
Role efektywność vs elastyczność role sprawdzają się w zespołach średnich i dużych zespołach Bean Provider Application Assembler (architekt) EJB Deployer (wybór sprzętu, redundancja, strojenie) często kontakt z "centrum danych" System Administrator (nadzór nad działającym systemem) 9
Kontenery EJB http://java.sun.com/j2ee/licensees.html Komercyjne BEA WebLogic Sun Java System Application Server IBM WebSphere Oracle Application Server Otwarte JBoss Glassfish Apache Geronimo JOnAS 10
Rodzaje EJB inne technologie komponentowe jak DCOM,.NET i CORBA mają jeden rodzaj komponentów wiele wydłuża naukę, ale ułatwia dobrą organizację projektu Session beans (SB) stateless vs stateful Message-driven beans (MDB) ten sam cel, ale luźnie sprzężone Entity beans nie zmienione od wersji EJB 2.1 alternatywą jest Java Persistence API 11
Dostęp do beanów RMI-IIOP Internet Inter-ORB Protocol Java Message Service (JMS) Location Transparency Java Naming and Directory Interface (JNDI) java:comp/env/ (nie trzeba się odwoływać do rzeczywistych adresów zasobów) zdalny interfejs lokalny interfejs (od EJB 2.0) Web Services komponenty vs usługi (SOA) 12
Podstawy: Programowanie rozproszone zdalny interfejs zapewnia distribution transparency co najmniej raz/co najwyżej raz semantyka przekazywania parametrów technologie: OMG Common Object Request Broker Architecture (CORBA) Microsoft Distributed Component Object Model (DCOM) Sun Remote Method Invocation (RMI) gruboziarniste operacje 13
Model programistyczny EJB 3.0 14
Prościej niż w EJB 2.1 EJB 2.1 i EJB 3.0 można wymieszać nie ma interfejsu domowego dla stateless SB i MDB nie ma sensu dla stateful SB użytkownik może użyć dowolnej metody POJO nie trzeba dostarczać deskryptora kiedy deskryptor się przydaje? (podział ról w zespole) deskryptor ma większy priorytet od anotacji nie trzeba implementować specjalnych interfejsów i wypełniać ich metod dependency injection można zapomnieć o JNDI 15
Pule swapping pamięć wirtualna aktywacja/pasywacja zazwyczaj Last Recently Used (LRU) tylko dla beanów, których metody nie są w tej chwili wywoływane i które nie uczestniczą w transakcji dla socketów, połączeń JDBC, itp. @PrePassivate @PostActivate @PostConstruct i @PreDestroy klasy callback listener nie dotyczy ich DI 16
Pozostałe callbacki SL SF 17
Przykład interfejs zdalny package test; public interface CountRemote { public int count(); public void set(int val); public void remove(); 18
Przykład klasa beana package test; import javax.ejb.*; import javax.interceptor.interceptors; @Stateful @Remote(CountRemote.class) @Interceptors(CountCallbacks.class) public class CountBean implements CountRemote { private int val; public int count() { System.out.println("count()"); return ++val; public void set(int val) { this.val = val; System.out.println("set()"); @Remove public void remove() { System.out.println("remove()"); 19
Przykład callbacks public class CountCallbacks { public CountCallbacks() { @PostConstruct public void construct(invocationcontext ctx) throws Exception { System.out.println("cb:construct() "); ctx.proceed(); @PostActivate public void activate(invocationcontext ctx) throws Exception { System.out.println("cb:activate()"); ctx.proceed(); @PrePassivate public void passivate(invocationcontext ctx) throws Exception { System.out.println("cb:passivate()"); ctx.proceed(); @PreDestroy public void destroy(invocationcontext ctx) throws Exception { System.out.println("cb:destroy()"); ctx.proceed(); 20
public class CountClient { public static final int noofclients = 3; public static void main(string[] args) { try { Context ctx = new InitialContext(System.getProperties()); CountRemote count[] = new CountRemote[noOfClients]; int countval = 0; System.out.println("Instantiating beans..."); for (int i = 0; i < noofclients; i++) { count[i] = (CountRemote) ctx.lookup(countremote.class.getname()); count[i].set(countval); countval = count[i].count(); System.out.println(countVal); Thread.sleep(100); System.out.println("Calling count() on beans..."); for (int i = 0; i < noofclients; i++) { countval = count[i].count(); System.out.println(countVal); count[i].remove(); Thread.sleep(50); catch (Exception e) { e.printstacktrace(); Initializing beans... 1 2 3 Calling count on beans... 2 3 4 co z callbacks??? 21
<?xml version="1.0" encoding="utf-8"?> <ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" version="3.0" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd"> <description>stateful Session Bean Example</description> <display-name>stateful Session Bean Example</display-name> <enterprise-beans> <session> <ejb-name>countbean</ejb-name> <business-remote>examples.session.stateful_dd.count</business-remote> <ejb-class>examples.session.stateful_dd.countbean</ejb-class> <session-type>stateful</session-type> <transaction-type>container</transaction-type> </session> </enterprise-beans> <interceptors> <interceptor> <interceptor-class>examples.session.stateful_dd.countcallbacks </interceptor-class> <post-construct><lifecycle-callback-method>construct</lifecycle-callback-method></post-construct> <post-activate><lifecycle-callback-method>activate</lifecycle-callback-method></post-activate> <pre-passivate><lifecycle-callback-method>passivate</lifecycle-callback-method></pre-passivate> <!-- <pre-destroy><lifecycle-callback-method>destroy</lifecycle-callback-method></pre-destroy> --> </interceptor> </interceptors> <assembly-descriptor> <interceptor-binding> <ejb-name>countbean</ejb-name> <interceptor-class>examples.session.stateful_dd.countcallbacks </interceptor-class> </interceptor-binding> </assembly-descriptor> </ejb-jar> 22
Ułatwienia Ułatwienia JNDI Context ctx = new InitialContext(); //bezparametrowy konstruktor w pełni kwalifikowana nazwa klasy oraz java:comp/env/ejbjndi SessionContext Anotacje dla @Stateless, @Stateful i @MessageDriven name, mappedname, description @Local i @Remote mogą zawierać listę np. {X.class, Y.class Dependency Injection @Resource SessionContext ctx; @EJB InnyBean ib; @Resource(name="jdbc/ default",type=datasource.class) DataSource ds; @Resource int ala; //z env-entry 23
Interceptors @Interceptor i @Interceptors wskazują zewnętrzne klasy @AroundInvoke wskazują metodę programowanie aspektowe cross-cuting concern (bezpieczeństwo, logi, audyt) InvocationContext.proceed() 24