4

非常に一般的なシナリオだと思います。Apache Camel を介して管理される請求書システムがあります。何か問題が発生した場合、管理者に電子メール アラートを送信したいと考えています。

Camelの例外処理について読んだ後、私はこれを思いつきました:(Spring XML内)

<!-- General retrasmission policy set to 3 times -->
        <errorHandler id="deadChannel" type="DeadLetterChannel"
            deadLetterUri="direct:invoice-error">
            <redeliveryPolicy maximumRedeliveries="2"
                redeliveryDelay="1000" backOffMultiplier="2" useExponentialBackOff="true" />
        </errorHandler>

        <!-- Problematic invoices create email alerts to the administrator -->
        <route id="invoices-with-errors">
            <from uri="direct:invoice-error" />
            <bean ref="emailAlert" method="handleProblematicInvoice" />
            <to
                uri="smtp://{{errormail.host}}?to={{errormail.to}}&amp;subject={{errormail.subject}}&amp;from={{errormail.from}};debugMode=true;connectionTimeout=5000" />
        </route>

これは私のユースケースでは問題なく機能します。例外がスローされると、実際に定義されたアドレスに電子メールが送信されます。

ただし、まれなケースをテストするために、内部の電子メール サーバーを停止して何が起こるかを確認しました。Camel がメール送信を試行し、5 秒後に試行を停止すると予想しました (上記の smpt URL の connectionTimout オプションで設定)。

しかし実際には、Camel アプリケーション全体がハングします。これは絶対に受け入れられません。メール サーバーが 100% 稼働することを保証することはできません。

ここで何か不足していますか?メールアラートのアイデアを完全に削除する必要がありますか、それともメールサーバーがダウンしたときにハングしないようにするための別の特別なオプションが Camel に必要ですか?

答え

この線

debugMode=true;connectionTimeout=5000 

する必要があります

debugMode=true&amp;connectionTimeout=5000
4

1 に答える 1

1

Camel は Java Mail API を使用しているため、電子メールを送信したり、何かがおかしいと判断したりするのにどれだけの時間がかかるかに左右されます。

WireTap を使用して、メールを非同期送信できます。その後、エラー ハンドラ スレッドは、より長い間ブロックされているようには見えません http://camel.apache.org/wire-tap

于 2011-08-18T12:55:05.900 に答える