【问题标题】:Spring 4 websocket not closing on application shutdownSpring 4 websocket在应用程序关闭时未关闭
【发布时间】:2014-03-14 23:10:03
【问题描述】:
所以这是一个奇怪的问题。我有一个基本的 Spring 4 websockets 应用程序在 Glassfish 4 上运行,使用 RabbitMQ 作为消息代理,没什么特别的。我正在测试 websocket 客户端的持久性(一个在 java 中,一个在 javascript 中使用 stomp.js 和 socks.js),并注意到当我从 glassfish 取消部署应用程序时,两个客户端都会认为 websocket 仍在运行。为了好玩,我添加了一个从每个客户端到服务器的重复 ping 请求来模拟心跳。当应用程序启动时,ping 请求运行良好,我从服务器收到 pong 响应,但是当我从 glassfish 取消部署应用程序(模拟断开连接)时,我仍然从服务器获得成功的 ping 和 pong 消息。在我看来,当应用程序被取消部署时,它应该向所有连接的客户端发送断开消息,这些客户端将调用它们的重新连接逻辑来访问集群中的另一台服务器。有没有人见过类似的行为???感谢您的帮助!
【问题讨论】:
标签:
websocket
glassfish-4
spring-websocket
【解决方案1】:
我想我已经弄清楚了。我未能在 STOMP 连接上设置心跳配置。一旦我设置了这些值,我就开始看到服务器发送给客户端的心跳,当我拔下 Web 套接字应用程序的插头时,心跳停止了,这是应该的。在那之后,根据我上次收到心跳的时间以及它是否太旧,很容易实现一些重新连接逻辑。下面是一些配置 STOMP 客户端的示例代码,其中大部分是我从 spring stock-portfolio stomp client 示例中提取的。
在 StompWebSocketHandler 类中,您只需添加此代码块。您显然会将 heartbeatInterval 变量设置为您想要的任何值。
public void afterConnectionEstablished(WebSocketSession session) throws IOException {
StompHeaderAccessor headers = StompHeaderAccessor.create(StompCommand.CONNECT);
headers.setAcceptVersion("1.1,1.2");
headers.setHeartbeat(heartbeatInterval, heartbeatInterval);
Message<byte[]> message = MessageBuilder.withPayload(new byte[0]).setHeaders(headers).build();
TextMessage textMessage = new TextMessage(new String(encoder.encode(message), DEFAULT_CHARSET));
session.sendMessage(textMessage);
}