0

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

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

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

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

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

直到成功的标准异步变体按预期工作 - 始终在请求中获取 XML。

这是 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 -> HTTP 请求 - { NET } - HTTP 请求 -> org.apache.commons.httpclient.methods.PostMethod

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

4

2 回答 2

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>
于 2015-02-18T07:52:18.417 回答
0

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

于 2015-01-07T20:41:24.277 回答