【问题标题】:Dequeue is not working when consumer is dead消费者死亡时出队不起作用
【发布时间】:2015-04-01 19:13:43
【问题描述】:

我有一个从 source_queue 到 dest_queue@dblink 的队列传播形式,有效负载是 anydata。订阅者被添加到 source_queue:

sys.aq$_agent('CONSUMER', dest_queue@dblink, null);

现在我想知道是否有办法在 source_queue 使用 dbms_aq.dequeue,如果入队的消息无法传播,因为到 dest_queue@dblink 的网络会中断一段时间。我尝试了以下方法:

m_queueOpts.consumer_name := 'CONSUMER';
m_queueOpts.dequeue_mode := dbms_aq.remove;

DBMS_aq.dequeue (
queue_name => 'source_queue',
dequeue_options => m_queueOpts,
message_properties => m_msgProps,
payload => m_data,
msgid => m_msgId
);

但我收到错误:ORA-25247: CONSUMER 不是指定消息的收件人

这是正确的,因为收件人在 dest_queue@dblink。

但如果消息无法传播,我想将消息从 source_queue 中出列或删除。是否有其他方法可以从 source_queue 中出列?

我试过了,在 queueOptions 也设置了一个 message_id,但我仍然无法将消息出队。

【问题讨论】:

    标签: oracle queue


    【解决方案1】:

    终于在一些 Oracle FAQ 上找到答案:https://docs.oracle.com/cd/B10501_01/appdev.920/a96587/qfaqs.htm

    他们建议删除订阅者以删除该目标(消费者、地址)的所有消息。有趣的是,对于 AQ,您可能没有订阅者,但要删除过时的消息,您可以添加一个,然后将其删除,如下所示:

    declare
        p$src_queue    varchar2(30) := 'source_queue';
        p$consumer    varchar2(30) := 'CONSUMER';
        p$dst_queue    varchar2(100) := 'dest_queue@dblink';
    --
        subscriber SYS.AQ$_AGENT;
    begin
        subscriber := SYS.AQ$_AGENT(p$consumer, p$dst_queue, NULL);
    
        DBMS_AQADM.ADD_SUBSCRIBER(
            queue_name => p$src_queue,
            subscriber => subscriber
        );
    
        subscriber := SYS.AQ$_AGENT(p$consumer, p$dst_queue, NULL);
    
        DBMS_AQADM.REMOVE_SUBSCRIBER(
            queue_name => p$src_queue,
            subscriber => subscriber
        );
    end;
    /
    

    【讨论】:

      猜你喜欢
      • 2012-12-08
      • 1970-01-01
      • 2018-07-10
      • 2016-06-08
      • 1970-01-01
      • 1970-01-01
      • 2016-08-26
      • 2021-02-18
      • 1970-01-01
      相关资源
      最近更新 更多