Monday, March 21, 2011

Creacion de un bpel partiendo de un WSDL

Un Bpel es un proceso el cual tiene una entrada, un conjunto de operaciones y una salida. Para editar un bpel tienes el Eclipse Java EE IDE for Web Developers. Y para ejecutar el bpel tienes el motor de ejecucion de Apache ODE.

Los puntos de entrada y de salilda de los bpel se llaman Receive y  Reply. Para que un Bpel esté accesible, se tiene que crear un acceso a través de un Wsdl. Es decir, para llamar a un proceso Bpel hay que ejecutar una llamada a un WS. Además cualquier punto de aceso, ya sea para llamar a un WS o para dejar accesible el bpel a través de un WS tienes que crear un PartnerLink. Los Bpel son procesos abstractos, es decir no tiene un punto de acceso defnido, tienes un interfaz . El punto de acceso o implementacion del servicio se vincula en tiempo de despliegue del Bpel. En ODE cuando despliegas un servicio lo vinculas con un EPR (end point reference) con el fichero deploy.xml, en el cual indicas el partnetlink con el binding del Web service. Por todo esto un Partnerlink es una asociacion a un PortType de un Wsdl.

Un proceso básico de un Bpel se prodria definir de la siguiente manera:

Paso 1

Un WS simple con un servicio que tiene operacion que contiene un mensaje de entrada y un mensaje de salida, todo esto esta definido en un portType. La implementacion del servicio esta definido en un ERP.


Paso 2
Para creamos un Bpel e incluimos el PartnerLink al PortType y creamos 3 acciones una de entrada una invocacion y una de salidad, es decir receive invoke reply. creamos otro PartnerLink al portType

<process name="process"
    xmlns:tns="urn:process/bpel/process/"
    xmlns:bpel="http://docs.oasis-open.org/wsbpel/2.0/process/executable"
    xmlns="http://docs.oasis-open.org/wsbpel/2.0/process/executable"
    suppressJoinFailure="no"
    xmlns:nshotel="
http://hotel/reservadehotel/"
    xmlns:nsimport="
urn:import:service">
   
       <bpel:import namespace="
urn:import:service" location="process.wsdl"
    importType="http://schemas.xmlsoap.org/wsdl/"/>
   
    <partnerLinks>
        <bpel:partnerLink name="hotelPartner"
             partnerLinkType="nsimport:hotelPLT"
             myRole="hotelRole"
             partnerRole="hotelRole" />
        <bpel:partnerLink name="hotelPartnerInvoke"
             partnerLinkType="nsimport:hotelPLT"
             partnerRole="hotelRoleInvoke" />

    </partnerLinks>
 
    <variables>
            <variable name="input" messageType="nshotel:messageRequest"/>
            <variable name="output" messageType="nshotel:messageResponse"/>
    </variables>
 

    <sequence name="MainSequence">
   
        <bpel:receive name="receiveInput" partnerLink="hotelPartner"
                createInstance="yes" operation="bookRoom" portType="nshotel:hotel" variable="input"/>
            
        <bpel:invoke name="Invoke" partnerLink="hotelPartnerInvoke"
            operation="bookRoom" portType="nshotel:hotel"
            outputVariable="output" inputVariable="input"></bpel:invoke>
       

        <bpel:reply name="replyOutput" partnerLink="hotelPartner"
                operation="bookRoom" portType="nshotel:hotel"
                variable="output" />
     
    </sequence>
  
</process>


Paso 3
Creamos un WSDL con una referencia a ODE importando el WSDL del paso 1, e incluimos los ParnetLink para hacer de interface del BPEL y creamos una implementacion del WS para que nuestro BPEL pueda ser llamado

    <plnk:partnerLinkType name="hotelPLT">
            <plnk:role  name="hotelRole" portType="nshotel:hotel" />
            <plnk:role  name="hotelRoleInvoke" portType="nshotel:hotel" />
    </plnk:partnerLinkType>


    <import location="hotel.wsdl" namespace="http://hotel/reservadehotel" />
 

     <wsdl:binding name="HotelSoapBinding" type="nshotel:hotel" >
               <soap:binding style="document"
            transport="http://schemas.xmlsoap.org/soap/http" />
        <wsdl:operation name="bookRoom">
            <soap:operation
                soapAction="http://hotel/reservadehotel/bookRoom" />
            <wsdl:input>
                <soap:body use="literal"/>
            </wsdl:input>
            <wsdl:output>
                <soap:body use="literal"/>
            </wsdl:output>
        </wsdl:operation>
    </wsdl:binding>
    <wsdl:service name="HotelService">
        <wsdl:port name="HotelSoapBinding" binding="nsimport:HotelSoapBinding">
            <soap:address location="http://localhost:8080/ode/processes/proceso"/>
        </wsdl:port>
    </wsdl:service>        


Paso 4
Creamos con ayuda de  eclipse el fichero de Deploy.xml vinculando a cada PartnetLink una implementacion de PortType para que pueda ser ejecutado.

<deploy xmlns="http://www.apache.org/ode/schemas/dd/2007/03"
xmlns:nshotel="http://hotel/reservadehotel/"
xmlns:nsimport="urn:import:service">
  <process name="proceso">
    <active>true</active>
    

   <provide partnerLink="hotelPartner">
      <service name="nsimport:HotelService" port="HotelSoapBinding"/>
    </provide>

    <invoke partnerLink="hotelPartnerInvoke">
      <service name="nshotel:hotel" port="hotelSOAP"/>
    </invoke>

  </process>
</deploy>

No comments:

Post a Comment