OK, now that makes sense. Here are my few words: - async clients are in fact quite common use case (eg. in axis2 http transport: receive request, wait >60 sec. and reply; that won't work with request+reply sync bpel process because of timeout), - webservices explorer is not supported, but you can make two ODE+Axis agents talk to each other using magic session passing (copy from myRole EPR, like in ODE examples); I hope this helps somehow with Surendar's problem.
Regards, 2009/1/17 Daniel Luebke <[email protected]>: > 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 >>> >>> >>> >>> >> >> >> >> > > -- RafaĆ Rusin www.mimuw.edu.pl/~rrusin
