我们正在使用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 708] 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
的旧应用程序。
我在这里读了两个解释:
Thread keeps running even after application has been stopped in Websphere(因为我没有使用spring,只是声明Deamon
没问题?如果我们停止JVM本身,只是停止app从控制台无法帮助,这将有效?)
Does Websphere respect Daemon threads?(Sarel Botha建议的方法是唯一的解决方案,或者我们从控制台获得一些设置以完成工作。)
感谢。
答案 0 :(得分:0)
是的,在您的用例中,isDaemon
方法应该返回true
,您需要以这样的方式实现release
方法,以便它停止在{{1 } run
对象的方法。如果执行此操作,则挂起线程警告将消失,并且当应用程序停止时,WebSphere将在所有正在运行的Work
对象上调用release
。