block()/blockFirst()/blockLast() 在 exchange() 之后调用 bodyToMono 时出现阻塞错误
我正在尝试使用Webflux将生成的文件流式传输到另一个位置,但是,如果文件的生成遇到错误,api将返回成功,但是在生成文件而不是文件本身时,DTO会详细说明错误。这是使用一个非常古老且设计不佳的api,因此请原谅使用post和api设计。
来自 api 调用 (exchange()) 的响应是 ClientResponse。从这里,我可以使用bodyToMono转换为ByteArrayResource,它可以流式传输到文件,或者,如果在创建文件时出错,那么我也可以使用bodyToMono转换为DTO。但是,我似乎不能做任何事情,也不能根据客户端响应标头的内容。
在运行时,我得到一个非法状态异常由
block()/blockFirst()/blockLast() 是阻塞的,这在线程 reactor-http-client-epoll-12 中不受支持
我认为我的问题是我不能在同一个函数链中调用block()两次。
我的代码片段是这样的:
webClient.post()
.uri(uriBuilder -> uriBuilder.path("/file/")
.queryParams(params).build())
.exchange()
.doOnSuccess(cr -> {
if (MediaType.APPLICATION_JSON_UTF8.equals(cr.headers().contentType().get())) {
NoPayloadResponseDto dto = cr.bodyToMono(NoPayloadResponseDto.class).block();
createErrorFile(dto);
}
else {
ByteArrayResource bAr = cr.bodyToMono(ByteArrayResource.class).block();
createSpreadsheet(bAr);
}
}
)
.block();
基本上,我想根据标头中定义的MediaType以不同的方式处理客户端响应。
这可能吗?