7

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 を構成するトリックはありますか? キャメルで直接設定するオプションが見つかりませんでした...

4

1 に答える 1