JMSを介してADTペイロードメッセージを使用してOracleAQを操作する必要があります。問い合わせは簡単でした(記事http://blog.nominet.org.uk/tech/2007/10/04/spring-jms-with-oracle-aq/に従ってください):
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
public void doInTransactionWithoutResult(TransactionStatus status) {
// some code....
jmsTemplate.send(new MyMessageCreator(myADTMessage));
// some code...
}
});
ここで、MyMessageCreatorはmyADTMessage(jpubを使用して作成)をMessageにラップしました。正常に動作し、トランザクション内で動作します-例外はクエリをロールバックし、メッセージはキューに挿入されません。
問題はdequeingで始まりました。メッセージを同期して受信する必要があるため、最初の試行は次のとおりです。
Message messaege = jmsTemplate.receive();
「ADTペイロードのある宛先にはJMS-137ペイロードファクトリを指定する必要があります」と表示されます。
その問題の解決策が見つからないため、基になるオブジェクトを手動で初期化しようとしました。
transactionTemplate.execute(new TransactionCallbackWithoutResult() {
public void doInTransactionWithoutResult(TransactionStatus status) {
QueueConnection queueCon = aqConnectionFactory.createQueueConnection();
AQjmsSession queueSession = (AQjmsSession) queueCon.createQueueSession(true, Session.AUTO_ACKNOWLEDGE);
QueueReceiver receiver = queueSession.createReceiver(myQueue, MyADTMessageType.getORADataFactory());
queueCon.start();
Message message = receiver.receiveNoWait();
queueCon.stop();
// some code....
}
});
ここで、aqConnectionFactoryは自動配線されたSpringBeanです。
メッセージは適切にデキューされますが、ローカルjmsトランザクションで!queueSession.commit()がないと、それらはキューにとどまり、セッションの作成をに変更するとcreateQueueSession(false, Session.AUTO_ACKNOWLEDGE)
、デキューは自動コミットモードで実行されます。
だからここで私は立ち往生しました。JmsTemplateを使用してreceive()メソッドでADTタイプのメッセージをデキューする方法、またはAQjmsSessionを既存のトランザクションにプッシュする方法について誰かが考えていますか?