【问题标题】:Dequeue Non_Persistent message from AQ Queue using JMS使用 JMS 从 AQ 队列中取出 Non_Persistent 消息
【发布时间】:2020-05-27 16:11:42
【问题描述】:

我想从 Oracle AQ 队列中取出非持久(=缓冲)JMS 消息。

如果我设置的话,在 PL/SQL 中一切都很好并且可以工作

L_DequeueOptions.VISIBILITY    := DBMS_AQ.IMMEDIATE;
L_DequeueOptions.DELIVERY_MODE := DBMS_AQ.BUFFERED;

在 dequeuer 上。

enqueuer 选项相应地设置为 IMMEDIATE 和 BUFFERED。

尽管如此,在 Java 代码中,我尝试使用带有 javax.jms.QueueReceiver 的 JMS 接收消息

QueueReceiver receiver = session.createReceiver(queue, "JMSDeliveryMode = 'PERSISTENT' or JMSDeliveryMode = 'NON_PERSISTENT'");
// and later on:
Message m = receiver.receive(conf.dequeueTimeout);

我没有在出队/接收方的事务中运行。 如何在 JMS 中设置“可见性”? 任何想法为什么我没有收到消息?

我错过了什么?

Payload 是 sys.AQ$_JMS_TEXT_MESSAGE,未压缩等。

顺便说一句:出队应用程序正在使用持久消息...

更新:如果我使用 MessageSelector,该代码也不适用于持久消息。如果没有消息选择器和持久消息,它就可以工作!

【问题讨论】:

    标签: java oracle queue jms buffered


    【解决方案1】:

    我们发现了如何管理它。 直接在 JMS 上没有办法使非持久消息出队。我怀疑非持久出队是标准的一部分。

    唯一的方法是将 QueueReceiver 转换为 oracle.jms.AQjmsConsumer 然后调用

          receiver.bufferReceive(timeout);
    

    而不是

          receiver.receive(timeout);
    

    只有在 Oracle JMS 代码中进行调试才能将我们带到这个解决方案。 网络上关于这方面的文档很差。

    顺便说一句:消息选择器将我引向了完全错误的方向。

    【讨论】:

    • 关于非持久性消息出队的标准是什么?
    • 我说的是 JMS 标准,它定义了一个 JMSDeliveryMode.NON_PERSISTENT(我认为也应该可以使用 JMS 将非持久消息出列)。
    • 根据 JMS 规范,出列/使用非持久消息当然是可能的。如果 OracleAQ 不支持此功能,则它不完全符合 JMS 规范。
    【解决方案2】:

    JMS 规范 (JSR 914) 定义了两种交付模式:PERSISTENTNON_PERSISTENT。对于 Oracle,这些模式是 PERSISTENTBUFFERED

    但是,Oracles JMS 实现似乎默认只接收PERSISTENT

    消息选择器本身由 Oracle 实现检查,但似乎对传递模式没有影响。

    如您所说,QueueReceiver 可以转换为 AQjmsConsumer 以处理缓冲消息。

    AQjmsConsumer consumer = (AQjmsConsumer)session.createReceiver(queue);
    consumer.bufferReceive(dequeueTimeout);
    

    发送缓冲消息时也是如此。这里必须将QueueSender 强制转换为AQjmsProducer 以获取手头缓冲消息的方法:

    AQjmsProducer producer = (AQjmsProducer)session.createProducer(queue);
    producer.bufferSend(queue, msg, priority, timeToLive);
    

    【讨论】:

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