WebClient是Spring框架5.0引入的基于响应式编程模型的HTTP客户端。‌ 它提供了一种简便的方式来处理HTTP请求和响应,‌支持异步和非阻塞式的请求和响应处理。‌WebClient基于Reactor,‌这是一种响应式流编程框架,‌提供了Publisher-Subscriber模型的API,‌允许异步、‌非阻塞的处理流式数据。‌通过构建链式的HTTP请求和响应处理函数,‌WebClient允许开发者构建异步和非阻塞式的HTTP客户端。‌它支持多种HTTP方法、‌请求和响应处理、‌错误处理、‌HTTP认证以及与RESTful服务的交互。‌

手动释放代码

private Mono<Void> handleResponse(ClientResponse clientResponse, ServerHttpResponse response){
  HttpHeaders httpHeaders = clientResponse.headers().asHttpHeaders();
  HttpStatus httpStatus = clientResponse.statusCode();
  response.setStatusCode(httpStatus);
  response.getHeaders().addAll(httpHeaders);
  return clientResponse.bodyToMono(DataBuffer.class).flatMap(result -> WebUtil.writeResponse(result,response));
}

Webutil

public static Mono<Void> writeResponse(DataBuffer buffer, ServerHttpResponse response){
  return response.writeWith(Mono.just(buffer)).doFinally(signalType -> DataBufferUtils.release(buffer));
}

webclient使用bodyToMono构建对象时,在后续方法中手动使用DataBufferUtils.release方法对缓存的对象进行了释放,导致Reactor释放这个对象时异常。

WebUtil修改

public static Mono<Void> writeResponse(DataBuffer buffer, ServerHttpResponse response){
  return response.writeWith(Mono.just(buffer));
}