2010-11-23 2 views
5

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

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

Является ли это ошибкой Tomcat? или я что-то упустил? Если это не ошибка, то как я должен определить, закрыл ли клиент соединение?

ответ

1

код там в строке 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); 
    } 
}); 

EDIT: После получения немного больше понимания.

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

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

+0

Ну, это позаботится об этом, если операция записи вызовет исключение IOException, которого не происходит. Таким образом, вы можете закрыть браузер и никогда не получить это исключение. И таймаут в этом примере 10 минут. Это довольно много, если вы позволите сказать сотням клиентов. – SS3 2010-11-23 07:40:11

Смежные вопросы