这是Oracle 11.2.0.3。
我们在OracleAQ上使用Oracle的JMS时遇到了问题。这工作正常,除了我们开始注意到队列充满了1000,然后随着时间推移数百万条消息。其中一些处于PROCESSED状态,但大多数都是READY。我们将此行为追溯到“僵尸”或该主题的死亡订阅者。当Java进程终止并且没有机会取消注册自身时,它会将订阅者记录留在队列中,并且ORacle似乎没有检测到它已经死亡。因此,MONTHS之后,发送到我们的多用户队列的新消息将乘以订户数量,它认为这比实际情况要高得多。 (当我们达到最大订户限制时,我们首先注意到这一点。)
我们已经运行了qmon进程 - 我甚至尝试将最小进程数增加到无效。只要队列中没有死用户,队列清理就会很好地发生。
之前有人看过这个,希望找到解决方案吗?
答案 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;
这将确保您的系统保持完整。