这是Oracle 11.2.0.3。

我们在OracleAQ上使用Oracle JMS时遇到了一个问题。除我们开始注意到队列中充满了1000条消息外,随着时间的推移,数百万条消息已满,此方法工作正常。其中一些处于“已处理”状态,但大多数处于“就绪”状态。我们将此行为归结为该主题的“僵尸”或死订户。当Java进程终止并且没有机会自行注销时,它将订户记录留在队列中,并且ORacle似乎无法检测到它已死。如此之多,以至于在MONTHS之后,发送到我们的多用户队列中的新消息将乘以订户#,它认为比实际值高得多。 (当我们达到最大订户限制时,我们首先注意到了这一点。)

我们已经运行了qmon进程-我什至尝试将最小进程数提高为零。只要队列中没有死亡的订户,队列清理就会非常好地进行。

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

最佳答案

好的,所以我没有比这更好的解决方案了:

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;


这将确保您的系统保持完全安全。

关于oracle - OracleAQ为什么将死订户留在队列中?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10038104/

10-10 05:22