mw05 Java Ee
mw05 Java Ee
Architetture Software
I
Introduzione
d i a J
Java EE
Dispensa MW 5
ottobre 2008
- Fonti
Java Platform, Enterprise Edition
http://java.sun.com/javaee/
Argomenti
introduzione alla piattaforma Java EE
Enterprise Bean
Session bean
Message-driven bean
Java EE e qualità
Java EE
Alcuni obiettivi di Java EE
modello di programmazione semplificato
ma richiede una comprensione degli aspetti architetturali e di
altri aspetti resi trasparenti
supporto per qualitàli à architetturalmente
hi l significative
i ifi i
portabilità, disponibilità e scalabilità, sicurezza, apertura, ... –
ma come sono ottenute?
supporto per l’integrazione di sistemi esistenti
Contenitori
* Enterprise Bean
Gli Enterprise Bean sono componenti Java EE che implementano
la tecnologia EJB
componenti server-side
la specifica EJB definisce un “modello (standard) per
componenti
componenti”
si tratta dunque di un’architettura basata su componenti
in applicazioni multi-livello
per implementare logica applicativa
per usufruire di servizi forniti dal contenitore EJB come gestione
delle transazioni, controllo della concorrenza, affidabilità,
sicurezza, scalabilità
poiché questi servizi sono disponibili, lo sviluppatore può
concentrarsi sulla soluzione di problemi di business
componenti portabili,
portabili e che possono essere riusati in
applicazioni diverse
20 Introduzione a Java EE Luca Cabibbo – SwA
Tipi di enterprise Bean
Due tipi di enterprise bean
session bean
esegue un compito per un client
message-driven bean
agisce come un listener per un certo tipo di messaggi
Session bean
Session bean
un session bean esegue un compito per un cliente –
rappresenta un singolo client all’interno dell’AS
serve ad implementare (incapsulare) logica applicativa
specifica per il cliente
il suo stato può riflettere (o meno) la sua interazione con un
client particolare
in linea di principio non è condiviso tra più client
Message-driven bean
Message-driven bean
un message-driven bean consente di elaborare messaggi in
modo asincrono – agisce come un listener di messaggi JMS o
altri tipi di messaggi
definisce un metodo onMessage – invocato dal contenitore
quando è disponibile un messaggio – così come doPost di
una servlet è invocato dal contenitore quando viene ricevuta
una richiesta http
la destinazione da cui riceve messaggi è specificata dal suo
d
descrittore
itt di deployment
d l t
ad es., per la gestione di workflow
Nota
i session bean possono essere usati per inviare e ricevere
messaggii JMS iin modo
d sincrono
i – ma non in i modo
d asincrono
i
Modello di programmazione
Accesso locale
oltre all’interfaccia remota, un session bean può offrire servizi
localmente, mediante un’interfaccia locale
i servizi locali possono essere acceduti solo da componenti
client che risiedono nello stesso contenitore
per brevità, ignoriamo questo aspetto
package hello;
import javax.ejb.Remote;
@Remote
@R t
public interface HelloRemote {
d compilare
da il e ffare il d
deploy
l su un AS
package hello;
import javax.ejb.Stateless;
@Stateless(mappedName=“ejb/Hello”)
@Stateless(mappedName= ejb/Hello )
public class Hello implements HelloRemote {
/* iimplementa
l t i metodi
t di d
dell’interfaccia
ll’i t f i remota
t */
public String hello(String name) {
return “Hello, ” + name + “!”;
}
}
sono possibili diverse convenzioni con i nomi
• HelloRemote per l’interfaccia
• HelloBean,
HelloBean HelloImpl o Hello per l’implementazione
l implementazione
package hello.client;
iimportt javax.ejb.EJB;
j jb EJB
import hello.HelloRemote;
public HelloClient() { }
...
}
da compilare ed eseguire
come application client
EJB ed annotazioni
Nel codice mostrato, le annotazioni rivestono un ruolo importante
@Remote, @Local, @Stateless e @Stateful dichiarano il ruolo
svolto dalle diverse unità di programmazione
nell’esempio, quando verrà fatto il deploy dell’applicazione, il
session bean sarà registrato sul server JNDI
con un nome di default o con il nome indicato
esplicitamente – ejb/Hello
hanno a che fare con le “interfacce fornite”
@@EJB indica una dependency
p y injection
j
prima di iniziare l’esecuzione dell’application client, verrà
effettuata una ricerca sul server JNDI di un EJB di tipo
H ll R
HelloRemote t (ejb/Hello)
( jb/H ll ) – il riferimento
if i t remoto
t all bean
b
memorizzato nella variabile hello
ricerca con un nome indicato esplicitamente o di default
Modello di programmazione
Si noti anche che
l’enterprise bean non viene mai creato esplicitamente dal
programmatore
come una servlet, viene creato dal contenitore, se e quando
serve
le chiamate al bean sono in realtà chiamate remote
come in Java RMI
come per le servlet, ci aspettiamo che il bean possa definire dei
metodi che verranno chiamati dal contenitore – e non dai suoi
client remoti
in momenti specifici della vita del bean
Interfaccia remota
package counter;
import javax.ejb.Remote;
@Remote
public interface CounterRemote {
/* incrementa il contatore e restituisce il suo valore */
public
bli int
i t count();
t()
}
import
p jjavax.ejb.Stateful;
j ;
import javax.annotation.*;
@Stateful(mappedName=“ejb/Counter”)
@Stateful(mappedName ejb/Counter )
public class CounterBean implements CounterRemote {
private int val;
import javax.ejb.EJB;
javax ejb EJB;
import counter.CounterRemote;
public CounterClient() { }
Attivazione e passivazione
Il contenitore EJB gestisce un pool di oggetti EJB
assegna le richieste ad oggetti in questo pool
può decidere di riassegnare un oggetto, inizialmente assegnato
ad un client, ad un client diverso
il client
li di
diverso potrebbe
bb non aver ancora completato
l lla sua
sessione
Similitudini e differenze
I message-driven bean sono simili ai session bean stateless
le istanze sono equivalenti, poiché non gestiscono stato
conversazionale
un message-driven bean può elaborare messaggi da più clienti
import
p jjavax.ejb.*;
j ;
import javax.jms.*;
import java.util.logging.*;
@MessageDriven(
activationConfig = {
@ActivationConfigProperty(
propertyName = "destinationType",
propertyValue = "javax.jms.Queue"
) }},
mappedName = “jms/MyQueue")
public class SimpleMessageConsumer implements MessageListener {
...
try {
if (message instanceof TextMessage) {
TextMessage msg = (TextMessage) message;
logger.info("SimpleMessageConsumer: Message received: " +
msg.getText());
} else {
logger.warning("Message of wrong type: " +
message.getClass().getName());
}
} catch (Exception e) {
System.err.println("Exception in SimpleMessageConsumer");
e.printStackTrace();
}
}
da compilare e fare il deploy su un AS
50 Introduzione a Java EE Luca Cabibbo – SwA
* Java EE e qualità
La piattaforma Java EE si propone di sostenere/realizzare un
certo numero di qualità
alcune tipiche per applicazioni web e applicazioni distribuite
altre più strategiche
Costruibilità
Costruibilità
obiettivi
alcuni servizi comuni devono poter essere gestiti in modo
semplice – ad es., transazioni, sicurezza, servizi di naming,
...
come raggiunta
la specifica impone che i contenitori implementino diversi
servizi comuni pronti da usare
servizi specificati
p spesso
p a livello di rilascio – i descrittori di
deployment consentono di selezionare e configurare i servizi
da usare
tattiche
t tti h usate t
abstract common services, maintain interfaces, hide
information
Trasparenza nell’implementazione
Trasparenza nell’implementazione
obiettivi
fornire una trasparenza completa in modo che programmi
client possano essere indipendenti dai dettagli
implementativi – ad es.,
es piattaforma hw/sw,
hw/sw posizione dei
componenti, ...
come raggiunta
l’uso di interfacce (remote e locali) incoraggia il
disaccoppiamento tra interfaccia e implementazione
le decisioni relative alle implementazioni degli enterprise
bean sono quindi trasparenti ai suoi client
tattiche
t tti h usate t
maintain existing interfaces, semantic coherence
Evolvibilità/estendibilità
Evolvibilità/estendibilità
obiettivi
possibilità di adottare diverse tecnologie in modo
incrementale
possibilità
ibili à di iincorporare nuove tecnologie
l i quandod iintrodotte
d
come raggiunte
specifiche partizionate in categorie (ad eses., web tier
tier, EJB
tier) – che possono essere adottate ed evolvere
separatamente
p
specifica basata su componenti consente estensioni future –
alcune tecnologie attuali erano assenti in versioni precedenti
tattiche usate
semantic coherence, hide information
anticipate
ti i t expected t d changes
h
Prestazioni
Prestazioni
obiettivi
il sistema deve rispondere rapidamente agli utenti
come raggiunta
l’approccio a componenti distribuiti rende possibile la
ridistribuzione del carico e il tuning
tattiche usate
configuration files, load balancing, maintain multiple copies
Sicurezza
Sicurezza
obiettivi
autenticazione e autorizzazioni
come raggiunta
la specifica definisce diversi meccanismi per la sicurezza –
dichiarativi, basati su ruoli e programmabili
tattiche usate
authentication, authorization, data confidentiality