Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
Java wybrane technologiespotkanie nr 7
Enterprise Java Beans
2
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)
3
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)● ...
4
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
5
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
6
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)
7
8
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
9
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)
10
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
11
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
12
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)
13
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
14
Model programistyczny EJB 3.0
15
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
16
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
17
Pozostałe callbacki
SL SF
18
Przykład – interfejs zdalnypackage test;
public interface CountRemote { public int count(); public void set(int val); public void remove();}
19
Przykład – klasa beanapackage 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()"); }}
20
Przykład – callbackspublic 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(); } }
21
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...123Calling count on beans...234
co z callbacks???
22
<?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>
23
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
24
Interceptors● @Interceptor i @Interceptors wskazują zewnętrzne klasy● @AroundInvoke wskazują metodę● programowanie aspektowe
– cross-cuting concern (bezpieczeństwo, logi, audyt)– InvocationContext.proceed()