我需要通过 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)
为时,出队正在自动提交模式下执行。
所以我在这里卡住了。有谁知道,如何使用 JmsTemplate 通过 receive() 方法将 ADT 类型消息出列,或者如何将 AQjmsSession 推送到现有事务中?