3

我想从 SMTP 端点捕获错误(例如,如果它配置错误或服务器关闭),当这种情况发生时,阻止消息继续正常路径,而是进入异常流。异常处理程序起作用并且消息被路由到异常流中。出乎意料的是,消息是重复的,并且也以“正常”流程进行。我希望它只会朝一个方向发展:如果成功发送电子邮件,则进入正常端点,如果发送失败,则进入异常端点。

在下面提供的示例中,smtp 因 UnknownHostException 而失败,消息进入 failureEndpoint,但由于某种原因,消息也最终出现在 outboundEndpoint:

<mule><!-- namespaces omitted for readability -->
    <flow name="sample-flowFlow1" doc:name="sample-flowFlow1">
        <inbound-endpoint ref="inboundEndpoint" doc:name="AMQP Consumer"/>
        <smtp:outbound-endpoint host="foobaz" to="test@example.com" from="test@example.com" subject="test" responseTimeout="10000" doc:name="SMTP"/>
        <outbound-endpoint ref="outboundEndpoint" doc:name="AMQP Publisher"/>
        <exception-strategy ref="FailureNotification" doc:name="Publish failure notification" />
    </flow>

    <catch-exception-strategy name="FailureNotification">
        <flow-ref name="FailureNotificationFlow" doc:name="Flow Reference" />
    </catch-exception-strategy>
    <sub-flow name="FailureNotificationFlow" doc:name="FailureNotificationFlow">
        <outbound-endpoint ref="failureEndpoint" doc:name="Failure Endpoint"/>
    </sub-flow>
</mule>

当消息在 inboundEndpoint 上发布并且 SMTP 连接器按照提供的示例中的方式配置错误时,我希望仅在 failureEndpoint 中看到该消息,而不是在 outboundEndpoint 和 failureEndpoint 中。我该如何做到这一点?

骡版本:3.4.0

4

2 回答 2

2

在此流程中,您使用多个出站。流程不等待 smtp 的响应,仍然继续下一个出站。
在继续出站之前,可以添加一个条件来检查 smtp 是否成功。

修改后的流程如下所示。尝试这个。

<flow name="sample-flowFlow1" doc:name="sample-flowFlow1">
    <inbound-endpoint ref="inboundEndpoint" doc:name="AMQP Consumer"/>
    <flow-ref name="mailingFlow" ></flow-ref>       
    <choice>
        <when expression="#[flowVars['mailingSuccess'] == 'failure']">
            <logger level="INFO" message="Mailing failed"></logger>
        </when>
        <otherwise>
            <outbound-endpoint ref="outboundEndpoint" doc:name="AMQP Publisher"/>       
        </otherwise>
    </choice>                   
</flow>

<flow name="mailingFlow" processingStrategy="synchronous" >
    <smtp:outbound-endpoint host="foobaz" to="test@example.com" from="test@example.com" subject="test" responseTimeout="10000" doc:name="SMTP"/>
    <catch-exception-strategy name="FailureNotification">
        <set-variable variableName="mailingSuccess" value="failure" ></set-variable>
        <flow-ref name="FailureNotificationFlow" doc:name="Flow Reference" />        
    </catch-exception-strategy>
</flow>

<sub-flow name="FailureNotificationFlow" doc:name="FailureNotificationFlow">
    <outbound-endpoint ref="failureEndpoint" doc:name="Failure Endpoint"/>
</sub-flow>

希望这可以帮助

于 2013-05-29T18:52:24.137 回答
0

即使流是同步的,也没有什么区别。SMTP 传输在 mule 中是异步/单向的。因此,您无法从传输中获取状态以确定它是否成功并基于此路由流。如果您需要基于状态进行路由,您最好编写一个电子邮件组件并将其嵌入到流程中。如果电子邮件组件引发了 MessagingException,则错误处理程序流将自动处理该异常,并且不会执行出站端点。

于 2013-09-23T04:11:46.560 回答