HTTP 1.1 не имеет никакого механизма, чтобы попросить сервер отменить запрос. Можно получить поток ввода / вывода / ошибки из HttpURLConnection
и закрыть их. Это может привести к IOException
на стороне клиента, что позволит клиенту выполнить очистку после отмены. «Постоянное» или «keepAlive» TCP-соединение HTTP 1.1 будет продолжать существовать для будущих запросов. Поэтому сервер не узнает об этих событиях на стороне клиента, пока не попытается выполнить запись и произойдет сбой.
HTTP 2 предоставляет отдельный фрейм с именем RST_STREAM
, чтобы закрыть поток или отменить запущенный запрос. Поскольку Java 9 HttpClient
позволяет нам делать асинхронный HTTP-запрос, возвращающий CompletableFuture
, теперь существует более элегантный способ отменить текущий запрос, используя метод cancel()
CompletableFuture
.
Мои вопросы:
- Действительно ли выпуски Java 9+ отправляют
RST_STREAM
на сервер при вызове cancel()
?
- Предоставляет ли JEE8 какой-либо механизм для прерывания бизнес-логики, выполняемой для HTTP-запроса при получении
RST_STREAM
? Или какой-нибудь план будущих выпусков?