首页 > 解决方案 > Spring reactive Mono:blockOptional 与 spring actuator 冲突

问题描述

我正在将 json 数组响应映射到反应堆世界,但遇到如下问题:

    val responses = configurationClient.getData() // return json array object 
            .flatMap { it.bodyToMono(object : ParameterizedTypeReference<GeneralResponse<Array<ObjectResponse>>>() {}) 
             }
            .map { it.data }
            .blockOptional()  // exception this line 
            .orElse(emptyArray())!!

如果我添加弹簧执行器的此属性,此代码将不起作用

management.endpoints.enabled-by-default=true

没有任何异常,Netty 服务器无法启动。

但是当我更改为

management.endpoints.enabled-by-default=false

Netty 开局不错

请问这个问题有什么想法吗?

** 更新 **

当我添加一些超时值时.blockOptional(Duration.ofSeconds(60)) //60 seconds

    val responses = configurationClient.getData() // return json array object 
            .flatMap { it.bodyToMono(object : ParameterizedTypeReference<GeneralResponse<Array<ObjectResponse>>>() {}) 
             }
            .map { it.data }
            .blockOptional(Duration.ofSeconds(60))
            .get()

我很确定 Mono 和 Spring 执行器management.endpoints.enabled-by-default=true之间存在冲突

at org.springframework.beans.factory.support.ConstructorResolver.resolveAutowiredArgument(ConstructorResolver.java:886)
    at org.springframework.beans.factory.support.ConstructorResolver.createArgumentArray(ConstructorResolver.java:790)
    ... 20 common frames omitted
Caused by: java.lang.IllegalStateException: Timeout on blocking read for 60000 MILLISECONDS
    at reactor.core.publisher.BlockingOptionalMonoSubscriber.blockingGet(BlockingOptionalMonoSubscriber.java:162)
    at reactor.core.publisher.Mono.blockOptional(Mono.java:1755)

注意 configurationClient.getData()这只是一个 GET 请求返回 200-[{...}]

标签: spring-bootreactive-programmingspring-webfluxspring-actuator

解决方案


问题解决了。

根本原因:

这不是 Mono:blockOptional 或 Spring 执行器单独的错误。

此配置management.endpoints.enabled-by-default=true与现有执行器端点配置冲突

解决方案:

清理弹簧执行器配置属性以避免这种冲突然后 Mono:blockOptional 工作得很好


推荐阅读