java - 通过 JMS 使用 Oracle 高级队列 : NPE thrown at AQjmsProducer. jdbcEnqueue

标签 java oracle jms

我想通过 JMS 使用 Oracle Advanced 队列。

我已经通过 plsql 创建了队列表和队列,如下所示:

BEGIN
DBMS_AQADM.CREATE_QUEUE_TABLE(
queue_table            => 'QT3',
queue_payload_type     => 'RAW');
END;
/

BEGIN
DBMS_AQADM.CREATE_QUEUE( 
queue_name          => 'Q3', 
queue_table         => 'QT3'); 
END;
/

然后我尝试发送这样的消息:

    System.setProperty("oracle.jms.traceLevel", "6");

    ConnectionFactory connectionFactory = AQjmsFactory.getConnectionFactory("x.x.x.x", "xxx", 1521, "thin");
    Connection connection = connectionFactory.createConnection("xxx", "xxx");
    connection.start();

    Session session = connection.createSession(true, 0);
    Queue queue = session.createQueue("Q3");
    MessageProducer producer = session.createProducer(queue);
    TextMessage message = session.createTextMessage("valami");
    message.setJMSType("text");
    producer.send(message);
    session.commit();

上面的代码找到了队列(如果我将 Q3 替换为其他内容,那么它会说找不到队列,所以我猜基本的连接设置没问题),但是我在 Producer.send 处遇到了 NPE 异常。我设置了 aqapi 跟踪并得到了以下输出:

main [Fri Jun 20 14:22:51 CEST 2014] AQjmsProducer.send-1:  entry
main [Fri Jun 20 14:22:51 CEST 2014] AQjmsProducer.send-main:  entry
main [Fri Jun 20 14:22:51 CEST 2014] AQjmsProducer.send:  queue: RISKOPALL.Q3
main [Fri Jun 20 14:22:51 CEST 2014] AQjmsProducer.send:  dest_queue: RISKOPALL.Q3
main [Fri Jun 20 14:22:51 CEST 2014] AQjmsProducer.jdbcEnqueue:  entry
main [Fri Jun 20 14:22:51 CEST 2014] AQjmsProducer.checkMessageType:  adt type: null
main [Fri Jun 20 14:22:51 CEST 2014] AQjmsProducer.checkMessageType:  message_class: oracle.jms.AQjmsTextMessage
main [Fri Jun 20 14:22:51 CEST 2014] AQjmsProducer.jdbcEnqueue:  exit
Exception in thread "main" java.lang.NullPointerException
    at oracle.jms.AQjmsProducer.checkMessageType(AQjmsProducer.java:2362)
    at oracle.jms.AQjmsProducer.jdbcEnqueue(AQjmsProducer.java:823)
    at oracle.jms.AQjmsProducer.send(AQjmsProducer.java:747)
    at oracle.jms.AQjmsProducer.send(AQjmsProducer.java:517)
    at aqjms.AqJmsTest.main(AqJmsTest.java:55)

反编译aqapi.jar,发现AQjmsProducer.checkMessageType处“adtType”参数为null,导致抛出NPE。

这个 ADT 类型是什么?我该如何正确设置它?

非常感谢!

最佳答案

设置队列的负载类型解决了问题:

BEGIN
DBMS_AQADM.CREATE_QUEUE_TABLE(
queue_table            => 'QT3',
queue_payload_type     => 'SYS.AQ$_JMS_TEXT_MESSAGE',
compatible => '8.1.0');
END;
/

关于java - 通过 JMS 使用 Oracle 高级队列 : NPE thrown at AQjmsProducer. jdbcEnqueue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24327389/

相关文章:

java - Android 媒体播放器 : How to stop if another audio file is being loaded?

.net - Oracle ODP.NET 使用参数调用包过程时出现问题

java - 如何仅通过更改 Struts2 中的配置来更改当前使用的数据库

java - 使用 JMS 的 Websphere MQ,关闭的连接卡在 MQ 上

java - JMS-从远程 Glassfish 接收消息

java - Windows 和 Linux 中 InetSocketAddress#getHostName 对于 "127.0.0.1"的不同行为

javascript - 将 js 从文件系统加载到 spring boot jar 应用程序中(使用 thymeleaf)

java - Java 中的 boolean 表达式求值

performance - 大量插入和截断的 Oracle 性能问题(附加 AWR)

node.js - 通过 node.js 使用 JMS 消息