HttpAsyncHttpClient收到HTTP-304时如何终止异步GET请求?
如何终止HttpAsyncHttpClient的请求(针对HTTP 304场景)
我之前处理过类似的需求,你尝试的futureResponse.cancel(true)和futureResponse.finalize()之所以没效果,是因为当AsyncCompletionHandler的回调触发后,请求的控制权已经转移到Handler的状态逻辑里了。直接操作Future无法中断已经进入回调流程的请求处理。
正确的解决方案
你需要在onStatusReceived方法中,根据状态码判断是否要终止请求,直接返回State.CANCEL即可。这个状态会通知HttpAsyncHttpClient立即停止后续的响应体读取,并释放相关资源。
修改后的代码示例
Future<Response> futureResponse = httpClient.prepareGet("some-url") .addHeader("some", "header") .execute(new AsyncCompletionHandler<Response>() { @Override public State onStatusReceived(HttpResponseStatus status) throws Exception { logger.info("status {}", status); // 当收到HTTP 304时,终止请求 if (status.getStatusCode() == HttpStatus.SC_NOT_MODIFIED) { // 也可以直接写304 logger.info("Got 304 response, cancelling request to save resources"); return State.CANCEL; } return super.onStatusReceived(status); } @Override public Response onCompleted(Response response) throws Exception { logger.info("Request completed successfully"); return response; } @Override public void onThrowable(Throwable t) { logger.error("Request encountered an error", t); } });
额外说明
State是AsyncCompletionHandler中的枚举类型,除了CANCEL还有CONTINUE(继续处理)和FAILURE(标记请求失败)- 用这种方式终止请求是最可靠的,因为它是在请求处理的生命周期内主动触发终止,能确保连接和内存资源被及时释放
- 如果你有其他需要终止请求的场景(比如自定义业务条件、超时判断),也可以用同样的逻辑返回
State.CANCEL
内容的提问来源于stack exchange,提问作者Pijotrek
相关产品推荐
相关产品推荐

