Java 带stomp的SpringBoot websocket未正确关闭连接

Java 带stomp的SpringBoot websocket未正确关闭连接,java,spring,spring-boot,spring-websocket,stomp,Java,Spring,Spring Boot,Spring Websocket,Stomp,我有一个使用websocket和stomp作为消息传递协议的应用程序。为了创建这个应用程序,我遵循了spring官方文档。几天后,我收到一份报告,报告说运行应用程序的主机收到了普罗米修斯发出的名为fddefactionclose的警报,据我所知,这意味着某些连接未正确关闭 该应用程序在kubernetes(linux)中运行,我们使用RabbitMQ作为消息代理 我怎样才能解决这个问题?在本地运行时,我发现自从应用程序启动以来,连接的总数实际上与未关闭的文件描述符的数量相匹配 我在生产中检查了日

我有一个使用websocket和stomp作为消息传递协议的应用程序。为了创建这个应用程序,我遵循了spring官方文档。几天后,我收到一份报告,报告说运行应用程序的主机收到了普罗米修斯发出的名为fddefactionclose的警报,据我所知,这意味着某些连接未正确关闭

该应用程序在kubernetes(linux)中运行,我们使用RabbitMQ作为消息代理

我怎样才能解决这个问题?在本地运行时,我发现自从应用程序启动以来,连接的总数实际上与未关闭的文件描述符的数量相匹配

我在生产中检查了日志,代理状态正在打印:

WebSocketSession[42当前WS(42)-HttpStream(0)-HttpPoll(0),总计52766,0异常关闭

一个简单的lsof-p PID | wc-l返回的数字52752


WebSocketConfig

/。。。
@配置
公共类WebSocketCatConfig扩展了DelegatingWebSocketMessageBrokerConfiguration{
@自动连线
私有应用程序属性;
@凌驾
公共无效注册表TompendPoints(StompEndpointRegistry注册表){
registry.addEndpoint(“/wss”).setAllowedOrigins(“*”);
}
@凌驾
public void配置MessageBroker(MessageBrokerRegistry注册表){
RabbitMqProperties rabbitProperties=properties.getRabbitmq();
ReactorNettyCPClient客户端=新的ReactorNettyCPClient(tcpClient->tcpClient
.host(rabbitProperties.getHost())
.port(rabbitProperties.getPort())
.option(ChannelOption.SO_超时,3600000)
.noProxy()
.secure(SslProvider.defaultClientProvider()),新的StompReactorNettyCodec());
setApplicationDestinationPrefixes(“/app”、“/topic”、“/chat”);
registry.enablestombrokerrelay(“/topic”)
.setRelayHost(rabbitProperties.getHost())
.setRelayPort(rabbitProperties.getPort())
.setVirtualHost(rabbitProperties.getUsername())
.setSystemLogin(rabbitProperties.getUsername())
.SetSystemPassword(rabbitProperties.getPassword())
.setClientLogin(rabbitProperties.getUsername())
.SetClientPassword(rabbitProperties.getPassword()).setTcpClient(客户端);
}
}```

经过一些研究,我发现问题与包反应堆netty有关,显然在版本0.9.8中,泄漏在版本0.9.9中得到修复

//...
@Configuration
public class WebSocketChatConfig extends DelegatingWebSocketMessageBrokerConfiguration {

    @Autowired
    private ApplicationProperties properties;

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/wss").setAllowedOrigins("*");
    }

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        RabbitMqProperties rabbitProperties = properties.getRabbitmq();

        ReactorNettyTcpClient<byte[]> client = new ReactorNettyTcpClient<>(tcpClient -> tcpClient
                .host(rabbitProperties.getHost())
                .port(rabbitProperties.getPort())
                .option(ChannelOption.SO_TIMEOUT, 3600000)
                .noProxy()
                .secure(SslProvider.defaultClientProvider()), new StompReactorNettyCodec());

        registry.setApplicationDestinationPrefixes("/app", "/topic", "/chat");
        registry.enableStompBrokerRelay("/topic")
                .setRelayHost(rabbitProperties.getHost())
                .setRelayPort(rabbitProperties.getPort())
                .setVirtualHost(rabbitProperties.getUsername())
                .setSystemLogin(rabbitProperties.getUsername())
                .setSystemPasscode(rabbitProperties.getPassword())
                .setClientLogin(rabbitProperties.getUsername())
                .setClientPasscode(rabbitProperties.getPassword()).setTcpClient(client);
    }

}```