首页 > 解决方案 > 设置数据时如何避免 Blockhound 捕获阻塞调用?

问题描述

在我的集成测试中,我使用 BlockHound 来捕获任何阻塞调用。为了设置数据,我正在进行阻塞调用,因为我希望在运行每个测试时将数据保留在数据库中。运行集成测试时,Blockhound 在设置方法处抛出错误:reactor.blockhound.BlockingOperationError: Blocking call!java.io.FileInputStream#readBytes

如何避免这种情况?

      @BeforeAll
      public static void blockHoundSetup() {
        BlockHound.install();
      }
    
      @BeforeEach
      public void setUp() {
        stagingAreaAdapter.deleteAll()
            .thenMany(Flux.fromIterable(data))
            .flatMap(stagingAreaAdapter::save)
            .blockLast();
      }

标签: spring-webflux

解决方案


检查 BlockHound 自定义以允许和禁止方法内的阻塞调用: https ://github.com/reactor/BlockHound/blob/master/docs/customization.md#dis-allowing-blocking-calls-inside-methods

1.在 @BeforeAll 方法中使用构建器(根据@KrisKris1):

@BeforeAll 
public static void blockHoundSetup() { 
    BlockHound.builder().allowBlockingCallsInside(
        TestClass.class.getName(), "setUp").install(); 
} 

或者

2.通过实现BlockHoundIntegration接口(仍然适用于全局):

public class BlockHoundCustomConfiguration implements BlockHoundIntegration {

    @Override
    public void applyTo(BlockHound.Builder builder) {
        builder.allowBlockingCallsInside("java.base/java.io.RandomAccessFile", "readBytes");
    }
}

并创建以下文件: <project dir>/src/test/resources/META-INF/services/reactor.blockhound.integration.BlockHoundIntegration 使用您的自定义类:

com.example.config.BlockHoundCustomConfiguration

推荐阅读