2013-02-04 254 views
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 
} 

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

[13年1月30日6:50:38:708 EST] 00000032 ThreadMonitorW¯¯WSVR0605W:线程 “WorkManager.DefaultWorkManager:2”(00000022)已活跃708969毫秒,并且可被挂起。总共有1个线程可以挂在服务器上。

现在,如果我们停止从管理控制台的应用程序,这些线程不会停止,我们不断收到洪消息。对于另一个部署,另一组线程合计为洪线程数。 我在某处读到,如果我们将线程声明为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(因为我没有使用弹簧,刚刚宣布Deamon是很好,如果我们停止JVM本身这会工作,只是从控制台停止应用程序不会?帮助,对不对?)

  2. Does Websphere respect Daemon threads?(由Sarel博塔建议的方法是唯一的解决方案或我们从控制台一些设置来完成这项工作。)

谢谢。

+0

您将不得不为应用程序创建一个启动/关闭侦听器,并停止线程 –

+0

感谢Aviram,我将尝试使用servlet上下文侦听器。虽然它会有点繁琐,因为应用程序没有共同的服务创建theads ..将不得不挖掘到每个线程.. :) – pranav

回答

0

是的,在您的使用情况isDaemon方法应该返回true,你需要实现release方法,它停在Work对象的run方法执行的代码的方式。如果您这样做,则挂起的线程警告消失,并且WebSphere将在应用程序停止时在所有正在运行的Work对象上调用release

+0

谢谢安德烈亚斯..我已经写了一个contex监听器,并把我所有线程引用为null。仍然需要检查它有多远。是的,我已经宣布这个Threds为Daemon,并且看起来像是压制了悬挂线程的警告。在run方法中,我们一直在寻找队列,所以我不能在释放时做太多的事情。所以保持我的赌注把refrences为空。 – pranav

+0

安德烈亚斯把参考作为null不会工作..实施释放()的想法做了伎俩..感谢帮助.. – pranav

相关问题