在JBOSS EAP 6.4上调用EJB服务时,此错误经常发生,并且总是发生在EJBClientContext registerEJBReceiver/unregisterEJBReceiver上。这些方法都将一个runnable提交到一个名为ejbClientContextTasksExecutorService的CachedThreadPool(Executors.newCachedThreadPool)中。
可以在类EJBClientContext中查看代码:
https://raw.githubusercontent.com/wildfly/jboss-ejb-client/87aef56ab787f57a9508c6e2b0f876066ae464fe/src/main/java/org/jboss/ejb/client/EJBClientContext.java
我有一个JBOSS客户端应用程序,它是一个批处理程序,创建固定数量的20个线程(带有Executors.newCachedThreadPool),但是每个任务都调用一个EJB远程对象,该对象使用EJBClientContext的CachedThreadPool。
在EJBClientContext的CachedThreadPool中运行的线程数未知,但我检查了一些似乎足够多的操作系统限制:
nproc>100000
ulimit-u>100000
kernel.pid_最大值>100000
/proc/sys/kernel/threads最大值>150000
在整个批处理期间,我一直使用以下命令监视服务器上的线程消耗:
ps -A -o pid,nlwp,cmd
每个进程的线程数仍然很低(每进程最多100个线程,同时处理2个或3个进程)。
最佳答案
尝试分析您的应用程序。如果您使用的是Oracle JDK,则可以创建flight recording并使用JMC对其进行分析。然后你会有一个很好的分析随着时间的推移,直到错误发生。
也发现了一个很好的article。试着将分析结果与之进行比较。