Недавно я занялся проектом, который использует COMET для выполнения совместной работы и работы с простым чатом. Ребята, которые изначально написали эту вещь, создали несколько классов поверх STOMP и Oribited для обработки всех реальных разговоров, обмена сообщениями и регистрации.
Проблема в том, что если пользователь закрывает окно или переходит на другую страницу или прерывает соединение по какой-либо другой причине, всем остальным пользователям требуется некоторое время, чтобы увидеть, что он вышел из системы. Другие пользователи должны подождать, пока отметка времени последнего эхо-запроса вышедшего пользователя превысит определенную продолжительность, прежде чем он обнаружит, что пользователь больше не подключен к системе.
Решение, которое я могу придумать, требует отправки уведомления в событии onuload, которое оставил пользователь, чтобы оно уведомляло всех других пользователей, не дожидаясь истечения времени ожидания. Проблема в том, что, поскольку onunload немедленно прервет соединение, прежде чем оно будет завершено. Насколько я понимаю, это проблема и с AJAX.
Теперь я также прочитал, что синхронный запрос при выгрузке будет задерживать закрытие окна / навигацию до завершения запроса.
Итак, мои вопросы таковы: кто-нибудь знает способ временно сделать кометный запрос синхронным в выбранных случаях, чтобы у него было время завершить запрос до его завершения? Или есть другой способ решить эту проблему, о которой я не думаю? Спасибо за вашу помощь.
О, кроме того, onbeforeunload не будет работать, потому что, если он отправит запрос и пользователь выберет «Нет, я хочу остаться на этой странице», он уже уведомит других пользователей, что он вышел из чата.
tl; dr: Нужен способ успешного запуска запроса COMET в событии Unload. Мы используем STOMP и Orbited для COMET.