3

这是 Oracle 11.2.0.3。

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

我们已经运行了 qmon 进程——我什至尝试增加最小进程数以使其无效。只要队列中没有死订阅者,队列清理就会非常顺利。

任何人都看到过这个,并希望找到一个解决方案?

4

1 回答 1

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;

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

于 2014-09-24T14:01:16.080 回答