应用程序线程继续运行

时间:2013-02-04 08:53:50

标签: java websphere

我们正在使用Websphere Work Manager(CommonJ)在我们的应用程序中生成线程。我们正在使用默认WorkManagerJNDI在我们的应用程序中访问它。

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的旧应用程序。

我在这里读了两个解释:

  1. Thread keeps running even after application has been stopped in Websphere(因为我没有使用spring,只是声明Deamon没问题?如果我们停止JVM本身,只是停止app从控制台无法帮助,这将有效?)

  2. Does Websphere respect Daemon threads?(Sarel Botha建议的方法是唯一的解决方案,或者我们从控制台获得一些设置以完成工作。)

  3. 感谢。

1 个答案:

答案 0 :(得分:0)

是的,在您的用例中,isDaemon方法应该返回true,您需要以这样的方式实现release方法,以便它停止在{{1 } run对象的方法。如果执行此操作,则挂起线程警告将消失,并且当应用程序停止时,WebSphere将在所有正在运行的Work对象上调用release