IFIPS 5 / Nouvelles Architectures Logicielles Projet : Bus de web services avec «moteur» BPEL Un bus de services Un bus de services (ESB) permet d assembler des web services existants, le résultat de cet assemblage étant également un web service, positionné à un niveau plus élevé car représentant un processus métier. WS-BPEL Web-Service Business Process Execution Language est un langage basé sur XML qui permet de formaliser la logique d exécution d un web service résultant du processus d intégration décrit ci-dessus. Cahier des charges Architecture et caractéristiques générales Vous devez concevoir et réaliser un bus de services dont l architecture et les caractéristiques principales sont les suivantes : cmp Component View Client * * XMLDocument SOAP «flow» Bus ESB Bus ESB::Router + getresultfor(int) : XMLDocument + invoke(businessprocess, XMLDocument, XMLDocument) : void + invokeoneway(businessprocess, XMLDocument) : int Bus ESB::Admin + add(businessprocess) : void + remove(businessprocess) : void * Bus ESB:: WSProxy 1..* * Bus ESB:: BusinessProcess Instructions BPEL WebService 1
Les différents composants présentés sur ce diagramme le sont à titre indicatif. Vous avez toute latitude pour interpréter cette présentation afin de fournir les fonctionnalités demandées. Exécution de processus métier Router comporte les points d accès au bus, accessibles via SOAP : invoke (BusinessProcess, input : XMLDocument, output : XMLDocument) permet d invoquer un processus métier o Input = document XML envoyé par le client et transmis au processus métier o Output = document XML résultat de l exécution du processus métier invokeoneway (BusinessProcess, input : XMLDocument) permet d invoquer un processus métier de façon asynchrone o Input = document XML envoyé par le client et transmis au processus métier o Retour = identifiant permettant de venir chercher le résultat plus tard par appel à getresultfor() XMLDocument getresultfor (int) permet de venir chercher le résultat d une invocation effectuée par appel à invokeoneway. L entier passé en paramètre est celui retourné par invokeoneway(). BusinessProcess est un processus métier exprimé en WS-BPEL. WSProxy est un proxy d invocation d un web service externe. XMLDocument représente un document XML au sens SOAP. Son type réel n est pas imposé. Web Service représente un web service externe. Administration Admin est un web service accessible via SOAP et permettant d ajouter ou de retirer des processus métier au Bus. Il offre au minimum les services suivants : add (BusinessProcess) remove (BusinessProcess) Types de Web Services externes supportés Le Bus devra pouvoir invoquer les web services externes, par appels synchrones. Instructions BPEL supportées Schéma WS-BPEL : http://schemas.xmlsoap.org/ws/2003/03/business-process/ Les instructions BPEL supportées seront au minimum les suivantes : <process> : définition d un processus métier <import> : permet d importer des schémas XML (xsd) et des descriptions WSDL <variables> et <variable> : pour définir des variables typées <sequences> et <sequence> : pour contenir un ensemble d instructions et : affectation de variables <switch> : tests <invoke> : invocation de web services 2
Exemple <process> <process xmlns="http://schemas.xmlsoap.org/ws/2003/03/business-process/" xmlns:engine="http://www.eclipse.org/stp/b2j/2006/02" xmlns:print="http://www.eclipse.org/stp/b2j/2006/02/print" xmlns:xsd="http://www.w3.org/2001/xmlschema" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/" xmlns:bpel="http://schemas.xmlsoap.org/ws/2003/03/business-process/" xmlns:temperature="http://www.xmethods.net/sd/temperatureservice.wsdl" xmlns:hello="http://com.lepago.hellolang" xmlns:fortune="http://fortune.webservices" xmlns:urlfetcher="http://www.atomic-x.com/atomicxmlservices/screenscraper.asmx"> <!-- toutes les autres balises --> </process> Exemples <import>, <variables>, <variable>, <variables> <variable name="truevar" type="xsd:boolean" /> <variable name="falsevar" type="xsd:boolean" /> </variables> Types parmi les types simples XMLSchema <from><literal>true</literal></from> <to variable="truevar" /> <from><literal>false</literal></from> <to variable="falsevar" /> <import importtype= "http://schemas.xmlsoap.org/wsdl/" location="../service_public_libraries/xmethods_fortuneservice.wsdl" namespace="http://fortune.webservices" /> <variables> <variable name="getfortunerequest" messagetype="fortune:getfortunerequest" /> </variables> <from><literal>wisdom</literal></from> <to variable="getfortunerequest" part="topics" /> Type correspondant à un Message défini en WSDL. pour les affectations 3
<from><literal>0</literal></from> <to variable="getfortunerequest" part="minlength" /> <from><literal>10000</literal></from> <to variable="getfortunerequest" part="maxlength" /> <from variable="croutput" part="parameters" query="//result"/> <to variable="input" part="parameters" query="/initiateloanflow/xmlloanapp/creditrating"/> <import importtype="http://schemas.xmlsoap.org/wsdl/" location="http://www.eclipse.org/.../enginehostsport.wsdl" namespace="http://www.eclipse.org/ /EngineHosts" /> <import importtype="http://www.w3.org/2001/xmlschema" location="./test_bindingwsifjava.xsd" namespace="http://www.eclipse.org/stp/b2j/2006/02" /> part= existe quand la variable est de type Message query= accepte une expression XPath Import WSDL Import XSD Exemples <invoke> <invoke name="invokecr" partnerlink="creditratingservice" porttype="crs:creditratingservice" operation="process" inputvariable="crinput" outputvariable="croutput"/> Seules les invocations synchrones seront supportées Exemples <switch> <switch> <!-- If loanoffer1 is greater (worse) than loanoffer2 --> <case condition="getvariabledata('loanoffer1','parameters','result/apr') > getvariabledata('loanoffer2','parameters','result/apr') "> <!-- Then take loanoffer2 --> <from variable="loanoffer2" part="parameters" query="result"/> 4
<to variable="selectedloanoffer" part="parameters" query="/onloanflowresult/result"/> </case> <!-- Otherwise take loanoffer1 --> <otherwise> <from variable="loanoffer1" part="parameters" query="result"/> <to variable="selectedloanoffer" part="parameters" query="/onloanflowresult/result"/> </otherwise> </switch> Travail demandé Vous devez concevoir et réaliser un Bus proposant le sous-ensemble de fonctionnalités suivant : - implémentation de l opération invoke() de la classe Router Implémentation Votre implémentation sera basée sur Java/J2EE et devra être compatible avec n importe quel conteneur WEB J2EE. Vous devrez restituer : Une application basée sur Axis et capable de fonctionner dans Tomcat 5. L ensemble du code source, des descripteurs de déploiements et des scripts de fabrication (le cas échéant). 5