You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:27:42