Mule ESB 同步直到有效载荷修改成功

Mule ESB synchronous Until Successful payload modification

我花了几个小时试图解决我的问题,这似乎是由 Mule ESB v3.5.0 中的同步 Until Successful Scope 引起的。它似乎在发送出站 HTTP 请求时修改了消息负载。

从 HTTP 服务器(有时会出现连接问题)成功 returns 出站 HTTP 请求后,我需要继续我的流程。因此我需要 Until Successful 的同步变体。现在我只在 Until Successful 块之后使用一个简单的 Logger。

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

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

所以我的服务器上不再有 XML。似乎这个 sync Until Successful 简单地丢弃了原始消息负载...

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>

长话短说:

听起来像个错误。将此作为问题报告会很有趣。无论如何,有一个简单的解决方法,只需将 until-successful 包装在 wire-tap 中。 This 将创建消息的副本(不一定是有效负载)并且假定有效负载是不可变的(String),oubound-endpoint 将仅更改引用而不影响 [=10 之后的流=].

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

<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>