java - Tomcat 服务停止部署

标签 java multithreading sockets tomcat

我有一个网络应用程序,它在内部启动一个服务器套接字并监听传入的消息。当我取消部署我的 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 创建新线程.你也可以把 ServerSocketContextListener ,但是您可能想重新考虑为什么要处理自己的协议(protocol)和 HTTP(也许使用 Jetty 在您的情况下更有意义?)

关于java - Tomcat 服务停止部署,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13498984/

相关文章:

c++ - C++11 的线程安全性以及通过临时对象的引用传递

java - 如何确保我的程序在正常关闭或崩溃时关闭套接字?

c# - C# (async ctp/.net 4.5) 中的异步递归是否安全?

java - 如何在Java中搜索字符串中的每个字符

java - Android volley future 请求超时

java - 在编码之前动态隐藏一些字段(java 到 json)

c++ - 使用条件变量在 Linux 中实现 Windows 事件?

c++ - 为什么我的客户端会杀死我的服务器?

java - 在父类(super class)构造函数中指定哪个子类

java - 编写自定义 Chef Recipe 来安装和运行自制应用程序