Java 程序不干净地存在。创造僵尸

标签 java windows-7 spring-integration tcp

场景

我有一个 java 应用程序(使用 Spring Integration 监听 TCP/IP 端口)。 我正在使用一些工作线程和一个由 java.util.concurrent.Executors 工厂创建的 ExecuterService。 主线程创建工作线程并在循环中等待,如下所示

while(!shutdownRequested)
{
    try {
         Thread.sleep(2000);
         } catch (InterruptedException e) {
           e.printStackTrace();
         }
}

我有一个关闭 Hook ,它会停止执行程序服务并在超时时强制关闭。

问题
该程序在我的机器 (Windows 7) 上没有成功终止。它留下一个线程监听 tcp 端口,此后进程变得无法访问。 我无法从任务管理器中终止此进程并收到“访问被拒绝”错误。

有趣的是,这个问题只发生在我的机器上,不会影响任何其他 Windows 7 机器。在所有其他机器上,控制台的 Control-C 总是成功停止程序。

我过去曾遇到过这个问题(使用相同的应用程序),在我重新格式化并重新安装 Windows 后问题神奇地消失了。 (我知道这有点过分了!!)

该应用程序完美运行了好几个月,直到不幸的是我最近因为其他原因不得不重新格式化我的电脑。重新格式化后问题又回来了。

这非常令人沮丧,因为每次我需要重新启动此应用程序时我都必须重新启动 Windows,因为它无法绑定(bind)到 TCP 端口,因为僵尸进程在该端口上闪烁。

知道我的设置有什么问题吗?

最佳答案

您可能需要 close() socket 。 这将导致套接字抛出 SocketException,从而停止阻塞。

关于Java 程序不干净地存在。创造僵尸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13659941/

相关文章:

spring-boot - 如何在 Spring Integration 的 react 流中使用事务?

java - Android MVP 依赖规则

java - 使用 gluon 移动插件构建 JavaFX And​​roid 应用程序失败

java - JAVA 中的 DOM 解析器查询

visual-studio-2008 - Visual Studio 2008 和 Windows 7 最近的文件

spring-integration - 使用 Java DSL 的流程记录请求、响应和总时间

java - 在 Java 中赋值?

wcf - 在 IIS7 和 Windows 7 中配置 WCF

c++ - DeviceIoControl 调用崩溃

rabbitmq - 无法使用 MessageProperties 将 header 设置为 AMQP 消息