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