Mule ESB同步直到成功修复有效负载

时间:2015-01-07 20:28:38

标签: http mule outbound

我花了好几个小时试图解决我的问题,这似乎是由Mule ESB v3.5.0中的同步直到成功范围引起的。它似乎在发送出站HTTP请求时修改消息有效负载。

我需要在从HTTP服务器成功返回出站HTTP请求后继续我的流程(有时会出现连接问题)。因此,我需要直到成功的同步变体。现在我在直到成功阻止之后只使用一个简单的记录器。

我的HTTP请求正文是一个XML文件。当我的服务器没有问题并且直到成功不需要再次发出另一个HTTP请求时,我会收到我发送的XML。

但是,当存在连接问题时,直到成功重复请求几次,然后服务器重新联机,在我的服务器上,我收到org.apache.commons.httpclient.methods.PostMethod的实例,而不是请求正文中发送的XML !

所以我的服务器上不再有XML了。看来这个同步直到成功只是丢弃了原始的消息有效载荷...

Until Successful的标准异步变体按预期工作 - 始终在请求中获取XML。

以下是使用Until Successful:

的HTTP出站端点的最小示例
  <flow name="perform" doc:name="performHTTP">
      <until-successful  maxRetries="${repeater.retries}" millisBetweenRetries="${repeater.period}" failureExpression="#[exception != null &amp;&amp; (exception.causedBy(java.net.ConnectException) || exception.causedBy(java.net.SocketTimeoutException)) || message.inboundProperties['http.status'] != 200]"  doc:name="Until Successful - Repeater" synchronous="true">
          <http:outbound-endpoint exchange-pattern="request-response" host="${https.outbound.address}" port="${https.outbound.port}" path="${https.outbound.path}" method="POST"  mimeType="text/xml"  transformer-refs="Custom_Outbound_HTTPS_Header" contentType="text/xml" doc:name="HTTPS - Outbound" doc:description="Outcoming HTTPS connection" responseTimeout="15000"/>
      </until-successful>

      <logger message="#['Sending done']" level="INFO" doc:name="Logger - Done"/>
  </flow>

长话短说:

  • 同步直到成功:XML - &gt; HTTP请求 - {NET} - HTTP请求 - &gt; org.apache.commons.httpclient.methods.PostMethod

  • 异步直到成功:XML - &gt; HTTP请求 - {NET} - HTTP请求 - &gt; XML

2 个答案:

答案 0 :(得分:1)

我遇到了同样的问题并通过保存我的有效负载来修复它,并在每次重试时检索这样的

<set-variable value="#[payload]" variableName="paloadbeforecall" doc:name="Variable" />

<until-successful  maxRetries="${repeater.retries}" millisBetweenRetries="${repeater.period}" failureExpression="#[exception != null &amp;&amp; (exception.causedBy(java.net.ConnectException) || exception.causedBy(java.net.SocketTimeoutException)) || message.inboundProperties['http.status'] != 200]"  doc:name="Until Successful - Repeater" synchronous="true">
      <processor-chain>
            <set-payload  value="#[flowVars.?paloadbeforecall]"  doc:name="Variable" />
            <http:outbound-endpoint exchange-pattern="request-response" host="${https.outbound.address}" port="${https.outbound.port}" path="${https.outbound.path}" method="POST"  mimeType="text/xml"  transformer-refs="Custom_Outbound_HTTPS_Header" contentType="text/xml" doc:name="HTTPS - Outbound" doc:description="Outcoming HTTPS connection" responseTimeout="15000"/>
      </processor-chain>
</until-successful>

答案 1 :(得分:0)

听起来像个臭虫。将此报告为一个问题会很有趣。无论如何,有一个简单的解决方法,只需在wire-tap中包含直到成功。 This将创建消息的副本(不一定是有效负载),并且假设有效负载是不可变的(String),那么oubound-endpoint将只更改引用而不会影响{{1之后的流量}}