繁体   English   中英

应用程序线程保持运行

[英]Application thread keeps running

我们正在使用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消息。 对于另一部署,另一组线程合计为挂起线程数。 我在某处读到,如果我们将线程声明为Daemon则它们将被停止()。 那么我们将线程声明为以下Daemon很好吗,还是需要重写release()方法呢? 到目前为止,我们的release()为空。

public boolean isDaemon() {                        
  return true;  
}  

public void release() {  
 //TODO  
}

一旦停止应用程序,我们如何确切地阻止应用程序线程运行? 这是使用Struts 1.x的旧应用程序。

我在这里阅读了两个解释:

  1. 即使在Websphere中停止了应用程序之后,线程仍保持运行 (因为我不使用spring,只是声明Deamon很好吗?如果我们停止JVM本身,只是从控制台停止应用程序就行了,这是行得通的,对吗?)

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

谢谢。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM