我有一个Web应用程序,它在内部启动服务器套接字并侦听传入的消息。当我取消部署我的Web应用程序时,它也会停止tomcat服务器。
我能否知道有哪些设置需要更新才能处理这种情况?
我的环境:目前我使用的是安装时的默认设置。我的tomcat版本是“Apache Tomcat / 7.0.10”,JVM版本是“1.6.0_24-b24”,我使用的OS是“Linux”
服务器日志显示错误:
严重:Web应用程序[/ sampleApp]似乎已经启动了一个名为[Thread-4]的线程,但未能阻止它。这很可能会造成内存泄漏。
答案 0 :(得分:1)
不确定为什么取消部署应用程序会导致Tomcat本身停止,也许在日志中查看更多内容并提高日志级别将会有所帮助。但是你在Tomcat中创建服务器套接字的方法很奇怪(我怀疑为什么它首先需要在webapp中实现自己的套接字协议而不是HTTP)。
Servlet API明确建议在处理HTTP servlet请求时不要创建新线程。 Tomcat跟踪其与每个webapp关联的线程池和资源,当您创建新线程时,您实际上已经离开其模型,这就是创建SEVERE:
错误的原因。当您的ServerSocket
获得新的客户端连接并初始化新的Thread
来处理它时,很可能会发生这种情况。
如果您需要实现任何多线程,它应该在ContextListener
中,在加载webapp时会初始化。然后,如果servlet需要将任何工作卸载到其他线程,则servlet与之通信。永远不要直接从Servlet
创建新线程。您也可以将ServerSocket
放在ContextListener
中,但是您可能想重新考虑为什么要处理自己的协议和HTTP(在您的情况下使用Jetty更有意义吗?)< / p>