Università degli studi di Roma “Tor Vergata” Facoltà di Ingegneria Processi BPEL Corso di Sistemi Distribuiti Stefano Iannucci Anno accademico 2009/10 Email: [email protected] Obiettivi z Esercitazione pratica su: z z z creazione e gestione di web services orchestrazione di web services con Business Process Execution Language (BPEL) Requisiti software: z IDE NetBeans 6.7.1 z Application server GlassFish 2 z OpenESB z Disponibili in un unico pacchetto: https://open-esb.dev.java.net/Downloads.html 1 Passi per la creazione di un web service z z Creazione di un modulo EJB Creazione di un Session Bean di tipo Web Service all'interno del progetto z Definizione delle operazioni (metodi) esposti z Implementazione della business logic z Deployment 2 Creazione di un “echo” web service z Creare un nuovo progetto di tipo Java EE → EJB Module z Impostare il nome di progetto a “LezWS” z Scegliere come application server Glassfish V2 z Scegliere come versione Java EE: “Java EE 5” 3 Creazione di un “echo” web service (2) z Click col pulsante destro sul nome del progetto z Scegliere New → Web Service z Compilare la form come mostrato in figura 4 Creazione di un “echo” web service (3) z z z z Il nostro web service non è ancora pronto: dobbiamo definire almeno un'operazione (metodo) da poter invocare Aprendo il Session Bean appena creato, passiamo alla vista “Design” e clicchiamo su “Add Operation...” per aggiungere un'operazione Ci viene richiesto di fornire il nome, un tipo di output e zero o più tipi di input. Usiamo echo come nome, java.lang.String come tipo di output ed aggiungiamo un parametro di tipo java.lang.String L'ultima cosa è l'implementazione della business logic, molto semplice nel nostro caso: tornando sulla vista “Source” modifichiamo lo statement return null; con return parameter; 5 Deployment di un “echo” web service z z z z Siamo pronti per eseguire il deploy (pubblicazione) del servizio web. Click col pulsante destro sul nome del progetto → Deploy. L'IDE, tramite ant ed il file build.xml, compila il modulo creandone il jar, fa partire GlassFish e quindi pubblica il web service. Il web service è ora accessibile all'indirizzo: http://localhost:8080/EchoWSService/EchoWS z z Il WSDL è stato automaticamente generato ed è disponibile all'indirizzo: http://localhost:8080/EchoWSService/EchoWS?wsdl 6 Orchestrazione dei servizi web z z z z I web service consentono di realizzare in modo semplice, modulare, standard applicazioni distribuite Problema: i moduli di un'applicazione hanno la necessità di essere “connessi” tra loro Soluzione: introduciamo una logica di livello superiore, che esprime le modalità di invocazione dei servizi (esecuzione sequenziale, condizionale, ecc.) BPEL ci consente di definire tale logica come se stessimo costruendo un Activity Diagram UML e gli IDE ci facilitano il compito fornendo una comoda interfaccia grafica. 7 Esempio: UML Activity Diagram 8 BPEL: Relazioni con i Partner Partner Service Partner Service Partner Service z Partner: entità coinvolta nell'esecuzione del processo. Può essere: z un web service esterno z il client che invoca il processo 9 BPEL: caratteristiche generali z z z z Fornisce un modello dei dati universale per lo scambio di messaggi Manipola e trasforma i dati per interagire correttamente con i propri partner Implementa il processamento parallelo delle attività Gestisce le eccezioni ed implementa logiche di compensazione (cosiddette operazioni di undo) 10 BPEL: le attività z z Le attività in BPEL hanno la stessa valenza di quelle di un Activity Diagram UML Organizzate in: z Attività di base: esprimono una generica azione − z <invoke>, <receive>, <reply>, <assign>, <throw>, <wait>, <empty>, <exit> Attività strutturate: sono utilizzate per raggruppare attività di base − <if>, <while>, <repeatUntil>, <foreach>, <pick>, <flow>, <sequence>, <scope> 11 BPEL: l'attività <receive> z z z Tutti i processi sincroni prevedono la combinazione delle attività: <receive> e <reply>. L'attività <receive> esegue una wait bloccante aspettando che arrivi un messaggio (una richiesta). <receive> è l'attività delegata ad istanziare il processo business. La <receive> è associata a: z un Partner Link (canale di comunicazione con un Partner) z una operazione z una variabile di input 12 BPEL: l'attività <reply> z z z Nei processi sincroni viene utilizzata per rispondere al Partner Link che ha inviato il messaggio di richiesta, a conclusione del processo business. L'attività di <reply> può dare due tipi di risposta: z Risposta normale z Risposta con fault L'attività di <reply> è associata a: z un Partner Link z una operazione z una variabile di output 13 BPEL: l'attività <invoke> z z Attività utilizzata per invocare una determinata operazione di un Partner Link. L'attività <invoke> è associata a: z un Partner Link z una operazione z z una variabile di input (del tipo di input dell'operazione) una variabile di output (del tipo di output dell'operazione) 14 BPEL: l'attività <assign> z z z Consente di copiare il contenuto di variabili o campi di variabili complesse all'interno di altre variabili o campi E' composta da una o più <copy> ed ogni <copy> è composta da un <from> ed un <to> Due sintassi per l'identificazione dei dati: z z Semplice (utile per copiare dati tra due variabili o tra parti di variabili) Xpath (utile per copiare dati tra campi di variabili di tipo complesso) 15 BPEL: l'attività <assign> (2) z Esempio con identificazione semplice (questo presuppone che entrambe le variabili abbiano lo stesso tipo): <assign name="Assign1"> <copy> <from variable=”inVar”/> <to variable=”outVar”/> </copy> </assign> z Esempio con l'utilizzo di Xpath (questo presuppone che i campi di origine e destinazione abbiano lo stesso tipo): <assign name="Assign1"> <copy> <from>$inVar.part1/ns0:nome</from> <to>$outVar.part1/ns1:prenotazioneAlbergo</to> </copy> </assign> 16 BPEL: l'attività <assign> (3) z E' possibile identificare i dati in modo misto, sempre tenendo in considerazione i tipi di origine e destinazione. Esempio: <assign name="Assign1"> <copy> <from>$inVar.part1/ns0:nome</from> <to variable=”outVar”/> </copy> </assign> z Infine, è possibile utilizzare il costrutto <literal> per assegnare manualmente il valore ad una variabile 17 BPEL: attività strutturate z Attività <sequence> z z Attività <flow> z z Fornisce l'implementazione dei costrutti fork e join consentendo l'esecuzione parallela di attività Attività <while> e <repeatUntil> z z Consente l'esecuzione sequenziale di attività Forniscono la possibilità di eseguire cicli su attività secondo determinate condizioni espresse secondo una logica booleana Attività <if> z Implementa il costrutto di programmazione if – then – else fornendo la possibilità di esecuzione condizionale 18 di attività BPEL: attività scope z L'attività <scope> permette la creazione di “pacchetti” di attività. z z z z Ogni <scope> ne può contenere altri annidati Il suo utilizzo consente l'introduzione dei fault handlers tramite il costrutto <faultHandlers> Ogni fault handler può avere una o più attività <catch> ed al più un'attività <catchAll> z z z Ogni <scope> ha un'attività primaria, solitamente <sequence> o <flow> Le attività <catch> “catturano” eventi specifici come in Java L'attività <catchAll> cattura qualsiasi tipo di eccezione, come catch (Exception e) {;} Il “catching” viene eseguito a seguito di un “throw” 19 BPEL: attività throw z Un processo BPEL può fallire per vari motivi: z z z z Può esplicitamente lanciare un'eccezione L'invocazione di un servizio esterno può non andare a buon fine Possono verificarsi problemi a livello di ambiente d'esecuzione (es. fallimento di una join) Come in Java, possiamo sollevare esplicitamente un'eccezione con il costrutto <throw> 20 Passi per la creazione di un processo BPEL 1) Dobbiamo avere a disposizione i WSDL: • dei servizi da invocare • del processo stesso 2) Ogni WSDL ci consente di creare un PartnerLink, che può implementare due ruoli: • myRole: indica il processo stesso • partnerRole: indica il ruolo di un partner esterno 3) Dobbiamo strutturare il grafo di esecuzione Partner Service Partner Service Partner Service 21 Esempio: BPEL Process “Echo” 22 JBI, OpenESB z z Scopo di Java Business Integration (JBI): fornire un approccio per l'implementazione di una architettura orientata ai servizi (SOA) Due tipi di componenti implementano le specifiche JBI: “Service Engine” (SE) e “Binding Components” (BC). z z z I primi sono i servizi offerti dall'application server in uso (es. BPEL Engine, JavaEE Engine, SQL Engine, …) gli altri sono invece i componenti che consentono ai vari moduli applicativi presenti sull'application server di poter comunicare ai vari Service Engine in modo standard. OpenESB implementa i BC secondo le specifiche JBI. Esempi di BC implementati da OpenESB sono: HTTP BC, FTP BC, eMail BC. 23 Riferimenti z GlassFish ESB: https://open-esb.dev.java.net/ z WS-BPEL Oasis Standard: http://www.oasis-open.org/committees/wsbpel/ z JAX-WS: https://jax-ws.dev.java.net/ 24