1

我们正在使用Websphere Work Manager(CommonJ) 在我们的应用程序中生成线程。我们正在使用默认值WorkManager并通过JNDI在我们的应用程序中访问它。

try {  
    Context ctx = new InitialContext();  
    wm = (WorkManager) ctx.lookup("java:comp/env/wm/App_WORKMANAGER");  
    wm.schedule(this);  
    //threadScheduler = new Thread(this);  
    //threadScheduler.start();  
} catch (Exception e) {  
    // catch the exception  
} 

我们继续运行侦听不同队列的线程以检查任何消息并对其进行处理。我们确实收到如下挂起消息,知道可以从管理控制台配置它以停止显示警告/错误或增加挂起检测时间。

[1/30/13 6:50:38:708 EST] 00000032 ThreadMonitor W WSVR0605W:线程“WorkManager.DefaultWorkManager:2”(00000022) 已活动 708969 毫秒,可能已挂起。服务器中总共有 1 个线程可能被挂起。

现在,如果我们从管理控制台停止应用程序,这些线程不会停止,我们会不断收到 Hung 消息。对于另一个部署,另一组线程加起来就是 Hung 线程数。我在某处读到,如果我们声明线程,Daemon那么它们就会停止()。那么我们Daemon可以如下声明线程还是我们也需要覆盖该release()方法?我们release()现在是空的。

public boolean isDaemon() {                        
  return true;  
}  

public void release() {  
 //TODO  
}

一旦应用程序停止,我们如何才能停止应用程序线程的运行?这是一个使用Struts 1.x.

我在这里读了两个解释:

  1. 即使在 Websphere 中停止了应用程序后,线程仍会继续运行(因为我没有使用 spring,只是声明Deamon就可以了吗?如果我们停止 JVM 本身,这将起作用,只是从控制台停止应用程序无济于事,对吗?)

  2. Websphere 是否尊重守护线程?(Sarel Botha 建议的方法是唯一的解决方案,或者我们从控制台进行了一些设置来完成工作。)

谢谢。

4

1 回答 1

0

是的,在您的用例中,该isDaemon方法应该返回true,并且您需要以release这样一种方式实现该方法,即它停止在对象的run方法中执行的代码Work。如果您这样做,那么挂起的线程警告将消失,当应用程序停止时,WebSphere 将调用release所有正在运行的对象。Work

于 2013-02-08T20:45:11.980 回答