嵌入式OpennMS HA代理由于非守护程序线程而未关闭

时间:2014-11-18 16:38:26

标签: openmq

com.sun.messaging.jmq.jmsserver.service.HAMonitorService类 包含HATimerThread,它启动一个java Thread然后运行它( HATimerThread是一个Runnable)。

此主题不是deamon主题。

运行代码如下;

 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.但是一次 在构造函数中设置(由HAMonitorService&#39; s调用) 调用它的构造函数使得它不是0)似乎没有 更改。这意味着循环永远不会退出,这意味着反过来 线程永远不会停止,因为它不是守护程序线程,而是VM 永远不会关闭。

这是一个错误还是有一些其他机制阻止了我 还没有想过?目前正在运行我的嵌入式进程 集群代理永远不会退出,即使其余部分也是如此 彻底关闭......

尝试使用4.5.2和5.1。

我重建了5.1的源代码,将HATimerThread创建的线程设置为deamon,现在一切正常。

1 个答案:

答案 0 :(得分:0)

根据甲骨文的Amy Kang的说法

“HAMonitorService中的HATimerThread应该在代理未终止或者util代理调用System.exit()以终止或重新启动时运行。但是它可以成为守护程序线程。”

请参阅OpenMq users forum