Hi,
Surendar tries to build an asynchronous service. Something I wanted to
achieve some time ago. Asynchronous means that a client sends a
one-way-message to the BPEL process and the BPEL process calls back the
client via a NEW connection with a one-way-MEP. Because a new connection
is used, the process can spend an undefined very long timespan (even
years) between its invocation and delivering the result.
You can compare this situation to a call-center. You call the
call-center and an agent needs some days for processing your request, so
he promises to call you back.
However, as in real life (agent), the bpel process needs to know your
telephone number. The callback endpoint (phone number to call) is
typically transmitted by using WS-Addressing headers. Unfortunately,
these are not really supported by ODE. As far as I remember Tammo has
written in another thread that he has successfully activated the
WS-Addressing module in Axis2 underneath ODE (server-side), but has
still encountered some internal ODE timeouts. Furthermore, this only
works if you design the BPEL process as if it was using a
request-response-MEP and not two one-way-MEPs.
ODE uses its own headers for transmitting the callback endpoint.
However, these are non-standard and not directly supported by client
frameworks like Axis2. I don't know whether the Web service explorer
does support WS-Addressing for calling asynchronous Web services, but
I'm pretty sure that it does not support ODE-properitary headers.
Thus, so far you will not be able to call any BPEL process deployed on
ODE until ODE fully supports WS-Addressing (which it does not as far as
I know) and the Web service explorer supports it, too (which I simply
don't know).
Regards,
Daniel
Rafal Rusin schrieb:
> You have defined one way operation, so there's no output for it.
> DEBUG - GeronimoLog.debug(66) | Received one-way message for
> HelloInvokeProcess.{http://sample.bpel.org/bpel/sample}initiate
>
> Try helloworld example from ODE. It works.
>
> Regards
>
>
> 2009/1/17 Surendar <[email protected]>:
>
>> Hi all
>>
>> I created the BPEL Process as asynchronous, following is my BPEL Process
>>
>> Helloworld.bpel
>>
>> <!-- Helloworld BPEL Process [Generated by the Eclipse BPEL Designer] -->
>> <!-- Date: Sat Jan 17 14:20:57 GMT+05:30 2009 -->
>>
>> <bpel:process name="Helloworld"
>> targetNamespace="http://sample.bpel.org/bpel/sample"
>> suppressJoinFailure="yes"
>> xmlns:tns="http://sample.bpel.org/bpel/sample"
>> xmlns:bpel="http://docs.oasis-open.org/wsbpel/2.0/process/executable"
>> >
>> <!-- Import the client WSDL -->
>> <bpel:import location="HelloworldArtifacts.wsdl"
>> namespace="http://sample.bpel.org/bpel/sample"
>> importType="http://schemas.xmlsoap.org/wsdl/" />
>> <!--
>> ================================================================= -->
>> <!-- PARTNERLINKS
>> -->
>> <!-- List of services participating in this BPEL process -->
>> <!-- ================================================================= -->
>> <bpel:partnerLinks>
>> <!--
>> The 'client' role represents the requester of this service. It is
>> used for callback. The location and correlation information associated
>> with the client role are automatically set using WS-Addressing.
>> -->
>> <bpel:partnerLink name="client"
>> partnerLinkType="tns:Helloworld"
>> myRole="HelloworldProvider"
>> partnerRole="HelloworldRequester"
>> />
>> </bpel:partnerLinks>
>>
>> <!-- ================================================================= -->
>> <!-- VARIABLES
>> -->
>> <!-- List of messages and XML documents used within this BPEL process -->
>> <!-- ================================================================= -->
>> <bpel:variables>
>> <!-- Reference to the message passed as input during initiation -->
>> <bpel:variable name="input"
>> messageType="tns:HelloworldRequestMessage"/>
>> <!-- Reference to the message that will be sent back
>> to the
>> requester during callback
>> -->
>> <bpel:variable name="output"
>> messageType="tns:HelloworldResponseMessage"/>
>> </bpel:variables>
>>
>> <!-- ================================================================= -->
>> <!-- ORCHESTRATION LOGIC
>> -->
>> <!-- Set of activities coordinating the flow of messages across the -->
>> <!-- services integrated within this business process -->
>> <!-- ================================================================= -->
>> <bpel:sequence name="main">
>> <!-- Receive input from requestor.
>> Note: This maps to operation defined in Helloworld.wsdl
>> -->
>> <bpel:receive name="receiveInput" partnerLink="client"
>> portType="tns:Helloworld"
>> operation="initiate" variable="input"
>> createInstance="yes"/>
>> <!-- Asynchronous callback to the requester.
>> Note: the callback location and correlation id is transparently
>> handled
>> using WS-addressing.
>> -->
>> <bpel:assign validate="no" name="Assign">
>> <bpel:copy>
>> <bpel:from>
>> <bpel:literal xml:space="preserve"><tns:HelloworldResponse
>> xmlns:tns="http://sample.bpel.org/bpel/sample"
>> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
>> <tns:result></tns:result>
>> </tns:HelloworldResponse>
>> </bpel:literal>
>> </bpel:from>
>> <bpel:to variable="output" part="payload"></bpel:to>
>> </bpel:copy>
>> <bpel:copy>
>> <bpel:from part="payload" variable="input">
>> <bpel:query
>> queryLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0"><![CDATA[tns:input]]></bpel:query>
>> </bpel:from>
>> <bpel:to part="payload" variable="output">
>> <bpel:query
>> queryLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0"><![CDATA[tns:result]]></bpel:query>
>> </bpel:to>
>> </bpel:copy>
>> </bpel:assign>
>> <bpel:invoke name="callbackClient"
>> partnerLink="client"
>> portType="tns:HelloworldCallback"
>> operation="onResult"
>> inputVariable="output"
>> />
>> </bpel:sequence>
>> </bpel:process>
>>
>> Following is my HelloworldArtifacts.wsdl
>>
>> <?xml version="1.0"?>
>> <definitions name="Helloworld"
>> targetNamespace="http://sample.bpel.org/bpel/sample"
>> xmlns:tns="http://sample.bpel.org/bpel/sample"
>> xmlns:plnk="http://docs.oasis-open.org/wsbpel/2.0/plnktype"
>> xmlns="http://schemas.xmlsoap.org/wsdl/"
>> xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
>>
>> <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> TYPE DEFINITION - List of services participating in this BPEL process
>> The default output of the BPEL designer uses strings as input and
>> output to the BPEL Process. But you can define or import any XML
>> Schema type and us them as part of the message types.
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
>> <types> <schema attributeFormDefault="unqualified"
>> elementFormDefault="qualified"
>> targetNamespace="http://sample.bpel.org/bpel/sample"
>> xmlns="http://www.w3.org/2001/XMLSchema"
>> >
>> <element name="HelloworldRequest">
>> <complexType>
>> <sequence>
>> <element name="input" type="string" />
>> </sequence>
>> </complexType>
>> </element>
>> <element name="HelloworldResponse">
>> <complexType>
>> <sequence>
>> <element name="result" type="string"/>
>> </sequence>
>> </complexType>
>> </element>
>> </schema>
>> </types>
>>
>> <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> MESSAGE TYPE DEFINITION - Definition of the message types used as
>> part of the port type defintions
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
>> <message name="HelloworldRequestMessage">
>> <part name="payload" element="tns:HelloworldRequest"/>
>> </message>
>> <message name="HelloworldResponseMessage">
>> <part name="payload" element="tns:HelloworldResponse"/>
>> </message>
>>
>>
>> <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> PORT TYPE DEFINITION - A port type groups a set of operations into
>> a logical service unit.
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
>> <!-- portType implemented by the Helloworld BPEL process -->
>> <portType name="Helloworld">
>> <operation name="initiate">
>> <input message="tns:HelloworldRequestMessage"/>
>> </operation>
>> </portType>
>>
>> <!-- portType implemented by the requester of Helloworld BPEL process
>> for asynchronous callback purposes
>> -->
>> <portType name="HelloworldCallback">
>> <operation name="onResult">
>> <input message="tns:HelloworldResponseMessage"/>
>> </operation>
>> </portType>
>>
>>
>> <!-- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>> PARTNER LINK TYPE DEFINITION
>> the Helloworld partnerLinkType binds the provider and
>> requester portType into an asynchronous conversation.
>> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -->
>> <plnk:partnerLinkType name="Helloworld">
>> <plnk:role name="HelloworldProvider" portType="tns:Helloworld"/>
>> <plnk:role name="HelloworldRequester"
>> portType="tns:HelloworldCallback"/>
>> </plnk:partnerLinkType> <binding name="ResponderBinding"
>> type="tns:HelloworldCallback">
>> <soap:binding style="document"
>> transport="http://schemas.xmlsoap.org/soap/http" />
>> <operation name="onResult">
>> <soap:operation
>> soapAction="http://sample.bpel.org/bpel/sample/onResult" />
>> <input>
>> <soap:body use="literal" />
>> </input>
>> </operation>
>> </binding>
>> <binding name="ExecuteBinding" type="tns:Helloworld">
>> <soap:binding style="document"
>> transport="http://schemas.xmlsoap.org/soap/http" />
>> <operation name="initiate">
>> <soap:operation
>> soapAction="http://sample.bpel.org/bpel/sample/initiate" />
>> <input>
>> <soap:body use="literal" />
>> </input>
>> </operation>
>> </binding>
>> <service name="InvokingService">
>> <port name="ExecutePort" binding="tns:ExecuteBinding">
>> <soap:address
>> location="http://localhost:8080/ode/processes/HelloInvokeProcess" />
>> </port>
>> </service>
>> <service name="CallbackService">
>> <port name="ResponderPort" binding="tns:ResponderBinding">
>> <soap:address
>> location="http://localhost:8080/ode/processes/HelloResponderProcess" />
>> </port>
>> </service>
>> </definitions>
>>
>> following is my deploy.xml
>>
>> <?xml version="1.0" encoding="UTF-8"?>
>> <deploy xmlns="http://www.apache.org/ode/schemas/dd/2007/03"
>> xmlns:sample="http://sample.bpel.org/bpel/sample">
>> <process name="sample:Helloworld">
>> <process-events generate="all"/>
>> <provide partnerLink="client">
>> <service name="sample:InvokingService" port="ExecutePort"/>
>> </provide>
>> <invoke partnerLink="client">
>> <service name="sample:CallbackService" port="ResponderPort"/>
>> </invoke>
>> </process>
>> </deploy>
>>
>> i deployed in the ode runtime engine inside the tomcat, it deployed
>> successfully , while im testing wsdl with the webservice explorer
>> iam sending the input , but iam getting the response object as null,
>> following is my output in console
>>
>> DEBUG - GeronimoLog.debug(66) | Received one-way message for
>> HelloInvokeProcess.{http://sample.bpel.org/bpel/sample}initiate
>> DEBUG - GeronimoLog.debug(66) | Starting transaction.
>> DEBUG - GeronimoLog.debug(66) | Routed: svcQname
>> {http://sample.bpel.org/bpel/sample}InvokingService -->
>> BpelProcess[{http://sample.bpel.org/bpel/sample}Helloworld-117]
>> DEBUG - GeronimoLog.debug(66) | ODE routed to operation Operation:
>> name=initiate
>> style=ONE_WAY,0
>> Input: name=null
>> Message: name={http://sample.bpel.org/bpel/sample}HelloworldRequestMessage
>> Part: name=payload
>> elementName={http://sample.bpel.org/bpel/sample}HelloworldRequest from
>> service {http://sample.bpel.org/bpel/sample}InvokingService
>> DEBUG - GeronimoLog.debug(66) | Invoking ODE using MEX
>> {MyRoleMex#hqejbhcnphr3wxc436pvna [Client hqejbhcnphr3wxc436pvn9] calling
>> {http://sample.bpel.org/bpel/sample}InvokingService.initiate(...)}
>> DEBUG - GeronimoLog.debug(66) | Message content: <?xml version="1.0"
>> encoding="UTF-8"?>
>> <message><payload><HelloworldRequest
>> xmlns="http://sample.bpel.org/bpel/sample"
>> xmlns:q0="http://sample.bpel.org/bpel/sample"
>> xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"
>> xmlns:xsd="http://www.w3.org/2001/XMLSchema"
>> xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
>> *<input>haI</input>*
>> </HelloworldRequest></payload></message>
>> DEBUG - GeronimoLog.debug(66) | Routed: svcQname
>> {http://sample.bpel.org/bpel/sample}InvokingService -->
>> BpelProcess[{http://sample.bpel.org/bpel/sample}Helloworld-117]
>> DEBUG - GeronimoLog.debug(66) | invoke() EPR= null ==>
>> BpelProcess[{http://sample.bpel.org/bpel/sample}Helloworld-117]
>> DEBUG - GeronimoLog.debug(66) | Commiting ODE MEX
>> {MyRoleMex#hqejbhcnphr3wxc436pvna [Client hqejbhcnphr3wxc436pvn9] calling
>> {http://sample.bpel.org/bpel/sample}InvokingService.initiate(...)}
>> DEBUG - GeronimoLog.debug(66) | Commiting transaction.
>> DEBUG - GeronimoLog.debug(66) | Releasing mex hqejbhcnphr3wxc436pvna
>> DEBUG - GeronimoLog.debug(66) | >>
>> handleWorkEvent(jobData={type=INVOKE_INTERNAL, mexid=hqejbhcnphr3wxc436pvna,
>> pid={http://sample.bpel.org/bpel/sample}Helloworld-117})
>> DEBUG - GeronimoLog.debug(66) | InvokeInternal event for mexid
>> hqejbhcnphr3wxc436pvna
>> DEBUG - GeronimoLog.debug(66) | GET MEX property
>> org.apache.ode.bpel.myRoleSessionId = null
>> DEBUG - GeronimoLog.debug(66) | GET MEX property
>> org.apache.ode.bpel.myRoleSessionId = null
>> DEBUG - GeronimoLog.debug(66) | GET MEX property
>> org.apache.ode.bpel.partnerRoleSessionId = null
>> DEBUG - GeronimoLog.debug(66) | INPUTMSG: 12.initiate: MSG RCVD keys=[]
>> mySessionId=null partnerSessionId=null
>> DEBUG - GeronimoLog.debug(66) | INPUTMSG: 12.initiate: routing failed,
>> CREATING NEW INSTANCE
>> DEBUG - GeronimoLog.debug(66) | BpelRuntimeContextImpl created for instance
>> 26953. INDEXED STATE={}
>> DEBUG - GeronimoLog.debug(66) | SELECT: PickResponseChannel#9: USING
>> CORRELATOR 12.initiate
>> DEBUG - GeronimoLog.debug(66) | SELECT: PickResponseChannel#9: CHECKING for
>> NEW INSTANCE match
>> DEBUG - GeronimoLog.debug(66) | INPUTMSGMATCH: Changing process instance
>> state from ready to active
>> DEBUG - GeronimoLog.debug(66) | SELECT: PickResponseChannel#9: FOUND match
>> for NEW instance mexRef={MyRoleMex#hqejbhcnphr3wxc436pvna [Client
>> hqejbhcnphr3wxc436pvn9] calling
>> {http://sample.bpel.org/bpel/sample}InvokingService.initiate(...)}
>> DEBUG - GeronimoLog.debug(66) | INVOKING PARTNER:
>> partnerLink={PartnerLinkInstance
>> partnerLinkDecl=OPartnerLink#12,scopeInstanceId=27005}, op=onResult
>> channel=null)
>> DEBUG - GeronimoLog.debug(66) | INVOKE PARTNER (SEP):
>> sessionId=hqejbhcnphr3wxc436pvnc partnerSessionId=null
>> DEBUG - GeronimoLog.debug(66) | Routed: svcQname
>> {http://sample.bpel.org/bpel/sample}CallbackService --> null
>> DEBUG - GeronimoLog.debug(66) | Invoking a partner operation: onResult
>> DEBUG - GeronimoLog.debug(66) | The service to invoke is the external
>> service {http://sample.bpel.org/bpel/sample}CallbackService:ResponderPort
>> DEBUG - GeronimoLog.debug(66) | Resolving endpoint reference <?xml
>> version="1.0" encoding="UTF-8"?>
>> <service-ref
>> xmlns="http://docs.oasis-open.org/wsbpel/2.0/serviceref"><EndpointReference
>> xmlns="http://www.w3.org/2005/08/addressing"><Metadata><ServiceName
>> xmlns="http://www.w3.org/2006/05/addressing/wsdl"
>> EndpointName="ResponderPort"
>> xmlns:servicens="http://sample.bpel.org/bpel/sample">servicens:CallbackService</ServiceName></Metadata><Address>http://localhost:8080/ode/processes/HelloResponderProcess</Address></EndpointReference></service-ref>
>> DEBUG - GeronimoLog.debug(66) | GET MEX property
>> org.apache.ode.bpel.partnerRoleSessionId = null
>> DEBUG - GeronimoLog.debug(66) | GET MEX property
>> org.apache.ode.bpel.myRoleSessionId = hqejbhcnphr3wxc436pvnc
>> DEBUG - GeronimoLog.debug(66) | MyRole session identifier found for myrole
>> (callback) WSA endpoint: hqejbhcnphr3wxc436pvnc
>> DEBUG - GeronimoLog.debug(66) | Axis2 sending message to
>> http://localhost:8080/ode/processes/HelloResponderProcess using MEX
>> {PartnerRoleMex#hqejbhcnphr3wxc436pvnd [PID
>> {http://sample.bpel.org/bpel/sample}Helloworld-117] calling
>> [email protected](...)}
>> DEBUG - GeronimoLog.debug(66) | Message: <?xml version='1.0'
>> encoding='utf-8'?><soapenv:Envelope
>> xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Body><HelloworldResponse
>> xmlns="http://sample.bpel.org/bpel/sample">
>> *<result>haI</result>*
>> </HelloworldResponse></soapenv:Body></soapenv:Envelope>
>> DEBUG - GeronimoLog.debug(66) |
>> org.apache.ode.axis2.soapexternalservice$cachedoption...@da5660 has been
>> modified
>> DEBUG - GeronimoLog.debug(66) | Translating IL Properties for Axis2
>> DEBUG - GeronimoLog.debug(66) | replyOneWayOk mex=hqejbhcnphr3wxc436pvnd
>> DEBUG - GeronimoLog.debug(66) | Sending stateful TO epr in message header
>> using session null
>> DEBUG - GeronimoLog.debug(66) | Sending stateful FROM epr in message header
>> using session hqejbhcnphr3wxc436pvnc
>> DEBUG - GeronimoLog.debug(66) | Sending a message containing wsa endpoints
>> in headers for session passing.
>> DEBUG - GeronimoLog.debug(66) | <?xml version='1.0'
>> encoding='utf-8'?><soapenv:Envelope
>> xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"><soapenv:Header><addr:To
>> xmlns:addr="http://www.w3.org/2005/08/addressing">http://localhost:8080/ode/processes/HelloResponderProcess</addr:To><addr:Action
>> xmlns:addr="http://www.w3.org/2005/08/addressing">http://sample.bpel.org/bpel/sample/onResult</addr:Action><addr:ReplyTo
>> xmlns:addr="http://www.w3.org/2005/08/addressing"><addr:Address>http://www.w3.org/2005/08/addressing/none</addr:Address></addr:ReplyTo><addr:MessageID
>> xmlns:addr="http://www.w3.org/2005/08/addressing">urn:uuid:B71E53E6E179D41DF41232199002481</addr:MessageID><intalio:callback
>> xmlns:intalio="http://www.intalio.com/type/session"><addr:Address
>> xmlns:addr="http://www.w3.org/2005/08/addressing">http://localhost:8080/ode/processes/HelloInvokeProcess</addr:Address><intalio:session>hqejbhcnphr3wxc436pvnc</intalio:session></intalio:callback></soapenv:Header><soapenv:Body><HelloworldResponse
>> xmlns="http://sample.bpel.org/bpel/sample">
>> *<result>haI</result>*
>> </HelloworldResponse></soapenv:Body></soapenv:Envelope>
>> DEBUG - GeronimoLog.debug(66) | ProcessImpl
>> {http://sample.bpel.org/bpel/sample}Helloworld-117 completed OK.
>> DEBUG - GeronimoLog.debug(66) | Releasing mex hqejbhcnphr3wxc436pvna
>> DEBUG - GeronimoLog.debug(66) | Checking for Service using target endpoint
>> address : http://localhost:8080/ode/processes/HelloResponderProcess
>> DEBUG - GeronimoLog.debug(66) | Found service in registry from name
>> *HelloResponderProcess: null
>>
>>
>> *can any one tell me what could be the problem, i need to receive the
>> response in browser but i cant, so any one tell me how i can receive the
>> output sending in the callback response.
>>
>> with regards
>>
>> Surendar V
>>
>>
>>
>>
>
>
>
>