我花了好几个小时试图解决我的问题,这似乎是由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 && (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
答案 0 :(得分:1)
我遇到了同样的问题并通过保存我的有效负载来修复它,并在每次重试时检索这样的
<set-variable value="#[payload]" variableName="paloadbeforecall" doc:name="Variable" />
<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">
<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之后的流量}}