Mule请求响应VM的回滚异常策略

Posted

技术标签:

【中文标题】Mule请求响应VM的回滚异常策略【英文标题】:Roll back exception strategy for Mule request response VM 【发布时间】:2015-07-03 04:53:24 【问题描述】:

我正在使用 mule 请求响应 VM,并且需要 VM 重新处理回滚消息以防出现某些异常,例如连接问题。但是,当我使用交换模式作为 VM 的请求响应时,回滚异常策略似乎不起作用。我使用请求响应的原因是我需要知道我的所有 VM 消息何时被处理并在此之后启动另一个任务。我认为行为是当出现异常时,回滚策略会捕获异常并可能提交它。我没有看到它尝试将消息重新传递回 VM。当交换模式是单向时,它确实很有效。

     <flow name="vmtransactionrollbackFlow">
            <http:listener config-ref="HTTP_Listener_Configuration" path="/myvm" doc:name="HTTP"/>
             <set-payload value="Dummy list payload" doc:name="Set Payload"/>
            <foreach doc:name="For Each">
            <vm:outbound-endpoint exchange-pattern="request-response" path="myvm" connector-ref="VM" doc:name="VM">
                <vm:transaction action="ALWAYS_BEGIN"/>
            </vm:outbound-endpoint>
            </foreach>
            <logger message="DO SOMETHING ONLY AFTER ALL MESSAGES IN VM ARE PROCESSED" level="INFO" doc:name="Logger"/>
            </flow>
        <flow name="vmtransactionrollbackFlow1">
            <vm:inbound-endpoint exchange-pattern="request-response" path="myvm" connector-ref="VM" doc:name="VM">
                <vm:transaction action="BEGIN_OR_JOIN"/>
            </vm:inbound-endpoint>
             <scripting:component doc:name="Groovy">
                <scripting:script engine="Groovy"><![CDATA[throw new java.lang.Exception("Test exception");]]></scripting:script>
            </scripting:component>
               <rollback-exception-strategy maxRedeliveryAttempts="3" doc:name="Rollback Exception Strategy">
                <logger message="Rolling back #[payload]" level="INFO" doc:name="Logger"/>
                <on-redelivery-attempts-exceeded>
                    <logger message="Redelivery exhausted:#[payload]" level="INFO" doc:name="Logger"/>
                </on-redelivery-attempts-exceeded>
            </rollback-exception-strategy>
        </flow>

【问题讨论】:

【参考方案1】:

是的,我遇到了类似的问题,当 VM 出站使用请求-响应交换模式时,它的行为更像是 flow-ref,不涉及任何“队列”,因此没有重新传递机制。

因此,如果 VM 被配置为单向并且流处理策略是同步的(VM 入站流),那么重新交付就会启动。

要实现您想要的,您可以在 vmtransactionrollbackFlow1 流中使用 until-successful 范围,尤其是对于间歇性连接丢失的情况,这实际上是推荐的方法。您根本不需要交易。

如果您发现了其他解决方法,请告诉我们进展情况。

【讨论】:

感谢您的回复,但请求回复似乎无法应用于事务性虚拟机。所以,这对我的情况没有用,我需要回滚。 抱歉最初误导了你,我已经更新了答案。 再次感谢。在试过这个,它似乎工作正常,但是,我确实在我的日志中看到以下内容。INFO 2015-06-05 10:23:39,499 [[CDS-O].refresh-item-flow.stage1. 02] org.mule.routing.SynchronousUntilSuccessfulProcessingStrategy:在表达式“exception.causedBy(...)”的执行成功之前抛出异常。顺便说一句,我正在尝试将失败表达式设为 #[exception.causedBy(java.net.SocketException)......]" . 您发布了新问题吗? 我所要做的就是在我的失败表达式中添加一个空检查 -" exception!=null && exception.causedBy(....)" 。 [链接] (***.com/questions/20505855/…)

以上是关于Mule请求响应VM的回滚异常策略的主要内容,如果未能解决你的问题,请参考以下文章

记录 WebClient 的请求、响应和异常

http://localhost:4200' 已被 CORS 策略阻止:对预检请求的响应未通过

Mule ESB:无法使用流有效负载复制消息

角 POST 请求被 CORS 策略阻止:对预检请求的响应未通过访问控制检查

已被 CORS 策略阻止:对预检请求的响应未通过

UCWA 收到 502 响应(网关错误,策略阻止请求被代理)