【问题标题】:Spring JMS and Oracle AQSpring JMS 和 Oracle AQ
【发布时间】:2010-12-15 14:27:46
【问题描述】:

有没有人让 Spring JMS 与 Oracle AQ 队列一起工作?

我正在尝试根据这篇文章连接到 AQ http://blog.nominet.org.uk/tech/2007/10/04/spring-jms-with-oracle-aq/

但我现在收到此错误 JMS-137:必须为具有 ADT 有效负载的目的地指定有效负载工厂

非常感谢任何帮助

谢谢 达米安

【问题讨论】:

    标签: java oracle spring


    【解决方案1】:

    该错误向我表明它实际上正在工作,但您没有给它一个有效负载工厂来创建从队列中出来的对象。您在创建接收器时执行此操作。在这种情况下,我的有效负载是 XMLTYPE,所以我只使用它的有效负载工厂:

    queueReceiver = ((AQjmsSession) queueSession).
       createReceiver(queue, XMLType.getORADataFactory());
    

    【讨论】:

      【解决方案2】:

      当您想要对 AnyDataType 或用户定义的有效负载进行入队或出队时,您必须提供 JDBC 类型映射。

      执行此操作的最佳位置,在您发布的链接中将在 OracleAqDestinationFactoryBean.getObject 中。

      就我而言,我想将 XMLType 的 Oracle LCR 出队,因此我必须在 getObject 中执行以下操作

      public Object getObject() throws Exception {
          QueueConnection queueConnection = connectionFactory.createQueueConnection();
          AQjmsSession session = (AQjmsSession) queueConnection.createQueueSession(true,
                  Session.SESSION_TRANSACTED);
          Map map = session.getTypeMap();
          map.put("SYS.XMLTYPE", Class.forName("oracle.xdb.XMLTypeFactory"));
          return session.getQueue(queueUser, queueName);
      }
      

      请记住,对于 AnyDataType Payload,您必须使用 OCI JDBC 驱动程序,因为瘦驱动程序不会这样做。

      在此处了解有关自定义有效负载的更多信息 http://download.oracle.com/docs/cd/B19306_01/server.102/b14257/aq_stage.htm#sthref2705

      【讨论】:

        【解决方案3】:

        如果您使用 Spring,这就是您可以解决的方法:http://blog.javaforge.net/post/30858904340/oracle-advanced-queuing-spring-custom-types

        在“无弹簧”环境中,只需创建您自己的消息消费者,如上面的博客文章中所述。

        【讨论】:

          猜你喜欢
          • 2011-05-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-02
          • 2016-05-04
          • 1970-01-01
          相关资源
          最近更新 更多