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