相关疑难解决方法(0)

Spring-Boot WebClient block() 方法返回错误 java.lang.IllegalStateException

我正在尝试使用 Spring WebFlux WebClient获取值(字符串) (使用 SpringBoot 版本 2.4.5)

\n
@GetMapping("/test")\npublic Mono<String> getData(){\n    WebClient webClient = WebClient.create("http://localhost:9999");\n    Mono<String> stringMono = webClient.get()\n            .uri("/some/thing")\n            .retrieve()\n            .bodyToMono(String.class);\n    stringMono.subscribe( System.out::println);\n    System.out.println("Value : " + stringMono.block()); // this doesn\'t work,  expecting to return ResponseBody as "Hello World" ,\n    return stringMono;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

但低于错误

\n
2021-05-11 20:02:15.521 ERROR 55613 --- [ctor-http-nio-2] a.w.r.e.AbstractErrorWebExceptionHandler : [19114471-1]  500 Server Error for HTTP GET "/test"\njava.lang.IllegalStateException: block()/blockFirst()/blockLast() are blocking, which is not supported in thread reactor-http-nio-2\n    at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:83) ~[reactor-core-3.4.3.jar:3.4.3]\n    Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: \nError …
Run Code Online (Sandbox Code Playgroud)

spring-boot spring-webflux spring-webclient

4
推荐指数
1
解决办法
1万
查看次数

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
查看次数