Apache Camel を Oracle Advanced Queues および JMS と組み合わせて使用すると問題が発生します。
メッセージを配信するアプリです。Camel の助けを借りて、メッセージが受信され、Oracle Advanced Queues にエンキューされます。次に、それらは Camel で消費され、ターゲット システムに転送されます。メッセージ配信が失敗した場合のために、高度なキューで定義された再試行回数があり、メッセージ配信が繰り返されます。
Camel がメッセージをデキューし、利用できないターゲット システムに送信すると、HttpOperationFailedException または NoSuchEndpointException がスローされます。これらは捕捉され、ロールバックが実行されます。
この時点で、メッセージ配信が再試行回数で定義された回数だけ再試行され、例外キューに移動されることが期待されます。ただし、何が起こっているかというと、キュー内の次のメッセージが送信されます。
メッセージの内容は相互に部分的に依存しているため、順次処理する必要があります。
JMS ライブラリの使用方法に設定ミスがあると思いますが、よくわかりませんし、この動作に影響を与えるものは何も見つかりませんでした。
使用する JMS ライブラリは Oracle AqApi v 11.2.0.3 です。
Camel ルートのコードは次のとおりです。
from("jms-camel-component:myComponent.AQ?jmsMessageType=Text").routeId("deliveryToTarget")
.transacted()
.setExchangePattern(ExchangePattern.InOut)
.setHeader(Exchange.HTTP_QUERY, constant("throwExceptionOnFailure=false"))
.setHeader(Exchange.CONTENT_TYPE, constant("application/xml; charset=UTF-8"))
.doTry()
.recipientList(header("endpointTarget"))
.endDoTry()
.process(ResponseProzessor.getInstance())
.log("Message was delivererd.")
.doCatch(HttpOperationFailedException.class, NoSuchEndpointException.class)
.process(ResponseProzessor.getInstance())
.log("Error occured.")
.rollback()
.end();
JmsComponent の構成は次のとおりです。
JmsComponent jmsComponent = new JmsComponent(scc);
jmsComponent.setConnectionFactory(connectionFactory);
jmsComponent.setTransactionManager(tm);
jmsComponent.setMaxConcurrentConsumers(1);
jmsComponent.setMaxMessagesPerTask(1);
jmsComponent.setIncludeSentJMSMessageID(true);
よろしくお願いします。
アップデート
説明されている動作の理由を見つけたと思います。アドバンスト キューに構成された遅延があります。遅延が続く限り、キューからの次のメッセージがデキューされます。メッセージはランダムにデキューされるのではなく、優先度に従ってデキューされます。
これは、消費者で構成する必要があるものだと本当に思います。例外キューにコミットまたは移動されていない限り、キューからの最初のメッセージを消費するように camel-jms-component を構成するトリックはありますか? キャメルで直接設定するオプションが見つかりませんでした...