相关疑难解决方法(0)

block()/ blockFirst()/ blockLast()在调用bodyToMono后阻塞错误AFTER exchange()

我正在尝试使用Webflux将生成的文件流式传输到另一个位置,但是,如果文件的生成遇到错误,则api会返回成功,但是DTO会在生成文件而不是文件本身时详细说明错误.这是使用一个非常古老和设计不佳的api所以请原谅使用post和api设计.

来自api调用(exchange())的响应是ClientResponse.从这里我可以使用bodyToMono转换为ByteArrayResource,它可以流式传输到文件,或者,如果创建文件时出错,那么我也可以使用bodyToMono转换为DTO.但是,我似乎无法做任何事情或取决于ClientResponse标题的内容.

在运行时我得到一个IllegalStateException引起的

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();
Run Code Online (Sandbox Code Playgroud)

基本上我想根据标头中定义的MediaType以不同方式处理ClientResponse.

这可能吗?

java reactive-programming project-reactor spring-webflux

3
推荐指数
3
解决办法
8684
查看次数