我有一个网络应用程序,它在内部启动一个服务器套接字并监听传入的消息。当我取消部署我的 Web 应用程序时,它也会停止 tomcat 服务器。
我可以知道是否需要更新任何设置来处理这种情况?
我的环境:目前我正在使用来自安装的默认设置。我的tomcat版本是“Apache Tomcat/7.0.10”,JVM版本是“1.6.0_24-b24”,我使用的操作系统是“Linux”
服务器日志显示错误:
严重:Web 应用程序 [/sampleApp] 似乎启动了一个名为 [Thread-4] 的线程,但未能停止它。这很可能会造成内存泄漏。
最佳答案
不确定为什么取消部署应用程序会导致 Tomcat 本身停止,也许更多地查看日志并提高日志级别会有所帮助。但是,您在 Tomcat 中创建服务器套接字的方法非常奇怪(我质疑如果它实现自己的套接字协议(protocol)而不是 HTTP,为什么首先需要在 webapp 中)。
Servlet API 明确建议不要在处理 HTTP servlet 请求时创建新线程。 Tomcat 跟踪它的线程池和与每个 webapp 关联的资源,当你创建一个新的线程时,你实际上是在脱离它的模型,这就是创建那个 SEVERE:
的原因。错误。这很可能发生在您的 ServerSocket
时。获得一个新的客户端连接并初始化一个新的 Thread
来处理它。
如果你需要实现任何多线程,它应该在 ContextListener
中,它在加载 webapp 时被初始化。如果 servlet 需要将任何工作卸载到其他线程,则它们会与它通信。切勿直接从 Servlet
创建新线程.你也可以把 ServerSocket
在ContextListener
,但是您可能想重新考虑为什么要处理自己的协议(protocol)和 HTTP(也许使用 Jetty 在您的情况下更有意义?)
关于java - Tomcat 服务停止部署,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13498984/