2013-05-29 83 views
3

我想從SMTP端點捕捉錯誤(例如,如果配置錯誤或服務器關閉),並且發生這種情況時,請阻止郵件繼續正常路徑,進入例外流程。異常處理程序起作用,並將消息路由到異常流程中。令人意想不到的是,該消息是重複的,並且也繼續進行「正常」流程。我希望它只能朝着一個方向發展:如果電子郵件發送成功,則進入正常端點,如果發送失敗進入異常端點。騾流執行意外地在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="[email protected]" from="[email protected]" 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中。我該如何做到這一點?

Mule版本:3.4.0

回答

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="[email protected]" from="[email protected]" 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> 

希望這有助於

+0

感謝您的一個很好的答案,使用processingStrategy =「同步」確實解決了問題! –

0

即使流是同步的,它會使沒有什麼區別。 SMTP傳輸是異步/單向的。因此,您無法從運輸中獲得狀態,以確定其是否成功並基於此來確定流量的路線。如果您需要根據狀態進行路由,最好寫一封電子郵件組件並將其嵌入到流程中。如果電子郵件組件拋出MessagingException,它將由錯誤處理程序流自動處理,並且不會執行出站端點。