当前位置: 首页 > 知识库问答 >
问题:

如何在Spring中正确地关闭tcp套接字连接?

万俟浩
2023-03-14

我使用Spring Integration来管理服务器端的套接字连接。如果服务器(tomcat)关闭,我如何确保任何活动的套接字连接被正确终止?

<ip:tcp-inbound-gateway id="server"
    connection-factory="fac"
    request-channel="chan"
    error-channel="errorChan" />

有好心的听众吗?或任何可以防止服务器关闭的拦截器,例如,如果在关闭期间有任何打开的套接字,则最多60秒;但同时关闭套接字,在关机期间不接受任何连接?

共有1个答案

詹亮
2023-03-14

使用侦听器解决了这个问题,并在有任何飞行消息(actives,见下文)时,使用特定超时关闭套接字门。

@Component
public class MyListener implements ApplicationListener<ContextClosedEvent> {

    @Autowired
    private TcpInboundGateway gate;

    @Autowired
    private IntegrationMBeanExporter bean;

    @Override
    public void onApplicationEvent(ContextClosedEvent e) {
        //return
        int actives = gate.beforeShutdown();

            if (actives == 0) {
                bean.stopActiveComponents(true, 0);
            } else {
                bean.stopActiveComponents(false, timeout);
            }
    }
}
 类似资料:
  • 我目前有一个简单的即时消息程序,它利用Java的Socket和ServerSocket类。它按预期运行,但当我尝试关闭连接时,它没有使用4路握手TCP断开来关闭连接。相反,它使用RST数据包突然关闭连接。 关闭连接的方法是从客户端向服务器发送一个字符串,服务器将把它识别为关闭连接的命令。然后,我在服务器上使用方法,在客户端上使用方法。 使用这些类正确关闭TCP连接的正确方式和/或事件顺序是什么?

  • 我正在尝试使用Springboot反应式webclient进行HTTP调用。远程服务器错误导致连接关闭。 请查找以下使用Webclient进行rest调用的代码。 Webclient创建的代码: 第一次通话后,我收到以下日志: 当我在一段时间后(比如10分钟)拨打电话时,连接将变为非活动状态。我正在获取以下日志: 我发现连接没有正确返回到池。配置中是否缺少任何内容?我是否已正确关闭连接?我想这应该

  • 我正在使用HikariDataSource连接到MariaDB数据库。以下类返回一个。 这是执行select查询的方法。该类还包含一个close方法 try with块自动关闭对象,但如何关闭连接池?例如,我应该在数据库操作之后调用close方法吗 当我不调用方法时,我看不到任何关于关机启动的控制台输出。这是关闭和连接池的正确方法吗?

  • 提前致谢

  • 我正在学习Spring Core认证,在提供的学习材料中,我对这个问题有一些疑问: 关闭应用程序上下文的首选方法是什么? 我知道如果我有这样的东西: 通过在上下文对象上使用close()方法,ApplicationContext被关闭,应用程序被销毁。 但我认为这不是我必须做的最好的方式。 阅读官方留档,我发现我也可以这样做: 在JVM中注册一个关闭挂钩,因此JVM将在JVM退出之前触发Sprin