当消费者死亡时,出队不起作用

时间:2015-02-02 18:43:48

标签: oracle queue

我有一个队列传播形式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:消费者不是指定消息的收件人

这是正确的,因为接收者在dest_queue @dblink上。

但是如果无法传播,我想从source_queue中取消或删除该消息。还有另一种从source_queue出队的方法吗?

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

1 个答案:

答案 0 :(得分:0)

最后在一些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;
/