【问题标题】:Using ODP.NET OracleAQQueue.Listen on a Multiconsumer Queue在多消费者队列上使用 ODP.NET OracleAQQueue.Listen
【发布时间】:2016-07-27 16:58:10
【问题描述】:

我有一个连接到 Oracle AQ 多消费者队列的客户端应用程序。我想使用 OracleAQQueue.Listen 来监听队列中的新消息。 API docs 表明 Listen 方法可以用于多消费者队列。我的监听队列代码如下所示。

string consumerName = "APPINST1";            
using (OracleConnection con = new OracleConnection(connectionString))
{
    con.Open();

    OracleAQQueue queue = new OracleAQQueue("MY_Q");
    queue.MessageType = OracleAQMessageType.Udt;
    queue.UdtTypeName = "MY_Q_MSG";
    queue.DequeueOptions.DeliveryMode = OracleAQMessageDeliveryMode.Persistent;
    queue.Connection = con;

    Console.WriteLine("Listening for messages...");
    queue.Listen(new string[] { consumerName });
}

我遇到的问题是在我调用 queue.Listen() 的代码行中,我得到了 Oracle 异常:

ORA-25295: Subscriber is not allowed to dequeue buffered messages 

在谷歌上搜索有关此特定错误的建议并没有太大帮助。我已经多次将我的订阅者删除并重新添加到队列中,但均无济于事。我的猜测是在调用 Listen 之前我没有正确设置某些属性,但我无法找出问题所在。

有什么想法吗?

【问题讨论】:

    标签: oracle odp.net oracle-aq


    【解决方案1】:

    我在 Chapter 10 - Oracle Streams AQ Operations Using PL/SQL 的 Streams Advanced Queuing User's Guide 中遇到了以下注释:

    Note: Listening to multiconsumer queues is not supported in the Java API.
    

    虽然我在任何地方都找不到明确说明,但我猜同样的规则也适用于 ODP.NET API。

    【讨论】:

      【解决方案2】:

      您必须将可见性属性设置为 IMMEDIATE 才能使用缓冲消息传递。

      【讨论】:

        猜你喜欢
        • 2016-09-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多