hutool 作为http 客户端工具调用的一点点总结

发布于:2025-08-14 ⋅ 阅读:(11) ⋅ 点赞:(0)

场景一:客户端timeout 的时间给的很短


  

 //100毫秒
private static final int HTTP_TIMEOUT_MS = 1 * 100; 
response = HttpUtil.createPost(patrolresultconfirmUrl)
    .body(JSONObject.toJSONString(search))
    .header("Authorization", token)
    .timeout(HTTP_TIMEOUT_MS)
    .executeAsync();


          Caused by: java.net.SocketTimeoutException: Read timed out

场景二:服务端 返回的时间调的很长


 客户端的时间timeout 给 30s
 服务设置40s 的模拟延迟
  Read timed out
  
场景问题
    1.我们是调用方,我们不能奢望或者要求服务其它提供方的程序及时响应
        我们可以通过调大客户端的timeout


举个例子: 联调环境日志


[ERROR | 2025-08-07 11:02:09.058 | pms-schedule-2] [c.q.i.t.l.s.i.CommonPushServiceImpl:251] 推送巡视设备可靠性指标报错:cn.hutool.http.HttpException: Read timed out,Read timed out 
[INFO | 2025-08-07 11:02:09.058 | pms-schedule-2] [c.q.i.t.j.PushPatrolDeviceReliability2XNJob:80] 结束巡视设备可靠性指标当前时间: 2025-08-07 11:02:09 
[ERROR | 2025-08-07 11:02:09.062 | pms-schedule-1] [c.q.i.t.l.s.i.CommonPushServiceImpl:216] 推送巡视设备在离线数据报错:cn.hutool.http.HttpException: Read timed out,Read timed out 
[INFO | 2025-08-07 11:02:09.062 | pms-schedule-1] [c.q.i.t.j.PushPatrolDeviceStatus2XNJob:48] 结束执行推送巡视设备状态定时任务当前时间: 2025-08-07 11:02:09 

客户端调用服务端接口进行推送,服务端没有及时返回,对面调试打debug 就会报出这样的错,和场景二 吻合
    


hutool 工具的异步问题怎么判断

    response = HttpUtil.createPost(patrolresultconfirmUrl)
    .body(JSONObject.toJSONString(search))
    .header("Authorization", token)
    .timeout(HTTP_TIMEOUT_MS)
    .executeAsync();


executeAsync 这个是不是异步 循环调用两次,如果第二次需要等第一次调用后才调用就说明是 同步的

要等第一次执行完 才调用第二次,说明上面的实现是同步,怎么改就变成异步呢如下:

CompletableFuture.supplyAsync(() -> HttpUtil.createPost(patrolresultconfirmUrl)
        .body(JSONObject.toJSONString(search))
        .header("Authorization", token)
        .timeout(HTTP_TIMEOUT_MS)
        .executeAsync());

List<CompletableFuture<com.alibaba.fastjson.JSONObject>> futures = new ArrayList<>();
for (int i = 0; i < 2; i++) {
    CompletableFuture<com.alibaba.fastjson.JSONObject> future = CompletableFuture.supplyAsync(() -> stationSampleService.collectionSample(stationSampleReq));
    futures.add(future);
}
CompletableFuture<Void> allFutures = CompletableFuture.allOf(futures.toArray(new CompletableFuture[0]));

//收集所有结果
CompletableFuture<List<com.alibaba.fastjson.JSONObject>> allResultsFuture =  allFutures.thenApply(v -> {
    List<com.alibaba.fastjson.JSONObject> results = new ArrayList<>();
    for (CompletableFuture<com.alibaba.fastjson.JSONObject> future : futures) {
        results.add(future.join());
    }
    return results;
});

总结

超不超时 和单笔的req  resp 有关系,和调用多少次数没有关系


网站公告

今日签到

点亮在社区的每一天
去签到