Spring 4 STOMP Websockets Heartbeat

Dol*_*lan 6 java spring stomp websocket

我似乎找不到如何在Spring中使用websockets向客户端发送心跳的好资源!

我有一个使用此配置运行的基本服务器:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.enableSimpleBroker("/room");
        config.setApplicationDestinationPrefixes("/app");
    }

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/channels").withSockJS();
    }
}
Run Code Online (Sandbox Code Playgroud)

然后我使用这样的东西向订阅房间的人发送消息:

this.simpMessagingTemplate.convertAndSend("/room/" + this.roomId, message);
Run Code Online (Sandbox Code Playgroud)

这是用于与服务器通信的客户端代码:

this.connect = function (roomNameParam, connectionCallback) {
    var socket = new SockJS('http://localhost:8080/channels'),

    self.stompClient = Stomp.over(socket);
    self.stompClient.connect({}, function (frame) {
        self.stompClient.subscribe('/room/' + roomNameParam, connectionCallback);
    });
};
Run Code Online (Sandbox Code Playgroud)

我真的想实现心跳,以便客户端知道谁连接并发送一些数据以保持客户端和服务器同步.

我需要手动操作吗?

Bog*_*dan 7

Spring SockJS 配置包含发送心跳的设置。默认情况下,假设连接上没有发送其他消息,每 25 秒发送一次心跳。有关详细信息,请参阅Spring 参考


Jav*_*tar 7

只需致电:

.setTaskScheduler(heartBeatScheduler());
Run Code Online (Sandbox Code Playgroud)

对于要启用它的代理配置(也适用于简单的代理)。

@Configuration
public class WebSocketMessageBrokerConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void configureMessageBroker(MessageBrokerRegistry config) {
        config.setApplicationDestinationPrefixes("/app");
        config.enableSimpleBroker("/topic", "/queue", "/user")
                .setTaskScheduler(heartBeatScheduler());
    }

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

    @Bean
    public TaskScheduler heartBeatScheduler() {
        return new ThreadPoolTaskScheduler();
    }

}
Run Code Online (Sandbox Code Playgroud)

  • 虽然这确实使用内置的简单代理启用了心跳,但如果没有其他 HTTP 流量,我的连接仍然会关闭。 (2认同)