Spring Boot WebFlux环境下Blockhound无法检测简单阻塞代码问题
Blockhound 无法检测到 Mono.block() 调用的原因
你已经通过UUID.randomUUID()的检测验证了Blockhound配置生效,说明当前控制器方法的执行线程确实属于Blockhound监控的非阻塞线程范围,无需调整配置,检测失败的核心原因如下:
- 你的测试代码中调用
block()的目标是Mono.just("block"),这是一个已经处于完成状态的响应式流,block()方法执行时不需要等待任何异步操作完成,直接返回已有的结果值,全程不会调用LockSupport.park()、IO阻塞等被Blockhound标记为阻塞的底层方法,因此不会触发检测规则。
Blockhound的检测逻辑是拦截实际发生的阻塞方法调用,而非识别block()方法本身的存在。
验证方案
将测试代码替换为需要实际等待的Publisher,即可触发Blockhound的阻塞检测:
import java.time.Duration; @GetMapping("/block") public Mono<String> block() { // delay生成的Publisher需要1秒后才会完成,block()会实际进入阻塞等待逻辑 String a = Mono.delay(Duration.ofSeconds(1)) .map(i -> "block") .block(); return Mono.just(a); }
修改后调用该接口,Blockhound会正常抛出阻塞调用的异常,符合预期。
内容的提问来源于stack exchange,提问作者Monta
相关产品推荐
相关产品推荐

