Enterprise JavaBeans

Transkrypt

Enterprise JavaBeans
Enterprise JavaBeans
1. Architektura EJB:
●
komponenty encyjne,
●
komponenty sesyjne,
●
komponenty sterowane komunikatami.
2. Kontenery EJB
●
JBoss.
1
Enterprise JavaBeans
Enterprise JavaBeans (EJB) to specyfikacja 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
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 definiuje 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 messagedriven 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)
3
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)
4
Komponent encyjny
import javax.persistence.*;
@Entity
@Table(name="CABIN")
public class Cabin {
private int id;
private String name;
private int deckLevel;
@Id
@GeneratedValue
@Column(name="CABIN_ID")
public int getId( ) {
return id;'
}
public void setId(int pk) {
this.id = pk;
}
5
Komponent encyjny
@Column(name="CABIN_NAME")
public String getName( ) {
return name;
}
public void setName(String str) {
this.name = str;
}
@Column(name="CABIN_DECK_LEVEL")
public int getDeckLevel( ) {
return deckLevel;
}
public void setDeckLevel(int level) {
this.deckLevel = level;
}
}
6
Komponent encyjny deskryptor
Deskryptor jest inną formą określenia odwzorowania POJO na zapis w relacyjnej bazie
danych.
<entity-mappings>
<entity class="com.titan.domain.Cabin" access="PROPERTY">
<table name="CABIN"/>
<attributes>
<id name="id">
<column name="CABIN_ID" nullable="false"
column-definition="integer"/>
</id>
<basic name="name">
<column name="CABIN_NAME" nullable="false"
length="20"/>
</basic>
...
</attributes>
</entity>
</entity-mappings>
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ą sie 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
Komponent sterowany
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
Komponent sterowany
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
Komponent sterowany
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 (zalecana wersja 5.0)
Instalacja:
●
pobranie http://www.jboss.org/downloads/index
●
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 konfiguracyjne 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ą konfigurację
serwera. Konfiguracja może być przekazana przy uruchomieniu serwera poprzez
opcje -c <nazwa konfiguracji>.
19
Konfiguracje serwera
W podkatalogu server początkowo znajdują sie trzy konfiguracje:
●
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 konfiguracja, zawierająca usługi wchodzące w skład
specyfikacji 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 konfiguracji domyślnej.
20
Konfiguracje serwera
Pojedyncza konfiguracja serwera składa się z podkatalogów:
●
conf – zawiera plik jboss-service.xml konfigurujący podstawowe usługi
serwera oraz pliki konfiguracyjne 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 konfiguracji serwera. Można tutaj
umieszczać własne pliki: np. biblioteki JDBC.
●
log – miejsce na logi serwera - tworzone są z wykorzystaniem biblioteki 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ć modyfikowane przy
zmianie kontenera J2EE. Jednakże w celu uruchomienia aplikacji na konkretnym
serwerze zwykle należy dostarczyć specyficzne 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
„Hello World” i JBoss
Źródło: http://www.centerkey.com/jboss/
1. Piszemy stronę JSP (hi.jsp):
<html>
<head><title>JSP Test</title>
<%!
String msg = "Hello, World.";
%>
</head>
<body>
<h2><%= msg %></h2>
<%= new java.util.Date() %>
</body>
</html>
23
„Hello World” i JBoss
2. Deskryptor rozmieszczenia (WEB-INF/web.xml)
<web-app>
<display-name>Hello World</display-name>
</web-app>
3. Tworzymy plik war:
jar.exe" -cvf helloworld.war *.jsp WEB-INF
4. Kopiujemy aplikacje do katalogu serwera
copy helloworld.war "%JBossHome%\server\default\deploy
5. Uruchamiamy stronę:
http://adres.serwera.jboss:8080/helloworld/hi.jsp
24
Podsumowanie
partnerzy
biznesowi
aplety, aplikacje,
RMI, CORBA
przeglądarka www
strony JSP
serwlety
komponenty EJB
komponenty encyjne
złącza
inny system
wewnętrzny
partner biznesowy
SQL
25

Podobne dokumenty