我们的J2EE Web应用程序中有守护程序线程,它们将从入站种子文件提供给应用程序的数据 . 多个业务活动有多个守护进程,它们将及时为应用程序的数据库提供数据 . 假设一个线程用于材料定义(Item)创建,一个线程用于在Data Base中创建Material(Lot) .

抽象的Thread run方法代码如下

1.  while(true)
2.  {
3.    
4.    if(business flag unchecked)  break;
5.
6.    Thread.sleep(xxx) for certain time.
7.
8.    Perform the Business Job 
9.
10.   Insert 'I completed Job at xxx for business xx' to DB.
11.
12.  }

最近,在我们的一个客户中,我们观察到在特定时间之后,对于任何业务活动Thread,没有上述代码的步骤10的数据库插入 . 仅在重新启动WEBLOGIC服务器后观察到的步骤10插入 .

通过数据库日志验证确保上述代码中步骤4中引用的业务标志未被选中,这是退出守护程序的唯一条件 .

Weblogic服务器日志在此时注册了多条消息,如下所示,未调用线程且未记录其他异常

####<Jun 14, 2017 9:15:09 PM CDT> <Info> <WorkManager> <ua00629p> <SomeApp> <ExecuteThread: '2' for queue: 'weblogic.socket.Muxer'> <<WLS Kernel>> <> <> 

<1497492909991> <BEA-002939> <The maximum thread constraint weblogic.unicast.DispatchWorkManager has been reached 5 times for the last 200 seconds.>

是因为任何内存或进程争用JVM将终止/关闭守护程序线程或其他任何预期的?

有没有办法代码发送邮件,警告用户WEBLOGIC或JVM杀死/关闭守护程序线程,以便可以立即完成变通办法?