我有一个队列传播形式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,但我仍然无法将消息出列。
答案 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;
/