gpt4 book ai didi

java - 如何处理来自 WebClient 的异步响应?

转载 作者:行者123 更新时间:2023-11-30 06:44:30 25 4
gpt4 key购买 nike

我正在尝试使用 WebClient 发出大量 Http POST 请求。我将 reactor.ipc.netty 上的日志记录级别设置为 DEBUG 以查看正在发送的请求。

这是一个功能代码:

@Service
public class HttpService implements IHttpService {

private static final String URL = "http://blablabla.com/bla";

private static final Logger logger = LogManager.getLogger();

@Autowired
WebClient webClient;

@Override
public void push(Data data) {
String body = constructString(data);
Mono<ClientResponse> res = webClient.post()
.uri(URL + getLogType(data))
.contentLength(body.length())
.contentType(MediaType.APPLICATION_JSON)
.syncBody(body)
.exchange();
ClientResponse resp = res.block();
logger.debug("Status : " + resp.statusCode());
logger.debug("Body : " + resp.bodyToMono(String.class));
}
}

它产生那种日志:

2018-05-16 15:54:14.642 DEBUG 19144 --- [ctor-http-nio-4] r.i.n.channel.ChannelOperationsHandler   : [id: 0x439f7819, L:/127.0.0.1:56556 - R:blablabla.com/127.0.0.1:8069] Writing object DefaultHttpRequest(decodeResult: success, version: HTTP/1.1)
POST /bla HTTP/1.1
user-agent: ReactorNetty/0.7.7.RELEASE
host: blablabla.com/bla:8069
accept: */*
accept-encoding: gzip
Content-Length: 494
Content-Type: application/json

但是当我删除 ClientResponse resp = res.block(); 时,我再也看不到日志了......所以我什至不知道请求是否被处理。收到回复后如何立即处理?我尝试使用 res.doOnSuccess(clientResponse -> logger.debug("Code : "+ clientResponse.statusCode())); 但没有成功...

最佳答案

因为 FluxMono 是响应式流类型,所以它们也是惰性的:在您订阅之前不会发生任何事情。有多种方法可以实现该目标,其中包括 subscribeblock

通常,Spring WebFlux 应用程序不会直接订阅并实际返回这些 react 类型;如果没有您的案例的更多背景,我真的无法说出这里的正确方法是什么。

查看 Reactor project reference documentation on Flux and Mono ,这应该可以帮助您理解其背后的核心原理。

关于java - 如何处理来自 WebClient 的异步响应?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50372966/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com