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 コネクタが提供された例のように誤って構成されている場合、outboundEndpoint と failureEndpoint の両方ではなく、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

フローが同期であっても、違いはありません。Mule では、SMTP トランスポートは非​​同期/一方向です。したがって、トランスポートからステータスを取得して、それが成功したかどうかを確認し、これに基づいてフローをルーティングすることはできません。ステータスに基づいてルーティングする必要がある場合は、メール コンポーネントを記述してフローに埋め込む方がよいでしょう。MessagingException が電子メール コンポーネントによってスローされると、エラー ハンドラー フローによって自動的に処理され、アウトバウンド エンドポイントは実行されません。

于 2013-09-23T04:11:46.560 に答える