2012-04-06 79 views
3

這是Oracle 11.2.0.3。爲什麼OracleAQ將隊列中的Leave Dead訂閱者?

我們遇到了一個問題,我們在OracleAQ上使用Oracle的JMS。這工作正常,除了我們開始注意隊列充滿了1000年,然後數百萬消息隨着時間的推移。其中一些處於PROCESSED狀態,但大多數都是READY。我們將這種行爲追溯到「殭屍」或死亡用戶的主題。當Java進程終止並且沒有機會註銷自己時,它將訂閱者記錄留在隊列中,並且ORacle似乎沒有檢測到它已經死亡。如此多以至於MONTHS後來,發送到我們的多用戶隊列中的新消息將乘以訂戶數量,它認爲這比實際數量高得多。 (當我們達到最大用戶數限制時,我們首先注意到了這一點)。

我們已經運行了qmon進程 - 我甚至嘗試增加最小進程數至無效。只要隊列中沒有死亡用戶,隊列清理就會非常好地發生。

任何人都看到過,並希望找到解決方案?

+0

我面臨同樣的問題,並試圖解決它。如果我找到解決方案,可以將其發佈到此處供其他用戶參考。 – gyan 2014-09-23 20:54:10

回答

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; 

這將確保您的系統保持完整-證明。