我们使用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线程监视器 W WSVR0605W:线程"WorkManager.DefaultWorkManager : 2" (00000022) 已处于活动状态 708969 毫秒,可能挂起。 服务器中总共有 1 个线程可能挂起。
现在,如果我们从管理控制台停止应用程序,这些线程不会停止,并且我们会不断收到挂起的消息。对于另一个部署,另一组线程加起来就是挂起线程计数。我在某处读到,如果我们将线程声明为 Daemon
,那么它们就会停止()。那么我们可以将线程声明为如下所示Daemon
还是也需要覆盖release()
方法?截至目前,我们的release()
是空的。
public boolean isDaemon() {
return true;
}
public void release() {
//TODO
}
一旦应用程序停止,我们究竟如何阻止应用程序线程运行?这是一个使用Struts 1.x
的旧应用程序。
我在这里读了两个解释:
即使在 Websphere 中停止应用程序后,线程仍继续运行(因为我没有使用 spring,只是声明
Deamon
很好?如果我们停止 JVM 本身,这将起作用,只是从控制台停止应用程序无济于事,对吗?Websphere 是否尊重守护进程线程?(Sarel Botha建议的方法是唯一的解决方案,或者我们从控制台进行了一些设置来完成工作。
谢谢。
是的,在您的用例中,isDaemon
方法应返回 true
,您需要以这样一种方式实现 release
方法,即它停止在Work
对象的 run
方法中执行的代码。如果这样做,则挂起线程警告将消失,并且当应用程序停止时,WebSphere 将在所有正在运行的Work
对象上调用release
。