私はとにかく、私はメッセージがキューに上ロールバックされた消費者のメッセージ処理順序に影響を与える可能性が存在する場合を把握しようとしています。私は私が問題を再現できますその下にいくつかの簡単なコードを持っています。私は、単に特定のために、異なるJMSXGroupIdsとキューにメッセージをプッシュしています:
- "A1"(JMSXGroupId:1)
- "B1"(JMSXGroupId:2)
- "A2"(JMSXGroupId:1)
- "C1"(JMSXGroupId:3)
- "B2"(JMSXGroupId:2)
コードでは、A1のロールバックを作る(それが最初のメッセージ3回再試行)し、それが遅れて戻ってキューに進みます。それは、(時間の遅延量を待った後に)再びA1を拾うB1を意味し、C1グループはA1の後ろにブロックされ、処理されることはありません飽きないことができるまでしかし、消費者は、待っています。
理想的には私は何を期待していたことはA1がキューにバックを入れて待つように指示されたとき、消費者は、B1とC1を拾うだろうということです...私は最終的にやろうとしていることは停止1 JMSXGroupは、消費者に他の人をブロックしています。また、そのおそらく価値は、私はA(A1、A2、A3 ...)のためのメッセージシーケンスの順序を維持する必要があることを追加するとキューにそれらを残すのではなく、例外の一部の管理ソリューションを構築することによってそれを行うには期待していました。
onException(Exception.class)
.log("Exception Caught !! ")
.redeliveryDelay("1000")
.maximumRedeliveries(3)
.handled(false)
.markRollbackOnly()
.log("log:output");
from("amq:queue:mailbox?concurrentConsumers=1")
.to(logEndpoint)
.process(exchange -> {
if(exchange.getIn().getBody(String.class).contains("A")) {
throw new Exception("Found A");
}
});
私は取引ルートを使用してJavaベースのApacheのキャメルマイクロサービスを使用しています。本当に普通の何もないが、必要であれば、私はより詳細/構成の詳細を供給することができます。
前もって感謝します
キュー上の厳密な順序付けは、キューがその基本的な先入れ先出し(すなわちFIFO)のセマンティクスを遵守しなければならないので、このような問題に遭遇することがバインドされています。B1はA1がA1は順序を維持するために消費されるまで、あなたはA2を消費するのを待つ必要があるだろう失敗し、キューはFIFOに消費しなければならないので、他のメッセージのC1の消費と任意のをブロックすることがすぐ後に拾われた場合でも、その背後にあります。