2013-03-07 2 views
2

Используя синтетическую нагрузку как с клиентом, так и с сервером, работающим на localhost, я проверил через tcpdump и netstat, что клиент отправляет на сервер пакет FIN, но соединение застряло в CLOSE_WAIT, в то время как запрос остается в очереди на server (я использую Jetty с пулом потоков в очереди). Когда рабочий поток доступен в пуле, запрос обрабатывается как обычно сервлетом, даже если соединение уже закрыто клиентом.Проверьте, не установлено ли соединение HttpServletRequest?

Я хочу, чтобы проверить, было ли соединение уже закрыто, чтобы сервер не обрабатывал запросы, которые уже были на стороне клиента (я знаю, что могу настроить http-заголовок на клиенте с меткой времени и проверьте это на сервере, пока часы синхронизированы, но я бы предпочел проверить соединение, чтобы узнать, все еще ли он открыт).

Является ли то, что я пытаюсь сделать возможным, и если да, то как?

ответ

2

Я так не считаю. FIN не означает, что соединение нарушено. Совершенно верно, что A посылает B некоторые данные, за которыми следует FIN; то A продолжает читать из B. Ничего плохого в этом полузакрытом состоянии.

Ваш лучший выбор - улучшить пропускную способность сервера, чтобы клиентам не приходилось так долго ждать.

+0

Итак, вы предлагаете, чтобы я хотел, чтобы клиент перешел на тайм-аут, и вы хотите пропустить работу на сервере после истечения времени ожидания клиента, лучшим решением является установка отметки времени в заголовке (за исключением улучшения реакции сервера, конечно)? – jonderry

+0

Да, если вы будете контролировать поведение клиента, это будет хорошим решением. – irreputable

+0

Однако, поскольку часы могут быть не синхронизированы, лучше, чтобы сервер метрировал запрос, когда он был получен. Я не знаком с причалом и не знаю, как это сделать. – irreputable

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