Mule:如何使用成功的处理器进行服务调用

时间:2013-10-22 13:43:11

标签: mule mule-studio mule-el

请帮我解释这个逻辑。我必须调用该服务并获得响应。如果服务中断或者必须重试3次并且一旦用完就需要登录DLQ。我使用直到成功处理器。成功我在logger中只得到 null payload 。但是我试图保持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。请建议我。

按照建议

对请求处理器进行了相同的处理
      <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>

即便获得 null有效负载。请指出这是你指导我的方式。如果我错了,请纠正我。

1 个答案:

答案 0 :(得分:2)

until-successful是一个asynchronous处理器。它不会返回服务呼叫的响应。

Successfailure定义为:

  1. 如果子消息处理器抛出异常,则表示失败。
  2. 如果子消息处理器未返回消息(例如是单向端点),则表示此操作成功。
  3. 如果配置了'失败表达式'(见下文),则会根据此表达式评估返回消息,以确定是否失败。
  4. 否则:
    1. 如果子消息处理器返回包含异常有效负载的消息,则表示失败。
    2. 如果子消息处理器返回的消息不包含异常有效负载,则表示此操作成功。
  5. http://www.mulesoft.org/documentation/display/current/Routing+Message+Processors#RoutingMessageProcessors-UntilSuccessful