我需要通过JMS使用带有ADT有效负载消息的Oracle AQ。排队很简单(关注文章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中。 它工作正常并且在事务中 - 异常回滚enquing并且消息没有插入队列。
出问题出现问题。我必须同步接收消息,所以第一次尝试是:
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是自动装配的Spring bean。
消息正确出列,但在本地jms事务中!没有queueSession.commit(),他们留在队列中,
当我将创建会话更改为createQueueSession(false, Session.AUTO_ACKNOWLEDGE)
时,dequeing正在自动提交模式下执行。
所以我坚持了下来。有谁有想法,如何使用JmsTemplate使用receive()方法将ADT类型的消息出列,或者如何将AQjmsSession推送到现有的事务中?