使用JMS从AQ出列ADT(用户类型)消息

时间:2012-10-20 09:25:06

标签: transactions jms oracle-aq jmstemplate

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

0 个答案:

没有答案