Обнаружение автономных и онлайн-клиентов в реальном времени в среде Spring через Websocket - PullRequest
1 голос
/ 19 сентября 2019

Я создаю приложение, похожее на slack. У меня много клиентов, работающих как в Интернете, так и на мобильных устройствах. Они подключаются к веб-сокету через Stomp. Я хочу определить, какой пользователь в сети и офлайн в режиме реального времени. Websocketсервер работает на spring framework.Spring принимает запросы, как показано ниже. Я устанавливаю значения heartbeat incoming и outgoing как 20000 ms.

    @Configuration
    @EnableWebSocketMessageBroker
    public class WebSocketConfig  implements WebSocketMessageBrokerConfigurer {

        private List<StompPrincipal> onlineUsers = new ArrayList<>();

        @Override
        public void registerStompEndpoints(StompEndpointRegistry registry) {

            registry.addEndpoint("/ws")
                    .setAllowedOrigins("*")
                    .setHandshakeHandler(new CustomHandshakeHandler())
                    .withSockJS();
        }

        @Override
        public void configureMessageBroker(MessageBrokerRegistry config) {
            config.setApplicationDestinationPrefixes("/ws");
            config.enableSimpleBroker("/ws")
                 .setTaskScheduler(new DefaultManagedTaskScheduler())
                 .setHeartbeatValue(new long[]{20000,20000});
        }
}

Чтобы определить, какие пользовательские запросы к Websocket, я добавил обработчик рукопожатия какниже.

class CustomHandshakeHandler extends DefaultHandshakeHandler {
         @Override
        protected Principal determineUser(ServerHttpRequest request, WebSocketHandler wsHandler,
                                          Map<String, Object> attributes) {

       String username=(String)attributes.get("name");
       StompPrincipal user = new StompPrincipal(username)

             onlineUsers.add(user);
            return user;
        }
    }

    class StompPrincipal implements Principal {
        String name;

        StompPrincipal(String name) {
            this.name = name;
        }

        @Override
        public String getName() {
            return name;
        }
    }

Как видно из кода выше, пользователь добавляет onlineUser после того, как он запросит websocket server.Но проблема в том, что я не могу определить, находится ли пользователь в автономном режиме после нахождения в сети. Можете ли вы предложить мне определить это.Кроме того, определение онлайн и офлайн пользователей таким способом является лучшей практикой?если нет, жду ваших предложений. Большое спасибо.

1 Ответ

1 голос
/ 20 сентября 2019

После дополнительного поиска я нашел решение, описанное здесь . Я реализовал ApplicationListener<SessionDisconnectEvent> и переопределил метод ниже.

@Override
     public void onApplicationEvent(SessionDisconnectEvent event) {

     }

Таким образом, я могу определить, какой пользователь отключен от подключения к веб-сокету.Я все еще жду ваших советов.

...