我使用JDK 1.7.71运行Tomcat 8.0.20,当我们用一个1000 Websocket 连接加载系统时,线程数在32-33之间(没有什么比它更多)从应用程序加载时开始)。但是,当测试运行停止时,套接字关闭,线程增加到最大值(200)。这些线程在那里挂了大约60秒然后就死了。
服务器代码如下:打开websocket时,会实例化webSockHandler的对象。有一个路由类(静态),它将任何传入消息发送给4个管理器之一。 4个管理器都是Runnable,它们卡在LinkedBlockingQueue的take()中。这些管理器很常见,并且没有专门为处理客户端请求而创建的线程。因此,无论我们是0还是100,我们应该是4个应用程序线程。
但是,在NIO套接字闭包和创建的线程上有一个明确的1:1链接。使用运行在Win 7,8或Ubuntu上的Tomcat可以重现该问题 - 因此它可能不是操作系统。为什么在客户端套接字关闭时会创建这些线程?我们能避免吗?或优化它?
其余的tomcat配置是默认配置(NIO连接器除外。即2个线程,最大线程数= 200等)
**编辑:粘贴一些代码段** 我想知道我应该发送什么代码代码..我会尽我所能。
*经理是:
public void run() {
while ( keepRunning ) {
Message msgToProcess;
try {
msgToProcess = myQueue.take(); //myQueue is of type LinkedBlockingQueue
processMessage(msgToProcess);
} <<Exception blocks>>
}
}
Websock处理程序是:
@ServerEndpoint(value="location")
public class Websock {
Websock(){
log.info("Consutructor:Creating a new instance for every socket ");
}
public void onClose(Session session, CloseReason closeReason) {
ConnectionManager.removeClient(this);
}
}