使用BlockHound时Kotlin程序抛出BlockingOperationError问题求助
解决BlockHound检测runBlocking时的BlockingOperationError问题
你遇到的报错是因为BlockHound会拦截所有阻塞式调用,而Kotlin协程的runBlocking底层依赖jdk.internal.misc.Unsafe#park来阻塞当前线程,所以被BlockHound判定为违规操作。
下面是几种可行的解决方式:
测试场景:允许指定位置的阻塞调用
如果你只是在测试中使用runBlocking,可以通过BlockHound的配置放行对应的内部调用:BlockHound.install { // 允许runBlocking内部的joinBlocking方法执行阻塞操作 allowBlockingCallsInside("kotlinx.coroutines.BlockingCoroutine", "joinBlocking") }这样BlockHound就会忽略这个位置的park调用,不会抛出错误。
替换runBlocking为测试专用的协程运行器
Kotlin官方提供了kotlinx-coroutines-test库,其中的runTest是专门为测试设计的非阻塞协程运行器,不会触发BlockHound的检测:import kotlinx.coroutines.test.runTest import reactor.blockhound.BlockHound BlockHound.install() val throwable: Throwable = assertThrows { runTest { // 调用你的目标方法 } }这是更推荐的测试方案,既符合协程测试的最佳实践,又能和BlockHound兼容。
生产环境:避免在Reactor上下文混用runBlocking
如果是生产代码,应该用Kotlin协程和Reactor的互操作API(比如kotlinx-coroutines-reactor中的awaitSingle()、asFlow()等),替代用runBlocking包裹Reactor代码的写法,从根源上避免阻塞调用。
内容的提问来源于stack exchange,提问作者Ishita
相关产品推荐
相关产品推荐

