как получить данные в рамках процесса BPEL?

Я разработал простой веб-сервис, который содержит следующие действия: получение, назначение, ответ. Эта служба запускается, когда пользователь отправляет данные этому процессу. Но когда этот процесс выполняется, мне нужно получить дополнительную информацию. Для этой цели я использовал вторую активность приема. Но когда я пытаюсь запустить эту службу, я получаю следующую ошибку:

ode:Fault Timeout or execution error when waiting for response to MEX {MyRoleMex#hqejbhcnphr99osb5akqhd [Client hqejbhcnphr99osb5akqhc] calling {http://middlerequester.com}MiddleRequesterService.process(...)} java.util.concurrent.TimeoutException: Message exchange org.apache.ode.bpel.engine.MyRoleMessageExchangeImpl$ResponseFuture@62865682 timed out(120000 ms) when waiting for a response! org.apache.ode.axis2.OdeFault: Timeout or execution error when waiting for response to MEX {MyRoleMex#hqejbhcnphr99osb5akqhd [Client hqejbhcnphr99osb5akqhc] calling {http://middlerequester.com}MiddleRequesterService.process(...)} java.util.concurrent.TimeoutException: Message exchange org.apache.ode.bpel.engine.MyRoleMessageExchangeImpl$ResponseFuture@62865682 timed out(120000 ms) when waiting for a response!
 at org.apache.ode.axis2.ODEService.onAxisMessageExchange(ODEService.java:167)
 at org.apache.ode.axis2.hooks.ODEMessageReceiver.invokeBusinessLogic(ODEMessageReceiver.java:69)
 at org.apache.ode.axis2.hooks.ODEMessageReceiver.invokeBusinessLogic(ODEMessageReceiver.java:52)
 at org.apache.axis2.receivers.AbstractMessageReceiver.receive(AbstractMessageReceiver.java:114)
 at org.apache.axis2.engine.AxisEngine.receive(AxisEngine.java:173)
 at org.apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.java:173)
 at org.apache.axis2.transport.http.AxisServlet.doPost(AxisServlet.java:144)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:644)
 at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:301)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
 at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
 at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
 at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
 at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
 at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
 at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
 at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:136)
 at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:74)
 at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
 at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
 at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:516)
 at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1015)
 at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:652)
 at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
 at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1575)
 at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1533)
 at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
 at java.lang.Thread.run(Unknown Source)

И теперь я не знаю, как получить эту дополнительную информацию. Буду очень признателен, если кто-нибудь подскажет, как решить эту проблему. Следующий фрагмент кода демонстрирует определение моего процесса:

<!-- MiddleRequester BPEL Process [Generated by the Eclipse BPEL Designer] -->
<!-- Date: Fri May 09 15:00:10 MSK 2014 -->
<bpel:process name="MiddleRequester"
         targetNamespace="http://middlerequester.com"
         suppressJoinFailure="yes"
         xmlns:tns="http://middlerequester.com"
         xmlns:bpel="http://docs.oasis-open.org/wsbpel/2.0/process/executable"
         xmlns:ns1="http://www.w3.org/2001/XMLSchema">


    <messageExchanges> 
        <messageExchange name="receiveBuyerInformation" /> 
        <messageExchange name="receiveSellerInformation" /> 
    </messageExchanges> 


    <!-- Import the client WSDL -->
    <bpel:import location="MiddleRequesterArtifacts.wsdl" namespace="http://middlerequester.com" 
            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. -->
        <bpel:partnerLink name="client"
                     partnerLinkType="tns:MiddleRequester"
                     myRole="MiddleRequesterProvider"
                     />
    </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:MiddleRequesterRequestMessage"/>

        <!-- 
          Reference to the message that will be returned to the requester
          -->
        <bpel:variable name="output"
                  messageType="tns:MiddleRequesterResponseMessage"/>



        <bpel:variable name="temp" type="ns1:string"></bpel:variable>
    </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 requester. 
             Note: This maps to operation defined in MiddleRequester.wsdl 
             -->
        <bpel:receive name="receiveInput" partnerLink="client"
                messageExchange="receiveBuyerInformation" 
                 portType="tns:MiddleRequester"
                 operation="process" variable="input"
                 createInstance="yes"/>

        <!-- Generate reply to synchronous request -->

        <bpel:assign validate="no" name="Assign">
            <bpel:copy>
                <bpel:from expressionLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0">
                    <![CDATA[concat("You entered: " ,$input.payload/tns:input)]]>
                </bpel:from>
                <bpel:to variable="temp"></bpel:to>
            </bpel:copy>

        </bpel:assign>
        <bpel:receive name="Receive" messageExchange="receiveSellerInformation" 
         partnerLink="client" operation="process" portType="tns:MiddleRequester" variable="input">
        </bpel:receive>

        <bpel:assign validate="no" name="Assign1">
            <bpel:copy>
                <bpel:from><bpel:literal><tns:MiddleRequesterResponse xmlns:tns="http://middlerequester.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <tns:result>tns:result</tns:result>
</tns:MiddleRequesterResponse>
</bpel:literal></bpel:from>
                <bpel:to variable="output" part="payload"></bpel:to>
            </bpel:copy>
            <bpel:copy>
                <bpel:from expressionLanguage="urn:oasis:names:tc:wsbpel:2.0:sublang:xpath1.0">
                    <![CDATA[concat($temp ,$input.payload/tns:input)]]>
                </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:reply name="replyOutput"
                messageExchange="receiveBuyerInformation" 
               partnerLink="client"
               portType="tns:MiddleRequester"
               operation="process" 
               variable="output"
               />
    </bpel:sequence>
</bpel:process>

person Tequila    schedule 10.05.2014    source источник


Ответы (1)


В вашем процессе я вижу две вещи:

  1. Операция process кажется двусторонней. Это означает, что вам нужно иметь две пары действий «получение-ответ». Вы добавили дополнительное получение, но теперь ответ на исходное получение отвечает на новое, а инициирующее получение не имеет ответа.

  2. Вам нужно будет использовать набор корреляции для второго ответа. Корреляция — это простая тема, хотя вам нужно ее изучить. См. документацию о наборах корреляций BPEL.

person Daniel Luebke    schedule 10.05.2014
comment
На самом деле вам нужно использовать корреляцию для второго приема, иначе движок не будет знать, к какому экземпляру процесса должно быть направлено второе сообщение. Чтобы это работало, и первое, и второе сообщение должны иметь общий идентификатор, который можно использовать в качестве токена корреляции. - person vanto; 11.05.2014
comment
Спасибо, парни! Я рассмотрю эту тему в спецификации BPEL. - person Tequila; 16.05.2014