Mapping WSDL JBI

Cet article fait suite à une question récurrente des utilisateurs de Petals ESB : « Pourquoi j’ai une erreur au déploiement de mon service??? ». Je vais ici tenter de donner une réponse partielle à cette question car il peut y avoir beaucoup de raisons à une erreur de déploiement. La plus courante venant souvent de la configuration. Rien que bien technique ni compliqué dans cet article, juste un mini tutoriel pour mieux comprendre la philosophie Petals – JBI.

La spécification JBI est basée sur l’état de l’art des Web services et donc utilise WSDL pour la description des services ‘hostés’ ou liés à l’implémentation JBI. Petals ESB implémente (et étend – mais ça sera peut être l’objet d’un autre article sur le pourquoi du comment…) la spécification JBI depuis sa première version. Petals ESB est même certifié compatible JBI par SUN (RIP) après le passage du TCK JBI (Outil de test de compatibilité fournit par SUN). Bref, là n’est pas la question… Les descripteurs JBI servent à beaucoup de choses dans une implémentation JBI mais nous allons particulièrement regarder comment nous nous en servons dans l’exposition de services.

Un service exposé dans le bus fournit donc sa description via un WSDL associé. Ce service est activé dans le bus après le déploiement de ce que l’on appelle communément une ‘SA’ (Service Assembly) qui contient des ‘SU’ (Service Unit). Pour exposer un service dans le bus afin qu’il soit accessible à tout les consommateurs, la SU doit être en mode ‘provide’ ie fournisseur. Elle doit aussi définir le Endpoint, le Service et l’Interface qu’elle veut exposer. Prenons l’exemple du bon vieux service HelloWorld définit par le WSDL suivant :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ns2:definitions name="HelloServiceImplService" targetNamespace="http://sample.petals.ow.org/" xmlns:ns2="http://schemas.xmlsoap.org/wsdl/" xmlns:ns3="http://schemas.xmlsoap.org/wsdl/soap/"
	xmlns:ns9="http://www.w3.org/ns/wsdl/http" xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ns5="http://schemas.xmlsoap.org/wsdl/soap12/" xmlns:ns6="http://schemas.xmlsoap.org/wsdl/http/"
	xmlns:ns10="http://schemas.xmlsoap.org/wsdl/mime/" xmlns:ns7="http://www.w3.org/ns/wsdl" xmlns:ns8="http://www.w3.org/ns/wsdl/soap">
	<ns2:types>
		<xs:schema elementFormDefault="unqualified" attributeFormDefault="unqualified" targetNamespace="http://sample.petals.ow.org/">
			<xs:element name="sayHello" type="tns:sayHello" xmlns:tns="http://sample.petals.ow.org/" />
			<xs:element name="sayHelloResponse" type="tns:sayHelloResponse" xmlns:tns="http://sample.petals.ow.org/" />
			<xs:complexType name="sayHello">
				<xs:sequence>
					<xs:element name="arg0" minOccurs="0" type="xs:string" />
				</xs:sequence>
			</xs:complexType>
			<xs:complexType name="sayHelloResponse">
				<xs:sequence>
					<xs:element name="return" minOccurs="0" type="xs:string" />
				</xs:sequence>
			</xs:complexType>
		</xs:schema>
	</ns2:types>
	<ns2:message name="sayHelloResponse">
		<ns2:part element="tns:sayHelloResponse" name="parameters" xmlns:tns="http://sample.petals.ow.org/" />
	</ns2:message>
	<ns2:message name="sayHello">
		<ns2:part element="tns:sayHello" name="parameters" xmlns:tns="http://sample.petals.ow.org/" />
	</ns2:message>
	<ns2:portType name="HelloService">
		<ns2:operation name="sayHello">
			<ns2:input message="tns:sayHello" name="sayHello" xmlns:tns="http://sample.petals.ow.org/" />
			<ns2:output message="tns:sayHelloResponse" name="sayHelloResponse" xmlns:tns="http://sample.petals.ow.org/" />
		</ns2:operation>
	</ns2:portType>
	<ns2:binding type="tns:HelloService" name="HelloServiceImplServiceSoapBinding" xmlns:tns="http://sample.petals.ow.org/">
		<ns3:binding style="document" transport="http://schemas.xmlsoap.org/soap/http" />
		<ns2:operation name="sayHello">
			<ns3:operation style="document" soapAction="" />
			<ns2:input name="sayHello">
				<ns3:body use="literal" />
			</ns2:input>
			<ns2:output name="sayHelloResponse">
				<ns3:body use="literal" />
			</ns2:output>
		</ns2:operation>
	</ns2:binding>
	<ns2:service name="HelloServiceImplService">
		<ns2:port binding="tns:HelloServiceImplServiceSoapBinding" name="HelloServiceImplPort" xmlns:tns="http://sample.petals.ow.org/">
			<ns3:address location="http://localhost:9999/sample/HelloService" />
		</ns2:port>
	</ns2:service>
</ns2:definitions>
<pre>

Son descripteur JBI associé sera donc (lié a Petals via le composant Web service dans cet exemple) :

<?xml version="1.0" encoding="UTF-8"?>
<jbi:jbi version="1.0"
        xmlns:generatedNs="http://sample.petals.ow.org/"
        xmlns:jbi="http://java.sun.com/xml/ns/jbi"
	xmlns:petalsCDK="http://petals.ow2.org/components/extensions/version-5"
	xmlns:soap="http://petals.ow2.org/components/soap/version-4"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

	<jbi:services binding-component="true">
		<jbi:provides interface-name="generatedNs:HelloService"
			service-name="generatedNs:HelloServiceImplService"
			endpoint-name="HelloServiceImplPort">

			<!-- CDK specific elements -->
			<petalsCDK:timeout>60000</petalsCDK:timeout>
			<petalsCDK:wsdl>Service.wsdl</petalsCDK:wsdl>

			<!-- Component specific elements -->
			<soap:address>http://localhost:9999/sample/HelloService</soap:address>
			<soap:soap-version>11</soap:soap-version>
			<soap:add-root>false</soap:add-root>
			<soap:chunked-mode>false</soap:chunked-mode>
			<soap:cleanup-transport>true</soap:cleanup-transport>
			<soap:mode>SOAP</soap:mode>
		</jbi:provides>
	</jbi:services>
</jbi:jbi>

Où on respecte bien que :

  1. JBI ‘endpoint-name‘ = Valeur de l’attribut ‘name’ du Port dans le WSDL
  2. JBI ‘service-name‘ = Valeur de l’attribut ‘name’ du Service dans le WSDL (avec JBI Service NameSpace = targetNamespace du WSDL)
  3. JBI ‘interface-name‘ = Valeur de l’attribut ‘name’ du PortType dans le WSDL (avec JBI Interface NameSpace = targetNamespace du WSDL)

Petals ESB v3.x ne vous insultera plus lors du déploiement de vos services. Une solution simple pour ne pas se faire insulter, est d’utiliser le Studio Petals qui facilite grandement la vie des développeurs!

3 réflexions sur “Mapping WSDL JBI

  1. Merci pour cet article,

    J’ai un service avec deux portType, j’ai créé un jbi pour la 1er interface, mais j’obtiens l’erreur suivante lors du déploiement :

    Failed to parse the WSDL description bound to the provided service ‘myFirstPort’
    Caused by: SchemaException: WSDL 1.1: The endpoints of this service do not implement the same interface

    vous avez une idée comment résourdre ce problème ?

    Merci d’avance

  2. Pingback: 2010 in review « c.hamerling

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s