2010-12-06 3 views
1

Есть ли способ узнать, прерван ли HttpServletRequest?Обнаружение прерванных запросов в HttpServlet

Я пишу мгновенное приложение для браузера (какой-то чат): клиенты запрашивают новые события в цикле, используя AJAX-HTTP-запросы. Сервер (Tomcat) обрабатывает запросы в HttpServlet. Если для этого клиента нет новых событий, сервер задерживает ответ до тех пор, пока не поступит новое событие или не произойдет тайм-аут (30 секунд).

Теперь я хочу идентифицировать клиентов, которые больше не являются опросами. Поэтому я запускаю пин-таймер в конце запроса, который останавливается при поступлении нового запроса. Если клиент закрывает окно браузера, TCP-соединение закрывается и HTTP-запрос прерывается.

Задача: Клиент не сталкивается с таймаутом kick-timeout, потому что Servlet все еще обрабатывает запрос события - спящий и ожидающий события или таймаута.

Было бы здорово, если бы я мог как-то прослушать события прерывания связи, а затем уведомить запрос ожидания, чтобы остановить его. Но я не мог найти ничего подобного в HttpServletRequest или HttpServletResponse ...

+0

Какой API/фрейм вы используете для обработки асинхронных запросов и/или нажатия HTTP? Ваш вопрос звучит/читается очень странно, потому что обычный API Servlet обычно работает, поэтому я догадался, что для этого вы используете некоторые API/фреймворки (например, Comet, Atmosphere, Servlet 3.0 async и т. Д.), , Это либо это, либо вы делаете все совершенно неправильно. – BalusC 2010-12-06 23:24:20

+0

Я не использую рамки. Это так просто, как это: ::::::: UpdateServlet doGet-метод (1) получает updateClient от сеанса (2) получает список от updateClient (3) Печать закодированные событий. ::::::: UpdateClient GetEvents-метод (1) ожидает, если события не ждут (2) возвращает события ::::::: UpdateClient addEvent-метод (1) добавляет событие к списку (2) уведомляет ожидающие потоки Запросы обрабатываются одновременно в разных потоках. – Escudo 2010-12-06 23:45:51

ответ

0

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

1

Возможно, вы используете какое-то уведомление о потоке (Семафоры или Object.wait), чтобы удерживать и отпускать потоки сервлета. Как насчет добавления тайм-аута (~ 10 с) в ожидании, а затем как-то проверить, жив ли соединение, а затем продолжать ждать еще 10 секунд, если соединение все еще существует.

Я не знаю, существуют ли надежные способы опроса «живой» связи (например, resp.getOutputStream не выбрасывает исключение), и если да, то какой способ является лучшим (самый надежный, наименее насыщенный CPU) ,

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