客户端重新连接时WebSocket消息丢失

客户端重新连接时WebSocket消息丢失,websocket,activemq,stomp,spring-websocket,Websocket,Activemq,Stomp,Spring Websocket,我在前端使用ActiveMQ,在后端使用ActiveMQ向客户端发送推送通知。客户端首先使用以下代码订阅主题: function stompConnect() { console.log('STOMP: Attempting connection'); // recreate the stompClient to use a new WebSocket var socket = new SockJS('/websocket'); var stompClient =

我在前端使用ActiveMQ,在后端使用ActiveMQ向客户端发送推送通知。客户端首先使用以下代码订阅主题:

function stompConnect() {
    console.log('STOMP: Attempting connection');
    // recreate the stompClient to use a new WebSocket
    var socket = new SockJS('/websocket');
    var stompClient = Stomp.over(socket);

    stompClient.connect({}, function(frame) {
        stompClient.subscribe('/topic/table-updates', function(notification){
            showNotification(JSON.parse(notification.body));
        });
    }, function (error) {
        console.log('STOMP: ' + error);
        setTimeout(stompConnect, 10000);
        console.log('STOMP: Reconnecting in 10 seconds');
    });
}

stompConnect();
有时底层websocket连接丢失,客户端需要重新连接并订阅主题(超时10秒)。这导致在客户端重新连接时,来自服务器的一些消息丢失。有没有办法防止这种情况

我在后端使用弹簧网套。以下是配置:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Value("${stomp.port}")
    private Integer stompPort;

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

    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry
            .enableStompBrokerRelay("/topic/")
            .setRelayPort(stompPort);
    }

    @Bean(initMethod = "start", destroyMethod = "stop")
    public BrokerService brokerService() throws Exception {
        final BrokerService broker = BrokerFactory.createBroker(
            String.format("broker:(vm://localhost,stomp://localhost:%d)?persistent=false", stompPort));

        broker.addShutdownHook(new SpringContextHook());
        return broker;
    }
} 
当然可以

你需要改变一些事情

这里都有描述:

但我会给你一个简短的概述

对消息结构的一些重要更改:

  • 为websocket使用者订阅“/queue/”而不是主题,并设置队列浏览
  • 使用从制作人处发送消息
以下是一个基本示例:

  • 用户打开网页并订阅/queue/重要内容,队列浏览序号为-1(仅限新消息)
  • 对于每个到达的消息,将其序列号存储在某个位置。同时,用户可以从消息中的重要数据中获得乐趣
  • 用户的websocket连接断开
  • 检测并重新连接,确保使用Jeff的示例作为参考,web套接字只能打开一次
  • 重新订阅并在from seq头中传入存储的序列号
  • Apollo broker将发送丢失的消息
  • 请记住,代理可能会收到一些消息,您需要遵循页面上的建议,并且:

    • 将具有过期时间的消息发送到队列,以便在达到过期时间后自动删除这些消息
    • 定期运行正常的使用者应用程序,该应用程序可以将 队列和删除消息被视为不再需要

    检查是否可以将STOMP客户端库配置为创建Hello上定义的持久订户,是否找到解决方案?我也有类似的问题。虽然消息是从服务器推送的,但有时客户端会错过它。我正在使用队列而不是topicI,我也有类似的问题,仍在寻找解决方案