2

我需要通过 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 推送到现有事务中?

4

0 回答 0