2

次のようなキャメルルートがあります。

<route errorHandlerRef="myDeadLetterErrorHandler">
    <from uri="activemq:queue:source"/>
    <to uri="activemq:queue:destA">
    <to uri="activemq:queue:destB">
    <to uri="activemq:queue:destC">
</route>

1 つのエンドポイントでエラーが発生した場合、redeliveryPolicy を設定してメッセージの送信を何度か再試行し、常に失敗した場合、メッセージは DeadLetter Queue に再配信されます。

今、デッドレターキューから失敗エンドポイントにメッセージを送信する方法を探しています.誰か提案はありますか?

次のような障害エンドポイントの情報を抽出するプロセッサを構築することを考えていました。

String lastEndpointUri = exchange.getProperty(Exchange.TO_ENDPOINT, String.class);

そして、ある種の動的ルーティングを構築します...もっと簡単な解決策はありませんか?

4

3 に答える 3

0

もう 1 つのオプションは、DLQ 再配信ロジックに依存する代わりに、Camel でエラーを処理することです。これにより、特定のエラー シナリオをより詳細に制御でき、必要に応じてトリアージ/再試行できます。

このようなもの...詳細については、消費者のポーリングを参照してください

//main route to process message from a queue (needs to be fast)
from("activemq:queue:mainQ").process(...);

//handle any errors by simply moving them to an error queue (for retry later)
onException(Exception.class)
    .handled(true).to("activemq:queue:mainErrorQ");

//retry the error queue
from("timer://retryTimer?fixedRate=true&period=60000")
    .bean(myBean, "retryErrors"); 

...

public void retryErrors() {
    // loop to empty queue
    while (true) {
        // receive the message from the queue, wait at most 3 sec
        Exchange msg = consumer.receive("activemq:queue.mainErrorQ", 3000);
        if (msg == null) {
            // no more messages in queue
            break;
        }

        // send it to the starting queue
        producer.send("activemq:queue.mainQ", msg);
    }
}   
于 2012-10-29T18:13:30.753 に答える
0

メッセージを再送信するだけで後で機能すると信じている場合は、再配信回数を増やしてください。

それ以外の場合は、メッセージを通過させるために何らかの変更を行う可能性があるため、おそらくより複雑なソリューションが必要になるでしょう。つまり、「なぜ失敗したのか」という質問に答えます。多くの場合、何かを実行できるかどうかを判断するために、メッセージ/エラーを調べる人が必要です。必要なロジックは、実装した内容に大きく依存します。

一時的なエラー(ネットワーク障害、データベースのダウンの問題、ディスクがいっぱいなど)の場合は、あなたが言ったように再送信してください。アプリケーションエラーの場合は、よく考える必要があります。

于 2012-10-29T11:58:26.943 に答える
0

回答いただきありがとうございます。エンドポイントを別のルーティングに配置し、それぞれに同じ再配信ポリシーを設定するという問題をすぐに解決しました。

    <route>
        <from uri="activemq:queue:source"/>
        <to uri="activemq:queue:destA1">
        <to uri="activemq:queue:destB1">
        <to uri="activemq:queue:destC1">
    </route>

<route errorHandlerRef="myDeadLetterErrorHandler">
    <from uri="activemq:queue:destA1"/>
    <to uri="activemq:queue:destA">
</route>

<route errorHandlerRef="myDeadLetterErrorHandler">
    <from uri="activemq:queue:destB1"/>
    <to uri="activemq:queue:destB">
</route>

...

このようにして、メッセージは常にすべてのエンドポイントに配信され、失敗したエンドポイントが戻ってきたときにメッセージが再配信されます。

boday によって提案された解決策は正しいと思います。おそらく将来的にそれを試してみます。また、メッセージの合計順序が重要でない場合は、特別なキューを使用して各メッセージを再配信する 「Broker Redelivery」も使用できることも発見しました。http://activemq.apache.org/message-redelivery-and-dlq-handling.html

于 2012-10-30T18:49:44.983 に答える