0

相手が Oracle の JMS TEXT キュー (Java を使用していないカスタム アプリケーション) にメッセージを配置するという問題があり、それを取り上げます。ルートは非常に単純です。

<!--Receive data from oracle queue -->
<route id="ReadFromQueue" autoStartup="true">
    <from uri="oracleQueue:queue:SCAQUSER.SCD2TC?jmsMessageType=Text" />
    <log message="Picked up message ${body}" />
    <to uri="file:/e:/Tradechannel/in" />
</route>

接続は稼働中であり、メッセージがキューに入れられるとすぐにルートが応答します。oracle.jms.traceLevel=6 でコードを実行すると、少なくとも私の目にはすべてが正しく機能しているように見えます。

Camel (camel-1) スレッド #4 - JmsConsumer[SCAQUSER.SCD2TC] [Thu Dec 19 10:08:44 CET 2019] AQjmsConsumer.jdbcDequeue: タイムアウト: 1 秒。反復: 1 間隔: 120 最後の間隔: 1
Camel (camel-1) スレッド #4 - JmsConsumer[SCAQUSER.SCD2TC] [Thu Dec 19 10:08:44 CET 2019] AQjmsConsumer.jdbcDequeue: 待機時間: 1
Camel (camel-1) スレッド #4 - JmsConsumer[SCAQUSER.SCD2TC] [Thu Dec 19 10:08:44 CET 2019] AQjmsConsumer.jdbcDequeue: ペイロード タイプ:SYS.AQ$_JMS_TEXT_MESSAGEpayload タイプ コード:2002
Camel (camel-1) スレッド #4 - JmsConsumer[SCAQUSER.SCD2TC] [Thu Dec 19 10:08:44 CET 2019] AQjmsSession.getCompliant: Session :false
Camel (camel-1) スレッド #4 - JmsConsumer[SCAQUSER.SCD2TC] [Thu Dec 19 10:08:44 CET 2019] AQjmsUtil.getTextData: エントリ
Camel (camel-1) スレッド #4 - JmsConsumer[SCAQUSER.SCD2TC] [Thu Dec 19 10:08:44 CET 2019] AQjmsUtil.getTextData: textLen: 288
Camel (camel-1) スレッド #4 - JmsConsumer[SCAQUSER.SCD2TC] [Thu Dec 19 10:08:44 CET 2019] AQjmsUtil.getTextData: exit
Camel (camel-1) スレッド #4 - JmsConsumer[SCAQUSER.SCD2TC] [Thu Dec 19 10:08:44 CET 2019] AQjmsConsumer.jdbcDequeue: text_message が取得されました
Camel (camel-1) スレッド #4 - JmsConsumer[SCAQUSER.SCD2TC] [Thu Dec 19 10:08:44 CET 2019] AQjmsConsumer.jdbcDequeue: AQ エンキュー時間を 1576249545000 に設定
Camel (camel-1) スレッド #4 - JmsConsumer[SCAQUSER.SCD2TC] [Thu Dec 19 10:08:44 CET 2019] AQjmsConsumer.jdbcDequeue: msg_id: 999832415E09038AE0535C35EB751E09 corrid: null 優先度: 1
Camel (camel-1) スレッド #4 - JmsConsumer[SCAQUSER.SCD2TC] [Thu Dec 19 10:08:44 CET 2019] AQjmsConsumer.jdbcDequeue: msg_delay(secs): 0
Camel (camel-1) スレッド #4 - JmsConsumer[SCAQUSER.SCD2TC] [Thu Dec 19 10:08:44 CET 2019] AQjmsConsumer.jdbcDequeue: exptime(secs): -1
Camel (camel-1) スレッド #4 - JmsConsumer[SCAQUSER.SCD2TC] [Thu Dec 19 10:08:44 CET 2019] AQjmsConsumer.jdbcDequeue: 試行: 0
Camel (camel-1) スレッド #4 - JmsConsumer[SCAQUSER.SCD2TC] [Thu Dec 19 10:08:44 CET 2019] AQjmsConsumer.jdbcDequeue: 例外キュー: null
Camel (camel-1) スレッド #4 - JmsConsumer[SCAQUSER.SCD2TC] [Thu Dec 19 10:08:44 CET 2019] AQjmsSession.getCompliant: Session :false
Camel (camel-1) スレッド #4 - JmsConsumer[SCAQUSER.SCD2TC] [Thu Dec 19 10:08:44 CET 2019] AQjmsConsumer.jdbcDequeue: recv_time: 1576746524523
Camel (camel-1) スレッド #4 - JmsConsumer[SCAQUSER.SCD2TC] [Thu Dec 19 10:08:44 CET 2019] AQjmsSession.inGlobalTransRechecked: エントリ
Camel (camel-1) スレッド #4 - JmsConsumer[SCAQUSER.SCD2TC] [Thu Dec 19 10:08:44 CET 2019] AQjmsSession.inGlobalTransRechecked: oracle.jms.useEmulatedXA がオン
Camel (camel-1) スレッド #4 - JmsConsumer[SCAQUSER.SCD2TC] [Thu Dec 19 10:08:44 CET 2019] EmulatedXAHandler.inGlobalTrans: エントリ、reCheck=true
Camel (camel-1) スレッド #4 - JmsConsumer[SCAQUSER.SCD2TC] [Thu Dec 19 10:08:44 CET 2019] EmulatedXAHandler.checkForGlobalTxn: エントリ
Camel (camel-1) スレッド #4 - JmsConsumer[SCAQUSER.SCD2TC] [Thu Dec 19 10:08:44 CET 2019] EmulatedXAHandler.inGlobalTrans: exit
Camel (camel-1) スレッド #4 - JmsConsumer[SCAQUSER.SCD2TC] [Thu Dec 19 10:08:44 CET 2019] AQjmsSession.inGlobalTransRechecked: exit
Camel (camel-1) スレッド #4 - JmsConsumer[SCAQUSER.SCD2TC] [Thu Dec 19 10:08:44 CET 2019] AQjmsSession.restartConsumers: エントリ
Camel (camel-1) スレッド #4 - JmsConsumer[SCAQUSER.SCD2TC] [Thu Dec 19 10:08:44 CET 2019] AQjmsConsumer.doCommit: データベース接続をコミットすることによって受信した 1 つのメッセージを確認しました
Camel (camel-1) スレッド #4 - JmsConsumer[SCAQUSER.SCD2TC] [Thu Dec 19 10:08:44 CET 2019] AQjmsConsumer.jdbcDequeue: exit

メッセージはキューから削除されますが、アプリケーション ログにエラーが表示されます...

2019-12-19 10:08:44:554 oaccjms.EndpointMessageListener 警告 - JMS メッセージ リスナーの実行に失敗しました。原因: [org.apache.camel.RuntimeCamelException - JMSXGroupSeq]
org.apache.camel.RuntimeCamelException: JMSXGroupSeq
    org.apache.camel.component.jms.JmsBinding.extractHeadersFromJms (JmsBinding.java:225) で
    org.apache.camel.component.jms.JmsMessage.populateInitialHeaders (JmsMessage.java:235) で
    org.apache.camel.impl.DefaultMessage.createHeaders (DefaultMessage.java:258) で
    org.apache.camel.component.jms.JmsMessage.ensureInitialHeaders (JmsMessage.java:220) で
    org.apache.camel.component.jms.JmsMessage.getHeader (JmsMessage.java:170) で
    org.apache.camel.impl.DefaultMessage.getHeader(DefaultMessage.java:94) で
    org.apache.camel.impl.DefaultUnitOfWork.(DefaultUnitOfWork.java:115) で
    org.apache.camel.impl.DefaultUnitOfWork.(DefaultUnitOfWork.java:75) で
    org.apache.camel.impl.DefaultUnitOfWorkFactory.createUnitOfWork(DefaultUnitOfWorkFactory.java:34) で
    org.apache.camel.processor.CamelInternalProcessor$UnitOfWorkProcessorAdvice.createUnitOfWork (CamelInternalProcessor.java:695) で
    org.apache.camel.processor.CamelInternalProcessor$UnitOfWorkProcessorAdvice.before(CamelInternalProcessor.java:663) で
    org.apache.camel.processor.CamelInternalProcessor$UnitOfWorkProcessorAdvice.before(CamelInternalProcessor.java:634) で
    org.apache.camel.processor.CamelInternalProcessor.process (CamelInternalProcessor.java:149) で
    org.apache.camel.processor.DelegateAsyncProcessor.process (DelegateAsyncProcessor.java:97) で
    org.apache.camel.component.jms.EndpointMessageListener.onMessage (EndpointMessageListener.java:113) で
    org.springframework.jms.listener.AbstractMessageListenerContainer.doInvokeListener(AbstractMessageListenerContainer.java:736) で
    org.springframework.jms.listener.AbstractMessageListenerContainer.invokeListener(AbstractMessageListenerContainer.java:696) で
    org.springframework.jms.listener.AbstractMessageListenerContainer.doExecuteListener(AbstractMessageListenerContainer.java:674) で
    org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:318) で
    org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:257) で
    org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1189) で
    org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.executeOngoingLoop(DefaultMessageListenerContainer.java:1179) で
    org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:1076) で
    java.util.concurrent.ThreadPoolExecutor.runWorker で (不明なソース)
    java.util.concurrent.ThreadPoolExecutor$Worker.run (不明なソース) で
    java.lang.Thread.run で (不明なソース)
原因: javax.jms.MessageFormatException: JMS-117: 変換に失敗しました - 無効なプロパティ タイプ
    oracle.jms.AQjmsError.throwMsgFormatEx(AQjmsError.java:452)で
    oracle.jms.AQjmsMessage.getObjectProperty(AQjmsMessage.java:1584)で
    org.apache.camel.component.jms.JmsMessageHelper.getProperty (JmsMessageHelper.java:118) で
    org.apache.camel.component.jms.JmsBinding.extractHeadersFromJms (JmsBinding.java:214) で
    ... 25 個の共通フレームを省略

スタックトレースを正しく理解している場合、ヘッダーJMSXGroupSeqが欠落しているのは oracle.jms API であり、相手が Oracle jms API を使用してメッセージを作成していないため、これはありそうもありません。彼も私も実際のキューを表示することはできません (相互クライアント側にあります)。

カスタム headerFilterStrategy を使用しても、headerFilterStrategy に到達する直前にエラーがスローされるため、役に立ちません。以下の org.apache.camel.component.jms.JmsBinding メソッドの extractHeadersFromJms からの抜粋を参照してください。エラーはJmsMessageHelper.getProperty()からスローされます

Object value = JmsMessageHelper.getProperty(jmsMessage, name);
if (headerFilterStrategy != null 
 && headerFilterStrategy.applyFilterToExternalHeaders(name, value, exchange)) {
 continue;
 }

だから私の最初の質問は...

「無効」である可能性があるメッセージを受信することは可能ですか?キャメルとオラクル API が欠落/無効なヘッダーを無視するようにすることはできますか?

2番目の質問...実際には受信側でメッセージが正常に再作成されなかったのに、オラクルはすべてがうまくいったかのようにメッセージを確認するのはなぜですか?

4

1 に答える 1

0

「変換に失敗しました」というエラー メッセージが表示されたため、JMS プロパティJMSXGroupSeqのタイプが無効であると思われます。

Camel は単にこの値を読み取ろうとするだけなのでJmsMessageHelper.getProperty、このプロパティには非常に奇妙な値が含まれているに違いないと思います。

JMS Toolboxなどのツールを使用して、そのようなメッセージの内部をのぞき見したことがありますか? プロパティ値が表示された場合は、プロデューサーに修正方法をアドバイスできます。

質問に答えるには:

「無効」の可能性があるメッセージを受信することはできますか?

キャメルでは、そうは思いません。Camel はライブを便利にすることに優れているため、すべての低レベルの処理を行い、メッセージを含む素敵な Exchange オブジェクトを提供します。

この部分で例外がスローされた場合、既に述べたように、介入する前に例外がスローされるため、運が悪いと思います。これは、そのようなケースがいかにまれであるか、およびこのプロパティ値がいかに奇妙であるかを暗黙のうちに示しています。

ただし、もちろん、他のものを使用してメッセージを消費することもできます。すべてのヘッダーを自動的に読み取ろうとはしませんが、少なくとも JMS の低レベルの作業を行うもの。おそらく、 Spring JMSが候補になるでしょう。Camel JMS は内部で Spring JMS を使用します。

オラクルがメッセージを確認するのはなぜですか?

JMSドキュメントJMSXGroupSeqのプロパティについて

JMSXGroupID および JMSXGroupSeq は、クライアントがメッセージをグループ化する場合に使用する標準プロパティです。すべてのプロバイダーがそれらをサポートする必要があります。特に明記されていない限り、JMSX プロパティの値とセマンティクスは定義されていません。

値が定義されていない場合、ブローカーが検証に使用できるものは何もありません。

于 2019-12-19T13:41:46.590 に答える