我想从Oracle AQ队列中取出非持久性(=缓冲的)JMS消息。
在PL / SQL中,一切正常,如果我设置的话,可以工作
L_DequeueOptions.VISIBILITY := DBMS_AQ.IMMEDIATE;
L_DequeueOptions.DELIVERY_MODE := DBMS_AQ.BUFFERED;
出队。
enqueuer选项被相应地设置为IMMEDIATE和BUFFERED。
尽管如此,在Java代码中,我还是尝试通过JMS和javax.jms.QueueReceiver一起使用来接收消息,>
QueueReceiver receiver = session.createReceiver(queue, "JMSDeliveryMode = 'PERSISTENT' or JMSDeliveryMode = 'NON_PERSISTENT'"); // and later on: Message m = receiver.receive(conf.dequeueTimeout);
我不在出队方/接收方的事务中运行。如何在JMS中设置“可见性”?为什么我没有收到消息的任何想法?
我想念什么?
有效负载为sys.AQ $ _JMS_TEXT_MESSAGE,未压缩等。
btw:出队应用程序正在使用持久消息运行...
更新:
如果我使用MessageSelector,该代码也不适用于持久消息。如果没有消息选择器和持久消息,它将起作用!我想从Oracle AQ队列中取出非持久性(=缓冲的)JMS消息。如果我设置L_DequeueOptions.VISIBILITY:= DBMS_AQ.IMMEDIATE;在PL / SQL中一切正常,并且可以正常工作。 ...
我们发现了如何进行管理。直接在JMS上,无法使非持久消息出队。我怀疑非持久出队是否是标准的一部分。
JMS规范(JSR 914)定义了两种交付模式:PERSISTENT
和NON_PERSISTENT
。对于Oracle,这些模式为PERSISTENT
和BUFFERED
。