Java反应器:不适当的阻塞方法调用

我将其添加到代码中的两个位置

Flux.empty()
    .collectList()
    .block();

在一种情况下,IntelliJ突出显示.block()并显示错误消息Inappropriate blocking method call。在其他地方也可以。

Settings -> Inspections中,我看到这可能是因为不应在此片段中阻塞线程。

报告在不应阻止线程的代码片段中找到的线程阻止方法调用(例如,反应性框架,Kotlin协程)

在什么地方不应阻塞线程?我知道我们必须避免阻塞呼叫,但是我正在从响应式迁移到非响应式,因此需要将此阻塞作为一种临时解决方法。

fandongdong888 回答:Java反应器:不适当的阻塞方法调用

在什么地方不应阻塞线程?我知道我们必须避免阻塞呼叫,但是我正在从响应式迁移到非响应式,因此需要将此阻塞作为一种临时解决方法。

Netty事件循环线程上绝对禁止使用,因为这些线程故意只有几个,并且它们被设计为总是很忙(从不阻塞)以实现最大吞吐量。这可能是IntelliJ抱怨的。 (Schedulers.singleSchedulers.parallel是此处的相关反应堆调度程序。)

在另一个线程上进行阻塞可能是可以的,只要您知道这种情况正在发生并且了解这样做的后果即可。您会故意在迁移中阻塞的通常位置,例如位于单独的线程池(专门为这些阻塞任务指定的线程池)中,或内置的反应堆Schedulers.elasticSchedulers.boundedElastic池中,是为此目的而设计的。

本文链接:https://www.f2er.com/2824455.html

大家都在问