所以这是一个奇怪的。我有一个基本的Spring 4 websockets应用程序在Glassfish 4上运行,使用RabbitMQ作为消息代理,没什么特别的。我正在测试websocket客户端的持久性(一个在java中,一个在javascript中使用stomp.js和socks.js),并注意到当我从glassfish取消部署应用程序时,两个客户端都会认为websocket仍在运行。为了好玩,我从每个客户端向服务器添加了一个重复的ping请求,以模仿心跳。当应用程序启动时,ping请求运行良好,我从服务器获得pong响应,但是当我从glassfish取消部署应用程序(模拟断开连接)时,我仍然可以从服务器获得成功的ping和pong消息。在我看来,当取消部署应用程序时,它应该向所有连接的客户端发送断开连接消息,这将调用其重新连接逻辑以命中集群中的另一个服务器。有没有人见过类似的行为?谢谢你的帮助!
答案 0 :(得分:0)
我想我已经找到了这个。我无法在STOMP连接上设置心跳配置。一旦我设置了这些值,我开始看到服务器将心跳发送到客户端,当我在Web套接字应用程序上拔出插头时,心跳停止了,正如他们应该的那样。在那之后很容易实现一些重新连接逻辑,基于我最后一次收到心跳,如果它太旧了。下面是一些用于配置STOMP客户端的示例代码,我从春季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);
}