send keep live на длинном асинхронном запросе в весеннем сервере - PullRequest
0 голосов
/ 31 октября 2019

У меня есть контроллер весной, который получает запрос POST, который обрабатывается как асинхронный (с использованием DeferredResult объекта в качестве возвращаемого значения).

Ответом на этот запрос является запись байтов в поток HTTP напрямую(HttpServletResponse.getWriter().print()), и когда он завершает запись, он устанавливает результат для объекта DeferredResult для закрытия соединения.

Я пишу свой ответ в потоковых чанках. У меня проблема с обработкой этого запроса, потому что клиент закрывает соединение, если я не пишу ему в течение 1 минуты. (Я могу записать несколько фрагментов, а затем прекратить запись на 1 минуту - поэтому соединение будет закрыто в середине моей процедуры).

Я хочу контролировать процедуру закрытия соединения - я хочу отправить keep aliveкогда я не записываю данные в поток, чтобы соединение не закрывалось, пока я не решил закрыть его со стороны сервера.

Я не выяснил, как мне получить контроль надсоединение с контроллера на сервере. Пожалуйста помогите. Спасибо.

1 Ответ

0 голосов
/ 31 октября 2019

Не существует такой вещи, как «поддерживать активность» во время текущего запроса или ответа в HTTP, которая может помочь при простоях при получении запроса или ответа.

Поддержание активности HTTP - это только поддержание соединения TCP открытым после ответа, чтобы обрабатывать больше запросов на том же соединении. Протокол TCP keep alive используется для обнаружения потери соединения без отключения TCP, а также может использоваться для предотвращения тайм-аута простоя в фильтрах пакетов с отслеживанием состояния (используемых в межсетевых экранах или маршрутизаторах NAT) между клиентом и сервером. Это не предотвращает тайм-ауты простоя на уровне приложения, хотя и не передает никаких данных, видимых на уровне приложения.

Обратите внимание, что способ использования HTTP противоречит тому, как изначально был разработан HTTP. Он был разработан для клиента, отправляющего полный запрос, и сервера, отправляющего полный ответ немедленно, а не для того, чтобы сервер отправлял некоторые части ответа, некоторое время бездействовал, а затем отправлял еще несколько. Правильный способ реализовать такое поведение - использовать WebSockets. С помощью WebSockets и клиент, и сервер могут отправлять новые сообщения в любое время (т. Е. Нет схемы запрос-ответ), а также поддерживают сообщения поддержки активности. Если WebSockets не вариант, вы можете вместо этого реализовать клиент опроса, который регулярно запрашивает новые данные с сервера с новым запросом.

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