Blockhound 未检测到简单的阻塞代码

Mon*_*nta 4 spring-webflux blockhound

使用 spring boot webflux,我正在尝试使用 Blockhound 进行非常简单的阻塞调用,但它似乎没有检测到它。

        <dependency>
            <groupId>io.projectreactor.tools</groupId>
            <artifactId>blockhound</artifactId>
            <version>1.0.6.RELEASE</version>
        </dependency>
Run Code Online (Sandbox Code Playgroud)

在主要方法中:

public static void main(String[] args) {
    BlockHound.install();
    SpringApplication.run(MyApplication.class, args);
  }
Run Code Online (Sandbox Code Playgroud)

我的阻塞端点:

    @GetMapping("/block")
    public Mono<String> block() {
        String a = Mono.just("block").block();
        return Mono.just(a);
    }
Run Code Online (Sandbox Code Playgroud)

任何想法?

编辑:

当我在端点中使用 UUID.randomUUID() 时,出现与 randomUUID() 使用的阻塞 FileInputStream#readBytes 相关的错误。所以我想我的安装是好的

Mic*_*rry 8

这里没有什么问题,你只是遇到了一个极端的情况。

Mono.just()是一种相当特殊的类型,Mono其方式不止一种(这就是为什么我对它在如此多简单的“入门”风格示例中的使用感到失望,但我离题了)-因为你实际上只是将一个值包装在一个虚拟发布者中,即使您调用 block 方法,它也永远不需要阻塞才能返回其值。方法名称可能暗示您正在阻塞,但您可以从源代码中简单地验证它只返回一个 value。因此不会发生阻塞操作,因此 Blockhound 没有什么可抱怨的。

如果您要在组合中添加另一个运算符,即使它没有实际效果:

String a = Mono.just("block").cache().block();

...然后你会看到 Blockhound 开始抱怨,因为你不再直接使用 的特殊情况MonoJust

Blockhound 正在做它应该做的事情,问题是你(非常可以理解)期望某些东西会被阻止,但事实并非如此。