0

请帮助我了解这个逻辑。我必须调用服务并获得响应。如果服务关闭或某些事情必须重试 3 次并且一旦用尽需要登录 DLQ。我一直在使用直到成功的处理器。对于成功场景,我只得到null记录器中的有效负载。但我尝试保留 HTTP 出站端点,直到成功从服务获得响应。请找到我的 xml 配置。

              <flow name="Flow" doc:name="eFlow" tracking:enable-default-events="true">
                     <wmq:inbound-endpoint queue="InputQ" tracking:enable-default-events="true" connector ref="WMQ_Connector" doc:name="connector">
                 <wmq:transaction action="NONE"/>
              </wmq:inbound-endpoint>
                  <mulexml:dom-to-xml-transformer></mulexml:dom-to-xml-transformer>
                     <set-session-variable variableName="originalPayload" value="#[payload]"       doc:name="Store_Payload"/>
                <choice tracking:enable-default-events="true" doc:name="Choice">
              <when expression="#[xpath('fn:local-name(/root/*[2])') == 'Master']">
                         <data-mapper:transform config-ref="Master_grf" doc:name="Master"/>
                    </when>
             <when expression="#[xpath('fn:local-name(/root/*[2])') == 'Request']">
        <data-mapper:transform config-ref="Request_grf" doc:name="Bulk"/>
             </when>
                    <otherwise>
            <scripting:component doc:name="Throw_Exception">
              <scripting:script engine="Groovy"><![CDATA[throw new IllegalArgumentException  ('requests invalid') ]]>
           </otherwise>
                    </choice>
               <mulexml:dom-to-xml-transformer></mulexml:dom-to-xml-transformer>
               <flow-ref name="Invoke_Service" doc:name="Flow Reference"/>
              </flow>


                <flow name="Invoke_Service" doc:name="Invoke_Service" tracking:enable-default-events="true">
     <cxf:jaxws-client  enableMuleSoapHeaders="true" doc:name="SOAP" operation="Request" serviceClass="com.valid.ICase"/>
       <until-successful objectStore-ref="objectStore" maxRetries="3" secondsBetweenRetries="2"  deadLetterQueue-ref="VM" doc:name="UntilSuccessful_SymboticService">
       <http:outbound-endpoint exchange-pattern="request-response"    method="POST" doc:name="HTTP" address="http://localhost:1112/symbotic"/>
          </until-successful>  
       <byte-array-to-string-transformer doc:name="Byte Array to String"/>
    <logger message="**********success***Payload: #[payload]*****" level="INFO" doc:name="Logger"/>

但是在失败情况下,直到成功重试 3 次(工作正常)。我已经尝试过内部的请求回复处理器,直到还有事务处理器。它不工作。使用 Mule 3.4 版。请建议我。

根据建议使用 request -reply 处理器重试相同

      <flow name="Flow" doc:name="eFlow" tracking:enable-default-events="true">
             <wmq:inbound-endpoint queue="InputQ" tracking:enable-default-events="true" connector-           ref="WMQ_Connector" doc:name="connector">
    <wmq:transaction action="NONE"/>
    </wmq:inbound-endpoint>
           <mulexml:dom-to-xml-transformer></mulexml:dom-to-xml-transformer>
        <set-session-variable variableName="originalPayload" value="#[payload]" doc:name="Store_Payload"/>
         <choice tracking:enable-default-events="true" doc:name="Choice">
    <when expression="#[xpath('fn:local-name(/root/*[2])') == 'Master']">
        <data-mapper:transform config-ref="Master_grf" doc:name="Master"/>
    </when>
    <when expression="#[xpath('fn:local-name(/root/*[2])') == 'Request']">
        <data-mapper:transform config-ref="Request_grf" doc:name="Bulk"/>
    </when>
 <otherwise>
        <scripting:component doc:name="Throw_Exception">
            <scripting:script engine="Groovy"><![CDATA[throw new IllegalArgumentException('requests           other then Master andRequest') ]]>
    </otherwise>
 </choice>
  <mulexml:dom-to-xml-transformer></mulexml:dom-to-xml-transformer>
  <request-reply timeout="10000">
 <vm:outbound-endpoint path="request"/>      
    <vm:inbound-endpoint path="reply"/>
   </request-reply> 
  <byte-array-to-string-transformer doc:name="Byte Array to String"/>
<logger message="**********success***Payload: #[payload]*****" level="INFO" doc:name="Logger"/>     
  </flow>

  <flow name="Invoke_Service" doc:name="Invoke_Service" tracking:enable-default-events="true">
<vm:inbound-endpoint path="request" doc:name="VM"/>
 <cxf:jaxws-client  enableMuleSoapHeaders="true" doc:name="SOAP" operation="Request"    serviceClass="com.valid.ICase"/>
   <until-successful objectStore-ref="objectStore" maxRetries="3" secondsBetweenRetries="2"  deadLetterQueue-ref="VM" doc:name="UntilSuccessful_Service">
   <http:outbound-endpoint exchange-pattern="request-response"    method="POST" doc:name="HTTP" address="http://localhost:1112/symbotic"/>
   </until-successful> 
   </flow>

即使那样得到空有效载荷。请建议这是你指导我的方式。如果我错了,请纠正我。

4

1 回答 1

2

until-successfulasynchronous处理器。它不会从服务调用返回响应。

Successfailure定义为:

  1. 如果子消息处理器抛出异常,这就是失败。
  2. 如果子消息处理器没有返回消息(例如是单向端点),则这是成功的。
  3. 如果配置了“失败表达式”(见下文),则根据该表达式评估返回消息以确定是否失败。
  4. 除此以外:
    1. 如果子消息处理器返回包含异常有效负载的消息,则这是失败的。
    2. 如果子消息处理器返回不包含异常有效负载的消息,则表示成功。

http://www.mulesoft.org/documentation/display/current/Routing+Message+Processors#RoutingMessageProcessors-UntilSuccessful

于 2013-10-22T14:28:18.710 回答