spring-webflux - 设置数据时如何避免 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();
}
解决方案
检查 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
推荐阅读
- javascript - 单击包含按钮时旋转图标
- sap-cloud-sdk - 在嵌入式 webapp 中执行前端测试
- kubernetes - 为什么在 Kubernetes 中找不到服务发现?
- angular - 使用 MapsAPILoader 时无法解析参数 - Angular
- laravel - 如何在 Laravel 中进行多个子查询
- python - “AsyncIOMotorLatentCommandCursor”对象不可下标
- javascript - 如何将样式传递给子组件并将其用作 Vue 中的作用域样式?
- function - 自行更新的 Flutter 模型
- ruby - Inspec - 控制源代码错误 - 503“服务不可用”
- c++ - 我在 C++ 中的输出有问题,最后两次打印不起作用