【发布时间】: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 有效负载的目的地指定有效负载工厂
非常感谢任何帮助
谢谢 达米安
【问题讨论】:
有没有人让 Spring JMS 与 Oracle AQ 队列一起工作?
我正在尝试根据这篇文章连接到 AQ http://blog.nominet.org.uk/tech/2007/10/04/spring-jms-with-oracle-aq/
但我现在收到此错误 JMS-137:必须为具有 ADT 有效负载的目的地指定有效负载工厂
非常感谢任何帮助
谢谢 达米安
【问题讨论】:
该错误向我表明它实际上正在工作,但您没有给它一个有效负载工厂来创建从队列中出来的对象。您在创建接收器时执行此操作。在这种情况下,我的有效负载是 XMLTYPE,所以我只使用它的有效负载工厂:
queueReceiver = ((AQjmsSession) queueSession).
createReceiver(queue, XMLType.getORADataFactory());
【讨论】:
当您想要对 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
【讨论】:
如果您使用 Spring,这就是您可以解决的方法:http://blog.javaforge.net/post/30858904340/oracle-advanced-queuing-spring-custom-types
在“无弹簧”环境中,只需创建您自己的消息消费者,如上面的博客文章中所述。
【讨论】: