Как узнать, закрыл ли клиент соединение - PullRequest
6 голосов
/ 23 ноября 2010

Я играл с новыми асинхронными функциями Servlet 3.0 с Tomcat 7.0.4. Я нашел это Приложение чата , которое позволяет клиентам зависать на GET-запросе для получения обновлений сообщения. Это работает очень хорошо, когда дело доходит до получения сообщений.

Проблема возникает, когда клиент отключен, то есть пользователь закрывает браузер. Кажется, что сервер не поднимает IOException, даже если клиент отключен. Поток сообщений (см. Исходный код по ссылке выше) успешно записывает все сохраненные выходные потоки AsyncContext.

Это ошибка Tomcat? или я что-то здесь упускаю? Если это не ошибка, то как мне определить, закрыл ли клиент соединение?

1 Ответ

1 голос
/ 23 ноября 2010

Код в строке 44 - 47 об этом позаботится,

} catch(IOException ex) {
    System.out.println(ex);
    queue.remove(ac);
}

И здесь, в 75 - 83, используя тайм-аут,

req.addAsyncListener(new AsyncListener() {
    public void onComplete(AsyncEvent event) throws IOException {
        queue.remove(ac);
    }

    public void onTimeout(AsyncEvent event) throws IOException {
        queue.remove(ac);
    }
});

РЕДАКТИРОВАТЬ: После получения немного больше понимания.

  1. Tomcat 7.0.4 все еще находится в бета-версии.Таким образом, вы можете ожидать такого поведения
  2. Я очень старался, но не могу найти метод setAsyncTimeout() в документе, ни здесь , ни здесь .Итак, я думаю, что они полностью удалили его в окончательной версии по неизвестной действительной причине
  3. В примере говорится: « почему я должен использовать инфраструктуру вместо ожидания Servlet 3.0 Async API »,Это означает, что написано перед последней вещью

Итак, что я могу сказать, после объединения всех этих фактов, что вы пытаетесь работать с вещью, которая в некотором смысле сломана.Это также может быть причиной разных и странных результатов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...