FIIFO 5 / Spcialisation NAL
Transcription
FIIFO 5 / Spcialisation NAL
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 * * «flow» SOAP Bus ESB «webservice» Bus ESB::Router + + + «webservice» Bus ESB::Admin getResultFor(int) : XMLDocument invoke(BusinessProcess, XMLDocument, XMLDocument) : void invokeOneWay(BusinessProcess, XMLDocument) : int + + add(BusinessProcess) : void remove(BusinessProcess) : void * * Bus ESB:: WSProxy Bus ESB:: BusinessProcess Instructions BPEL 1..* «webservice» WebServ ice 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 • <assign> et <copy> : 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>, <assign> <variables> <variable name="truevar" type="xsd:boolean" /> <variable name="falsevar" type="xsd:boolean" /> </variables> Types parmi les types simples XMLSchema <assign> <copy> <from><literal>true</literal></from> <to variable="truevar" /> </copy> <copy> <from><literal>false</literal></from> <to variable="falsevar" /> </copy> </assign> <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> <assign> <copy> <from><literal>wisdom</literal></from> <to variable="getFortuneRequest" part="topics" /> Type correspondant à un Message défini en WSDL. <copy> pour les affectations 3 <from><literal>0</literal></from> <to variable="getFortuneRequest" part="minLength" /> <from><literal>10000</literal></from> <to variable="getFortuneRequest" part="maxLength" /> </copy> </assign> <assign> <copy> <from variable="crOutput" part="parameters" query="//result"/> <to variable="input" part="parameters" query="/initiateLoanFlow/xmlLoanApp/CreditRating"/> </copy> </assign> part= existe quand la variable est de type Message query= accepte une expression XPath <import importType="http://schemas.xmlsoap.org/wsdl/" location="http://www.eclipse.org/.../EngineHostsPort.wsdl" namespace="http://www.eclipse.org/ /EngineHosts" /> Import WSDL <import importType="http://www.w3.org/2001/XMLSchema" location="./test_BindingWsifJava.xsd" namespace="http://www.eclipse.org/stp/b2j/2006/02" /> 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 --> <assign> <copy> <from variable="loanOffer2" part="parameters" query="result"/> 4 <to variable="selectedLoanOffer" part="parameters" query="/onLoanFlowResult/result"/> </copy> </assign> </case> <!-- Otherwise take loanOffer1 --> <otherwise> <assign> <copy> <from variable="loanOffer1" part="parameters" query="result"/> <to variable="selectedLoanOffer" part="parameters" query="/onLoanFlowResult/result"/> </copy> </assign> </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