0

com.sun.messaging.jmq.jmsserver.service.HAMonitorService クラスには、Java Thread を開始する HATimerThread が含まれており、Java Thread がそれを実行します ( HATimerThread は Runnable です)。

このスレッドはデーモン スレッドではありません。

run のコードは次のとおりです。

 public void run() {
            while (true) {
                long time = System.currentTimeMillis();
                synchronized(this) {
                    if (time < nexttime) {
                        try {
                            this.wait(nexttime  - time);
                        } catch (InterruptedException ex) {}
                        continue;
                     } else {
                         child.run();
                     }
                 }
                 if (repeatItr == 0) break;
                 time = System.currentTimeMillis();
                 long tmpnext = nexttime + repeatItr;
                 if (time >= tmpnext) { 
                     nexttime = time;
                 } else {
                     nexttime = tmpnext;
                 }
            }      

        }

このスレッドが終了できる唯一の方法は、repeatItr == 0 の場合です。ただし、コンストラクター (0 以外になるように呼び出す HAMonitorService のコンストラクターによって呼び出される) で設定されると、何も変更されないようです。これは、ループが終了しないことを意味します。つまり、スレッドが停止することはありません。また、デーモン スレッドではないため、VM がシャットダウンすることはありません。

これはバグですか、それとも私が考えていなかったそれを止める他のメカニズムがありますか? 現時点では、組み込みクラスターブローカーを実行しているプロセスは、残りのプロセスが正常にシャットダウンしても、このため終了しません...

これは4.5.2と5.1を使用してみました。

HATimerThread によって作成されたスレッドをデーモンに設定して 5.1 のソースを再構築したところ、すべて正常に動作するようになりました。

4

1 に答える 1

0

オラクルのエイミー・カンによると

「HAMonitorService の HATimerThread は、ブローカが終了していないか、util ブローカが System.exit() を呼び出して自身を終了または再起動しない限り、実行されることになっています。ただし、デーモン スレッドにすることはできます。」

OpenMq ユーザー フォーラムを参照してください

于 2014-11-19T09:17:00.220 に答える