Проверьте подключение клиента к серверу RESTful Spring без изменения ответа приложения.JAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Проверьте подключение клиента к серверу RESTful Spring без изменения ответа приложения.

Сообщение Anonymous »

У меня есть служба REST в Spring и API, который блокирует некоторые действия перед запуском тяжелой задачи и последующим возвратом ее клиенту. Я хочу убедиться, что клиент все еще подключен к сокету запроса, прежде чем приступить к тяжелой задаче, чтобы не тратить вычислительную мощность на того, кто уже отключился. Я не могу использовать WebSocket и знаю, что единственный способ проверить, что TCP-соединение все еще открыто, — это записать в него некоторые данные. Однако мой HTTP-ответ соответствует строгому формату, и запись в него чего-либо может испортить этот формат.
Я нашел старую ветку tomcat от 2009 года, в которой говорится, что мы можем добиться этого, сбрасывая пустые байты (

Код: Выделить всё

new byte[0]
) в response.getOutputStream, но когда я попробовал это сделать, я не получил никакого исключения, даже когда клиент закрыл соединение. Я проследил исходный код tomcat и обнаружил, что они пропускают сбросы, длина которых не превышает 0, поэтому я не думаю, что это решение работает.
Я думаю, что я потребуется что-то на уровне TCP, например PING или Keep-Alive, но я не смог найти ресурсы о том, как это сделать для моего варианта использования. Интеграция Spring с TCP выглядит так, будто она устанавливает новые соединения с настроенным сервером вместо использования сокета входящих запросов. Конфигурации поддержания активности Tomcat, похоже, предназначены для тайм-аута запросов, а не для проверки того, отключился ли пользователь (я не хочу прерывать какое-либо соединение с моим сервером).
В идеале, Я хотел бы периодически проверять подключение, чтобы иметь возможность быстрее разблокировать и освободить ресурсы или остановить тяжелую задачу, если клиент отключится после запуска задачи. Но если это слишком сложно, то можно просто проверить подключение один раз прямо перед тем, как приступить к тяжелой задаче.
Редактировать:
@talex отметил в комментарии, что невозможно добиться предложенного мною типа TCP Heartbeat без изменения протокола. Итак, теперь я думаю о менее надежной проверке, при которой мы проверяем, получили ли мы пакет FIN от клиента, а не обрабатываем случаи, когда клиент внезапно отключается. Можно ли это реализовать в весенней архитектуре? Я нашел связанный вопрос SO, но их решение заключается в обнаружении EOF, что всегда верно в моем случае, потому что Spring проанализировал бы поток для меня к тому времени, когда я доберусь до своего контроллера.

Подробнее здесь: https://stackoverflow.com/questions/793 ... -applicati
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»