当前位置: 首页 > 知识库问答 >
问题:

通过在AQjmsProducer上抛出的JMS:NPE使用Oracle高级队列。jdbcEnqueue

楚涵润
2023-03-14

我想通过JMS使用Oracle高级队列。

我已经通过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替换为其他内容,那么它会显示queue not found,所以我想基本的连接设置是可以的),但我在producer得到了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,发现NPE被抛出,因为“adtType”参数在AQjmsProducer.checkMessageType为null。

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

非常感谢你!

共有1个答案

羊舌志
2023-03-14

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

BEGIN
DBMS_AQADM.CREATE_QUEUE_TABLE(
queue_table            => 'QT3',
queue_payload_type     => 'SYS.AQ$_JMS_TEXT_MESSAGE',
compatible => '8.1.0');
END;
/
 类似资料:
  • IBM Websphere文档表明可以使用第三方jms提供者:http://pic.dhe.ibm.com/infocenter/wasinfo/v6r1/index.jsp?topic =/com . IBM . WebSphere . nd . doc/info/AE/AE/TMJ _ instp . html 在oracle文件夹中,我发现了资源适配器ojms.rar,但如何使用它?也许有人

  • 多读者/Tag createTag() deleteTag() listTag() getTagInfo() 死信队列 setQueueRedrivePolicy() removeQueueRedrivePolicy() 从死信队列中接收消息 向死信队列发送消息 多读者/Tag相关 Topic Queue Priority Queue

  • 问题内容: 想要使用高级消费者API实现延迟的消费者 大意: 按键生成消息(每个消息包含创建时间戳记),以确保每个分区按生成时间对消息进行排序。 auto.commit.enable = false(将在每个消息处理之后显式提交) 消费一条消息 检查消息时间戳,并检查是否经过了足够的时间 处理消息(此操作将永不失败) 提交1个偏移 有关此实现的一些担忧: 提交每个偏移量可能会使ZK变慢 Consu

  • 我需要使用Java中的优先级队列实现Dijkstra的算法。这是我到目前为止的代码: 我需要填写最短路径方法并返回节点数组。但是,我不确定如何做到这一点。我知道我需要在某个时候进行优先排队,但有人可以向我解释一下如何吗?我已经制作了startNode,我知道我需要为它分配一个距离值0,其余节点的距离值为无穷大。另外,可比性从何而来?

  • 我需要一个优先级队列,它首先获得具有最高优先级值的项目。我当前正在使用队列库中的PriorityQueue类。但是,这个函数只先返回值最小的项。我尝试了一些很难看的解决方案,比如(sys.maxint-priority)作为优先级,但我只是想知道是否存在更优雅的解决方案。

  • 我有2个RabbitMQ队列: = 正如您对其名称所设想的那样,队列使用死信交换功能,这意味着当消息过期时,它将被重新调用到我的。 我试图实现的是在每次处理失败并将消息推送到DLX队列时增加消息的。 问题是,即使消息过期,当它不在队列的底部(头部)时,它也不会请求我的。因此,如果DLX队列中有到期时间为7天的消息,并且我们将到期时间为5秒的新消息加入队列,则该消息将仅在7天5秒后请求到。... 我