Skip to content

Mis en ligne par admin - 14 mars 2011 - Services Web

Un workflow asynchrone (WS-Adressing) en BPMN

Si, dans un premier temps, on est frappé par simplicité intuitive d’Intalio Designer (un des meilleurs IDE pour BPMN), de nombreuses fonctionnalités de base BPEL restent peu évidentes !

C’est le cas lorsque l’on souhaite réaliser un workflow asynchrone (basé sur WS-Addressing). En réalité, la méthode n’est pas compliquée si l’on suit scrupuleusement l’ensemble des recommandations suivantes:

  1. Dans la WSDL de votre workflow, déclarez les WS-Addressing SOAP headers (ReplyTo et MessageID) dans le même message abstrait que la requête. Par exemple :
     
        <message name="MyRequestMessage">
            <part name="payload" element="tns:MyRequest"/>
            <part name="ReplyTo" element="wsa:ReplyTo"/>
            <part name="MessageID" element="wsa:MessageID"/>
        </message>
    


    Dans la partie bindings, précisez l’attribut parts du soap:body (car il doit être unique) et déclarez les SOAP headers ainsi :
    
              <soap:body parts="payload" use="literal"/>
              <soap:header message="tns:MyRequestMessage" part="ReplyTo" use="literal" encodingStyle=""/>
              <soap:header message="tns:MyRequestMessage" part="MessageID" use="literal" encodingStyle=""/>
  2. Procédez de la même façon pour la WSDL du service qui reçoit les Callback :
    
        <message name="MyResponseMessage">
            <part name="payload" element="tns:MyResponse"/>
            <part name="RelatesTo" element="wsa:RelatesTo"/>
        </message>
      <input>
           <soap:body parts="payload" use="literal"/>
           <soap:header message="tns:MyResponseMessage" part="RelatesTo" use="literal" encodingStyle=""/>
      </input>
    
  3. Dans un nouveau pool (appelez le Client par exemple) non exécutable, faites glisser l’opération depuis l’onglet Process. Dans l’onglet Process, il est indispensable de cliquer d’abord sur le fichier WSDL, puis sur Services, puis sur le Port, puis sur l’Opération (plutôt que de cliquer sur WSDL, Port puis Opération, qui ne définirait pas de endpoint pour le service, ce qui est obligatoire).

    Ensuite, choisissez « Invoke operation », vous pouvez relier la nouvelle tâche à un Message Start dans le pool principal.
  4. Pour le Service de CallBack, glissez également l’opération de Callback de la WSDL depuis la WSDL (Services->Port->Opération), mais choisissez « Provide Operation » lors du drop.
    Reliez un Message End à cette nouvelle tâche.
  5. Enfin, dans votre workflow, vous devez mapper le « wsa:MessageId » de la requête au « RelatesTo » de la réponse. Vous devez également mapper le « ReplyTo » avec le endpoint du service de Callback. Pour cette dernière tâche, il est nécessaire de désactiver le filtre « outgoing partnerlink » dans l’onglet du Mapper. Une variable « endpoint » devrait apparaître.

Note : j’ai moi-même rencontré des problèmes org.apache.axis2.description.WSDL11ToAxisServiceBuilder$WSDLProcessingException:More than one part for message malgré mon respect de ces recommandations. En réalité, le problème venait de la façon dont j’avais utilisé Intalio pour créer mon workflow et non de la WSDL : Intalio avait généré une autre WSDL, non valide.

Articles similaires

Les articles suivants abordent des thèmes communs.

Commentaires

Partagez vos remarques.

Il n'y a pas de commentaires pour cet article.

Add a Comment

Fill in the form and submit.