【发布时间】:2021-06-29 06:15:16
【问题描述】:
我们正在将我们的代码从 RestTemplate 移动到 WebClient 以实现非阻塞调用,我们几乎完成了。但是,在将我们的代码移动到 WebClient 之后,我们面临的问题是当客户端调用我们的 API 时,我们以空白响应进行响应。虽然,我们的后端客户端有响应。
我试过了,ofResponseProcessor,但这似乎没有执行(因为方法内部的日志没有被打印)
这是我的代码:
Mono<ClientResponse> clientResponse = WebClient.builder()
.clientConnector(new ReactorClientHttpConnector(clientOptions))
.filter(processResponse(httpResponse)) <-- passing HttpServletResponse
.baseUrl("https://xxxxx.xxxx/")
.build()
.get()
.uri("/getresult")
.exchange();
logger.info("======Thread Completed=====");
现在,我们的 processResponse 会将响应从 ClientResponse 写入 HttpServletResponse
public ExchangeFilterFunction processResponse(HttpServletResponse resp) {
return ExchangeFilterFunction.ofResponseProcessor(clientResponse -> {
logger.info("======Writing Response=====");
writeResponse(clientResponse,resp); //writing response to servletresponse
return Mono.just(clientResponse);
});
}
我在控制台日志中没有看到 ======Writing Response=====。
我也尝试在ClientResponse 上使用subscribe,但在我输入Thread.sleep 之前,我仍然收到空白回复。
谁能帮助我了解我在这里缺少什么?
====更新=====
private void writeResponse(ClientResponse clientResponse, HttpServletResponse resp){
clientResponse.bodyToMono(String.class)
.subscribe(consumer -> {
....
....
IOUtils.copy(new ByteArrayInputStream(consumer.getBytes()),resp.getOutputStream());
}
...
);
}
【问题讨论】:
-
您能否将代码发布在您使用 clientResponse 的位置以及如何返回响应?
-
@JArgente 添加了我正在写入 servletresponse 的部分代码
标签: java servlets reactive-programming spring-webflux spring-webclient