You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Spring Boot应用中集成BlockHound检测阻塞调用

How to Add BlockHound to a Spring Boot Application to Detect Blocking Calls

Got it, I totally get why you're looking for a Spring Boot-specific example—the official quick start is a bit generic. Let me walk you through exactly how to set this up step by step.

1. Add BlockHound Dependency

First, you need to include the BlockHound library in your project. Here's how to do it for both Maven and Gradle:

Maven (pom.xml)

Add this dependency to your <dependencies> section:

<dependency>
    <groupId>io.projectreactor.tools</groupId>
    <artifactId>blockhound</artifactId>
    <version>1.0.8.RELEASE</version>
    <scope>test</scope>
</dependency>

Gradle (build.gradle)

Add this to your dependencies block:

testImplementation 'io.projectreactor.tools:blockhound:1.0.8.RELEASE'

2. Initialize BlockHound in Your Spring Boot App

There are two common ways to initialize BlockHound, depending on whether you want it running during tests or runtime:

Create a base test class that sets up BlockHound once for all your tests. This keeps your test code clean:

import org.junit.jupiter.api.BeforeAll;
import io.projectreactor.tools.blockhound.BlockHound;

public abstract class BaseSpringBootTest {

    @BeforeAll
    static void setupBlockHound() {
        BlockHound.install();
    }
}

Then have all your test classes extend this base class—BlockHound will automatically scan for blocking calls during test execution.

Option 2: Initialize for Runtime (Local Development Debugging)

If you want BlockHound to monitor blocking calls while your app runs locally, add the initialization to your main application class, right before starting the app:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import io.projectreactor.tools.blockhound.BlockHound;

@SpringBootApplication
public class YourSpringBootApp {

    public static void main(String[] args) {
        // Initialize BlockHound first
        BlockHound.install();
        SpringApplication.run(YourSpringBootApp.class, args);
    }
}

3. Verify BlockHound is Working

Let's create a quick test to confirm BlockHound detects blocking calls. For example, a test that uses Thread.sleep() (a classic blocking operation) inside a reactive stream:

import org.junit.jupiter.api.Test;
import reactor.core.publisher.Mono;

public class BlockingCallDetectionTest extends BaseSpringBootTest {

    @Test
    void shouldDetectBlockingCall() {
        Mono.fromRunnable(() -> {
            try {
                Thread.sleep(100); // This is a blocking call
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }).block(); // Using block() here for test validation
    }
}

When you run this test, BlockHound will throw an error like this:

Blocking call! java.lang.Thread.sleep

4. Optional: Customize BlockHound (Allow Legitimate Blocking Calls)

Sometimes you have unavoidable blocking calls (like legacy code). You can configure BlockHound to ignore specific methods:

BlockHound.install(builder -> {
    builder.allowBlockingCallsInside("com.yourcompany.yourpackage.LegacyService", "safeBlockingMethod");
});

This setup works smoothly with both Spring WebFlux (reactive) and traditional servlet-based Spring Boot apps—though it's most valuable for reactive applications where blocking calls can kill performance.

内容的提问来源于stack exchange,提问作者vkm

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 07:37:15