Я создаю приложение, похожее на 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
.Но проблема в том, что я не могу определить, находится ли пользователь в автономном режиме после нахождения в сети. Можете ли вы предложить мне определить это.Кроме того, определение онлайн и офлайн пользователей таким способом является лучшей практикой?если нет, жду ваших предложений. Большое спасибо.