• Aucun résultat trouvé

6.2.1 Choix d’Orchestra

Afin de pouvoir être compatible avec l’ensemble des programmes BPEL nous avons fait le choix de modifier un interpréteur BPEL existant afin d’y ajouter des mécanismes de contrôle de flux et de modification dynamique de la politique de contrôle de flux.

Il existe de nombreux interpréteurs BPEL open-source. Notre choix s’est porté sur Orchestra, un interpréteur BPEL produit par Bull pour deux principales raisons. Tout d’abord c’est un orchestrateur régulièrement mis à jour et qui prend en compte la dernière version de BPEL : BPEL 2.0. Mais surtout c’est l’architecture même d’Orchestra qui a motivé notre choix. En effet cet orchestrateur est basé sur la transformation du programme BPEL en arbre abstrait. Chaque instruction BPEL est transformée en une classe JAVA possédant une méthode execute qui décrit son exécution. La modification de l’interpréteur repose alors sur l’ajout de meta- données dans ces classes BPEL (en particulier des labels) et sur la modification des méthodes execute associées.

Dans la suite de cette section nous décrivons le fonctionnement nominal d’Or- chestra. Dans la section 6.3 nous décrivons les modifications que nous avons ap- portées à Orchestra afin de permettre le suivi et le contrôle des flux d’information.

6.2 Orchestra, un interpréteur BPEL 119 newProcessInstance() queryLanguage : String expressionLanguage : String suppressJoinFailure : boolean exitOnStandardFault : boolean targetNamespace : String wsdlInfos : WsdlsInfos resourcesRepository : ProcessResourcesRepository startElements : Map<OperationKey, InboundMessageElement> inboundMessageElements : List<InboundMessageElement> commonCorrelationSets : Collection<CorrelationSet>

BpelProcess

FIGURE6.1 – Extrait de la définition de la classe BpelProcess

executeActivity(BpelExecution) executeEventHandlers(BpelExecution) executeMainActivity(BpelExecution)

signal(BpelExecution, String, Map<String, Object>) findCorrelationSet(String)

findPartnerLink(String) findVariable(String)

listOfVariableToBeInitialized : List<String> exitOnStandardFault : boolean

variables : Map<String, Variable> isolated : boolean

partnerLinks : Map<String, PartnerLink> messageExchanges : Set<String>

correlationSets : Map<String, CorrelationSet> scopeNode : NodeImpl

Scope

FIGURE6.2 – Extrait de la définition de la classe Scope

6.2.2 Exécution des programmes BPEL dans Orchestra

Transformation en arbres abstraits

Le package org.ow2.orchestra.definition contient les classes per- mettant la description d’un processus BPEL.

La racine de l’arbre d’un processus BPEL est l’élément <process>. Celui-ci est transformé en un objet de la classe BpelProcess. Un diagramme simplifié de la classe BpelProcess est présenté sur la figure 6.1. Cette classe reprend l’ensemble des déclarations d’une définition d’un processus BPEL sauf celles qui sont communes avec l’élément <scope>. Un objet de la classe Scope est en effet généré en même temps que la création d’un objet BpelProcess.

L’élément <scope> permet de créer un contexte de comportement pour les activités BPEL. Il permet en particulier la définition de gestionnaires de fautes, d’évènements et de compensations, de variables et d’ensembles de corrélation. L’ensemble de ces définitions se retrouvent dans la classe Scope dont un dia- gramme simplifié est présenté sur la figure 6.2.

<if>

<condition>boolean−expression</condition>

<!-- quelques activites -->

<elseif>∗

<condition>boolean−expression</condition>

<!-- quelques activites --> </elseif> <else>? <!-- quelques activites --> </else> </if> executeActivity(BpelExecution)

signal(BpelExecution, String, Map<String, Object>) condition : Expression activity : NodeImpl elseifs : List<Elseif> elseField : Else If activity : NodeImpl Else condition : Expression activity : NodeImpl Elseif 1 * 1 0..1

FIGURE6.3 – Syntaxe de l’activité <if> et diagramme de classe correspondant

sont les racines de la structure d’arbre organisant les activités BPEL. Un pro- gramme BPEL est transformé en un arbre d’objets Java. Certains objets sont des activités BPEL et sont à ce titre destinés à être exécutés. Ils sont regroupés dans le sous package org.ow2.orchestra.definition.activity. Les autres objets sont des éléments du langage destinés pour la plupart à être instanciés au mo- ment de l’exécution du processus BPEL comme par exemple la description des va- riables. Ces éléments sont regroupés dans le sous package org.ow2.orchestra .definition.element.

Chacun de ces objets représentant une activité BPEL et regroupé au sein du sous package org.ow2.orchestra.definition.activity contient une méthode execute qui contient l’ensemble des instructions qui vont permettre son exécution et d’appeler le nœud suivant. Certains objets contiennent en plus une méthode signal qui permet d’exécuter certaines instructions en fonction de l’arrivée d’un signal comme par exemple la réception d’un message.

Par exemple l’activité <if> est représentée par un objet de la classe If. La figure 6.3 présente la syntaxe de l’activité <if> ainsi que le diagramme de classe correspondant. Une classe est créée pour chacun des éléments de l’activité. Un objet de la classe If est constitué d’une expression conditionnelle, de l’arbre des activités effectuées si la condition est vraie, de la liste des éléments Elseif exé- cutés si jamais la condition est fausse, ainsi que d’un élément Else. Seul l’élément <If>est exécuté, les autres éléments étant uniquement des conteneurs d’activités éventuellement assortis d’une condition. Ainsi seul l’élément <If> possède les méthodes signal et execute.

6.2 Orchestra, un interpréteur BPEL 121

messageType : QName xmlType : QName element : QName

messageParts : Map<String, PartDefinition> virtualCopy : Copy

name : String

Variable

FIGURE6.4 – Extrait de la définition de la classe Variable

flowRuntime : FlowRuntime forEachRuntime : ForEachRuntime scopeRuntime : ScopeRuntime repliers : Set<Replier> waitingExecution : WaitingExecution instanceState : ActivityState resumeState : String BpelExecution endedChildren : List<ScopeRuntime> variables : Map<String, VariableRuntime> partnerLinks : Map<String, PartnerLinkRuntime> correlationSets : Map<String, CorrelationSetRuntime> state : ScopeState lastException : BpelFaultException compensateExecution : BpelExecution ScopeRuntime name : String partnerLinkDefinition : PartnerLink partnerRoleEndPointReference : Document myRoleEndPointReference : Document PartnerLinkRuntime name : String variableDefinition : Variable scopeRuntime : ScopeRuntime xmlValue : Document VariableRuntime * 1 1 *

FIGURE6.5 – Principales classes du package org.ow2.orchestra.runtime

ckage org.ow2.orchestra.definition.element. Les éléments du lan- gage BPEL contenant l’information sont essentiellement les variables et les dé- finitions des liens vers les partenaires. Au moment de la transformation en arbre d’objets Java seule la définition de ces éléments est considérée. La classe définis- sant les variables BPEL est présentée sur la figure 6.4. Ces éléments sont instanciés au moment de l’exécution du processus BPEL. Celle-ci est décrite dans la section 6.2.2.

Exécution des processus BPEL

Le package org.ow2.orchestra.runtime contient les principales classes permettant l’instantiation et l’exécution des processus BPEL. Les principales classes de ce package sont représentées sur la figure 6.5.

La classe BpelExecution permet l’exécution des processus BPEL. Les mé- thodes execute des objets représentant les activités BPEL prennent un objet de cette classe en paramètre d’entrée. Un objet de la classe BpelExecution repré- sente l’état d’un processus BPEL en cours d’exécution. Elle contient en particulier l’état des exécutions parallèles, des boucles ForEach et du scope courant.

La classe ScopeRuntime représente l’état du scope courant. Elle contient en particulier la table contenant l’ensemble des variables BPEL instanciées ainsi que la table contenant l’instantiation de l’ensemble des liens vers les services.

La classe PartnerLinkRuntime permet d’instancier les liens vers les par- tenaires. Elle permet en particulier la modification des champs partnerRole-

Fonction Package Classes Création et modi-

fication des labels

flowControl label, treeLabel,

labelNavigator Ajout des labels

aux conteneurs d’information runtime VariableRuntime, PartnerLinkRuntime Introduction de la politique de flux

definition.activity Invoke, Receive Vérification de la

politique de flux

definition.activity Invoke, Reply Suivi des flux

explicites

definition.element Copy, From, To definition.activity Invoke

Suivi des flux implicites

definition.activity If, RepeatUntil

runtime ScopeRuntime

Modification de la politique de flux

definition.activity Invoke, Reply

runtime BpelExecution

TABLE6.1 – Principales modifications apportées à Orchestra par OrchestraFlow

EndPointReference, qui contient l’adresse du service appelé, et myRole- EndPointReferencequi contient l’adresse de retour pour la réponse du ser- vice.

La classe VariableRuntime permet d’instancier les variables BPEL. Le contenu de la variable est un document XML contenu dans le champ xmlValue.