为什么OracleAQ会在队列中留下死亡用户?

时间:2012-04-06 01:20:22

标签: oracle jms oracle-aq subscriber orphaned-objects

这是Oracle 11.2.0.3。

我们在OracleAQ上使用Oracle的JMS时遇到了问题。这工作正常,除了我们开始注意到队列充满了1000,然后随着时间推移数百万条消息。其中一些处于PROCESSED状态,但大多数都是READY。我们将此行为追溯到“僵尸”或该主题的死亡订阅者。当Java进程终止并且没有机会取消注册自身时,它会将订阅者记录留在队列中,并且ORacle似乎没有检测到它已经死亡。因此,MONTHS之后,发送到我们的多用户队列的新消息将乘以订户数量,它认为这比实际情况要高得多。 (当我们达到最大订户限制时,我们首先注意到这一点。)

我们已经运行了qmon进程 - 我甚至尝试将最小进程数增加到无效。只要队列中没有死用户,队列清理就会很好地发生。

之前有人看过这个,希望找到解决方案吗?

1 个答案:

答案 0 :(得分:1)

好的,所以我找不到更好的解决方案:

1)使用姓名创建您的订阅者并跟踪订阅者的姓名。

2)确保您有一个关闭应用程序的挂钩以执行以下程序,该程序将取消订阅并取消注册订户。

3)如果意外关闭/崩溃,当无法完成取消订阅时,必须在代码下面执行清理任务:

DECLARE
 aqAgent SYS.AQ$_AGENT;
BEGIN
  for idx in (select consumer_name from 
    DBA_QUEUE_SUBSCRIBERS a where a.queue_name = '<Your Oracle AQ Name>') loop
    aqAgent := SYS.AQ$_AGENT(idx.consumer_name, NULL, NULL);
    DBMS_AQADM.REMOVE_SUBSCRIBER('<Your Oracle AQ Name>', aqAgent);
   end loop;
END;

这将确保您的系统保持完整。