我花了几个小时试图解决我的问题,这似乎是由 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 && (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