Nel precedente articolo è stata fornita una panoramica generale riguardo ai concetti fondamentali del linguaggio BPEL. In questo articolo e nel successivo, si presenterà più in dettaglio la creazione di un semplice processo, illustrando le caratteristiche dei singoli step di creazione.
Introduzione
Nel precedente articolo si è fatta una panoramica generale sui concetti di orchestrazione e coreografia di servizi Web, introducendo la tecnologia BPEL e le sue caratteristiche fondamentali. in questo articolo viene presentato in dettaglio un processo BPEL, analizzando puntualmente i costrutti fondamentali e le regole di implementazione. Come strumento per la creazione del processo, è stato utilizzato Oracle JDeveloper, un IDE che mette a disposizione un editor visuale per la gestione del linguaggio BPEL.
Caratteristiche Fondamentali
Oracle BPEL Process Manager è una piattaforma user-friendly che fornisce supporto per il design, il deploy e il management dei processi di business BPEL. Essa si compone di tra parti fondamentali:
BPEL Designer
Fornisce un’interfaccia grafica per la creazione dei processi. La caratteristica fondamentale che lo contraddistingue dagli altri strumenti grafici è che il codice BPEL generato è nativo, ossia non include costrutti personalizzati, il che rende il processo generato portabile su ogni engine.
BPEL Server
Si compone principalmente di tre parti:
- Core BPEL Engine: costituisce il vero cuore del server. Esso provvede quindi all’esecuzione dei processi BPEL, e, inoltre, mantiene memorizzato lo stato dei processi di lunga durata in un suo personale database.
- Built-in integration services: OBPM include al suo interno il supporto per diverse tecnologie utili alla gestione di un processo e all’elaborazione dei dati trattati al suo interno. Come è stato detto nel precedente articolo, il linguaggio BPEL è sostanzialmente XML-Based, per cui include tecnologie come XQuery e XSLT, utili al management delle informazioni trattate.
- WSDL binding framework: come ci si poteva aspettare, è incluso all’interno anche un framework per la collaborazione con i web service, attraverso protocolli SOA. Oltre a questo, però, OBPM permette anche l’integrazione con tecnologie Java, JMS, email, JCA e altro.
BPEL Console
Consiste in una interfaccia web-based per il management, l’amministrazione e il debugging dei veri processi deployati. L’interfaccia presenta sia una visualizzazione Audit trail, ossia visualizzando graficamente i vari step che il processo sta eseguendo, oppure una visualizzazione ‘process history’, ossia il codice realmente in esecuzione.
La struttura della piattaforma può essere schematizzata come in figura 1:
Figura 1 – Architettura BPEL
Getting Started
La creazione di un processo BPEL può essere fatta seguendo il wizard fornito da JDeveloper, che genera in automatico lo scheletro essenziale del processo.
Figura 2 – Il wizard per la creazione del progetto BPEL
Come si può vedere dalla figura 3, il pannello principale di JDeveloper mostra 5 finestre chiave.
Figura 3 – Le principali finestre di JDeveloper
La finestra centrale mostra il diagramma visuale del processo BPEL. Quello in figura mostra un processo che effettua semplicemente l’echo della variabile di input. Spostandosi di tab, JDeveloper permette allo sviluppatore di interagire direttamente con il codice, dando così il pieno controllo sull’implementazione del processo. Le finestre laterali mostrano rispettivamente il pannello di navigazione, la struttura del processo (con evidenza sull’attività selezionata), i pannelli di log e il pannello dei componenti ammessi per l’utilizzo del processo.
Struttura del linguaggio
Il processo visuale mostrato in figura genera il seguente codice:
targetNamespace="http://xmlns.oracle.com/BPELProcess"
xmlns_xsd="http://www.w3.org/2001/XMLSchema"
xmlns_bpws="http://schemas.xmlsoap.org/ws/2003/03/business-process/"
xmlns_xp20="http://www.oracle.com/XSL/Transform/java/oracle.tip.pc.services.functions.Xpath20"
xmlns_ldap="http://schemas.oracle.com/xpath/extension/ldap"
xmlns_bpelx="http://schemas.oracle.com/bpel/extension"
xmlns_client="http://xmlns.oracle.com/BPELProcess"
xmlns_ora="http://schemas.oracle.com/xpath/extension"
xmlns_orcl="http://www.oracle.com/XSL/Transform/java/oracle.tip.pc.services.functions.ExtFunc">
partnerLinkType="client:BPELProcess"
myRole="BPELProcessProvider"
partnerRole="BPELProcessRequester"/>
messageType="client:BPELProcessRequestMessage"/>
messageType="client:BPELProcessResponseMessage"/>
portType="client:BPELProcess" operation="initiate"
variable="inputVariable" createInstance="yes"/>
query="/client:BPELProcessProcessRequest/client:input"/>
query="/client:BPELProcessProcessResponse/client:result"/>
portType="client:BPELProcessCallback" operation="onResult"
inputVariable="outputVariable"/>
Dal listato precedente si evidenziano le strutture minime per la definizione di un processo, analizzate in dettaglio.
Tag
Questo tag costituisce la root del processo, all’interno della quale è contenuta tutta la logica del processo. Comprende di fatto le informazioni generiche del processo, come il nome, i vari namespaces, e i riferimenti agli XSD ( XML schema definition ).
Tag
Una delle principali funzioni del linguaggio BPEL è proprio l’interazione con i Web Service. La realizzazione di questa comunicazione viene fatta attraverso la definizione di due informazioni, codificate sia nel processo BPEL, che nel WSDL del servizio coinvolto. Il listato mostra un esempio:
partnerLinkType="myPartnerLinkType"
myRole="client" />
partnerLinkType="myPartnerLinkType"
partnerRole="service" />
Come si può vedere, vengono effettuate due definizioni.
Nel WSDL viene introdotta un’estensione per garantire l’interazione con il processo BPEL, ossia la definizione di un
Nel processo BPEL, invece, vengono definiti dei partner link che istanziano di fatto la comunicazione con il servizi, possono essere quindi visti come una specifica istanza di una classe di partnerLink più generica, ossia il partnerLinkType.
Una volta definita questa corrispondenza, BPEL si occupa di utilizzare alcuni costrutti base del WSDL per generare concretamente la comunicazione.
Tag
In questa sezione vengono definite le variabili utilizzate per lo svolgimento del processo. Si possono avere due tipi di variabili:
- variabili di interazione con servizi esterni;
- variabili interne;
Nel primo caso, si tratta di variabili che modellano i messaggi di scambio nelle comunicazioni con i web service: per questo motivo, il tipo di variabili deve essere necessariamente un messagio, in modo da essere incapsulato per la trasmissione soap. Si nota quindi come questo tipo di tag abbia come attributi il nome della variabile, e il messaggio a cui fa riferimento.
Nel secondo caso, invece, la definizione della variabile avviene come in qualsiasi linguaggio di programmazione, ossia definendo nome e tipo della stessa.
Tag
All’interno di questo tag viene racchiusa l’intera Orchestration Logic del processo. Nel listato presentato, si possono localizzare tre activity separate
receive
Rappresenta l’activity di ingresso del processo. Più precisamente, rappresenta la ricezione di un messaggio. Come si può vedere dalla figura 4, il pannello per la configurazione di questa activity permette di decidere se, alla ricezione di un nuovo messaggio, si debba creare una nuova istanza del processo, oppure se si sta semplicemente ricevendo un messaggio: questa differenziazione è utile in caso di chiamate a web service orchestrati da BPEL, in quanto evita di creare nuove istanze ogni volta che viene restituita da essi la risposta della loro elaborazione al processo stesso.
Figura 4 – JDeveloper: receive
assign
L’attività di assign permette di copiare valori da una variabile all’altra, utilizzando il linguaggio XPath per la selezione degli elementi desiderati all’interno della stringa XML. Come si può vedere dalla figura 5, questa attività permette in realtà diverse operazioni, oltre alla semplice copia di valori, quali ad esempio la gestione delle liste, l’append dei valori a seguito ed altri ancora, visibili nella lista a scorriment del pannello. Una particolarità interessante è il fatto che questa attività permette anche di stabilire l’ordine di esecuzione delle singole operazioni di assegnazione, in modo da racchiudere in una stessa assign diverse attività.
Figura 5 – JDeveloper: assign
invoke
L’attività di invoke è utilizzata per chiamare una operazione di un web service. La chiamata può essere effettuata in maniera sincrona o asincrona, e BPEL gestisce questa distinzione in maniera implicita, ossia a seconda degli attributi che trova valorizzati all’interno dell’activity. Infatti, nella chiamata ad un servizio, deve essere obbligatoriamente specificata la variabile di ingresso, ma può essere omessa la variabile di uscita, definendo in questo modo una comunicazione asincrona. Il listato d’esempio, mostra una invoke di tipo one-way, ossia una chiamata che non si aspetta una risposta dal servizio, quindi sincrona e non bloccante.
Figura 6 – JDeveloper: invoke
Conclusioni
In questo articolo si è creato un semplice processo, definendo la specifica di alcuni costrutti base messi a disposizione da BPEL. Nel prossimo articolo verranno analizzate in dettaglio delle caratteristiche più complesse della gestione di un processo, quali ad esempio la gestione delle comunicazioni asincrone, la gestione delle eccezioni e il controllo dei flussi di lavoro.
Riferimenti
[1] Oracle BPEL Process Manager
http://www.oracle.com/technology/products/ias/bpel/index.html
[2] Stany Blanvalet et alii, “BPEL Cookbook. Best Practices for SOA-based integration and composite applications development”, Packt Publishing Ltd, 2006
[3] Daniel Rubio, “BPEL: Web Services orchestration, hands-on with ActiveBPEL”, 2005
[4] B. Mathew – P. Sarang – M.B. Juric, “Business Process Execution Languange for Web Service”, Packt Publishing Ltd, 2006
[5] Oracle BPEL Process Manager, Quick Start Tutorial