SMTP发送出错时Mule流执行意外拆分

SMTP发送出错时Mule流执行意外拆分,mule,esb,flow,mule-studio,Mule,Esb,Flow,Mule Studio,我希望捕获SMTP端点的错误(例如,如果配置错误或服务器关闭),并且在发生这种情况时,阻止邮件继续正常路径,而不是进入异常流。异常处理程序工作,消息被路由到异常流中。出乎意料的是,消息被复制,并且也会继续进行“正常”流。我希望它只朝一个方向发展:如果电子邮件发送成功,则进入正常端点;如果发送失败,则进入异常端点 在下面提供的示例中,smtp因UnknownHostException而失败,消息进入failureEndpoint,但由于某种原因,消息也最终进入outboundEndpoint:

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

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


当消息在inboundEndpoint上发布,并且SMTP连接器的配置与提供的示例中的配置不符时,我希望只在failureEndpoint中查看消息,而不是同时在outboundEndpoint和failureEndpoint中查看。我如何做到这一点


Mule版本:3.4.0

在这个流程中,您使用了多个出界。流不会等待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>


希望这会有所帮助

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

感谢您提供了一个很好的答案,使用processingStrategy=“synchronous”确实解决了这个问题!