Я работаю над веб-приложением на основе Spring-MVC, которое использует Cometd для чата. Для управления в режиме реального времени, какой пользователь находится в сети, мы отправляем уведомления, когда пользователь находится в сети. Итак, когда окно закрыто, уведомления не появляются, и через 30 секунд определяется, что пользователь не в сети или недоступен.
Теперь проблема возникает, когда пользователь использует несколько браузеров. Давайте просто оставим это на 2 сейчас. Итак, через 10 минут мы устанавливаем статус пользователя «Вдали от клавиатуры» (AFK). Но если пользователь находится в сети в одном браузере, то мы получаем мигающий статус, в течение нескольких секунд из-за того, что браузер находится в «Режиме ожидания», мы получаем AFK, а с активной машины мы получаем статус «Доступен».
Как мы можем решить эту проблему? Любые идеи, предложения. Я думал об использовании логического флага и пары с IP-адресом, который будет проверяться перед перезаписью уведомления, но у него есть проблема с устаревшими уведомлениями.
Это мой код для отправки уведомлений онлайн всем слушателям (друзьям пользователя).
Код :
@Listener(value = "/service/online")
public void OnlineNotifications(ServerSession remote, ServerMessage.Mutable message) {
Person sender = this.personService.getCurrentlyAuthenticatedUser();
Map<String, Object> input = message.getDataAsMap();
String onlineStatus = (String) input.get("status");
Map<String, Object> output = new HashMap<>();
output.put("status", onlineStatus);
output.put("id", sender.getId());
ServerChannel serverChannel = bayeux.createChannelIfAbsent("/online/" + sender.getId()).getReference();
serverChannel.setPersistent(true);
serverChannel.publish(serverSession, output);
}
Любые идеи приветствуются. Большое спасибо. :-)