3

これは Oracle 11.2.0.3 です。

OracleAQ を介して Oracle の JMS を使用する場合に問題が発生します。これは問題なく動作しますが、キューが数千のメッセージでいっぱいになり、時間の経過とともに数百万のメッセージでいっぱいになることに気付き始めました。これらのいくつかは PROCESSED 状態にありますが、ほとんどは READY です。この動作は、「ゾンビ」またはトピックの購読者の死亡にまで遡ることができました。Java プロセスが終了し、それ自体を登録解除する機会が得られない場合、サブスクライバー レコードがキューに残され、Oracle はプロセスが停止していることを検出しないようです。数か月後、マルチサブスクライバー キューに送信された新しいメッセージはサブスクライバーの数で乗算され、実際よりもはるかに多いと見なされます。(これは、登録者数の上限に達したときに初めて気付きました。)

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 に答える