当前位置: 首页 > 知识库问答 >
问题:

为什么使用mono.FromCallable()时会出现“阻塞,线程反应器-http-nio-4不支持”的错误?

暴招
2023-03-14

我同意反应性代码不应该阻塞,但是...

在下面的方法findTenantStorageFactory()中,我需要阻止tenantId,这样该方法就可以为租户返回一个特定的工厂。我从Project Reactor中找到了一些说明,说明我需要将方法包装在一个mono.FromCallable()中,并使用boundedElastic()调度程序。但是,当我在调试器中运行此代码时,我会收到可怕的:“block()/blockfirst()/blocklast()正在阻塞,这是不受支持的”错误。我尝试了无数个想法,但没有任何进展。我很感激你的建议。

//////////////////////////////////////////////////////////////////////////
fun findTenantStorageFactory(tenantId: Mono<TenantId>):
  Mono<Either<BaseAzureBlobStorageException, MultitenantAzureBlobStorageFactory>> {
    val myValue: Callable<Either<
                   BaseAzureBlobStorageException, 
                   MultitenantAzureBlobStorageFactory>> =

    Callable { lookupTenantBlobStorageFactory(tenantId.block()!!, factories) }

    return Mono.fromCallable<Either<
                  BaseAzureBlobStorageException, 
                  MultitenantAzureBlobStorageFactory>>(myValue)
               .subscribeOn(Schedulers.boundedElastic())
    }

//////////////////////////////////////////////////////////////////////////
private val blobStorageClientBuilder: AzureBlobClientBuilder
 get() = 
   findTenantStorageFactory(tenantId).block()!!
     .fold({ throw it }, { it.blobStorageClient })!!
/////////////////////////////// ERROR ///////////////////////////////////
    java.lang.IllegalStateException: block()/blockFirst()/blockLast() are blocking, which is not supported in thread reactor-http-nio-4
    at reactor.core.publisher.BlockingSingleSubscriber.blockingGet(BlockingSingleSubscriber.java:83) ~[reactor-core-3.4.0-M1.jar:3.4.0-M1]
    Suppressed: reactor.core.publisher.FluxOnAssembly$OnAssemblyException: 

共有1个答案

许俊雅
2023-03-14

为什么您认为需要阻止tenantid?我将使用map将单声道转换为单声道。如果LookupTenantBlobStorageFactory是一个长期运行的方法,并且您希望避免阻塞当前线程,那么Publishon应该会对您有所帮助。类似于这样:

fun findTenantStorageFactory(tenantId: Mono<TenantId>):
  Mono<Either<BaseAzureBlobStorageException, MultitenantAzureBlobStorageFactory>> {
     return tenantId.publishOn(Schedulers.boundedElastic())
        .map({ id -> lookupTenantBlobStorageFactory(id, factories) })
}
 类似资料:
  • 我在Spring Webflow中执行阻塞操作时遇到了一个小问题。我检索文章文档列表,并从文章文档列表中,我想更新另一个对象。 当我执行以下操作时,有时它会工作,有时会抛出“block()/block First()/block Last()被阻塞,这在线程reactor-超文本传输协议-nio-2中是不支持的”。你能建议如何修复吗?我真的不想让它阻塞,但不知道如何继续。stackoverflow

  • I使用SpringSpring靴2.1.0。 在其他bean中调用此方法 我需要传递一个字符串值,而不是Mono,当我传递Mono时,答案是空的。 当我试图从Mono获取字符串值时,我得到了一个错误: 如果有人有解决办法,我会很感激

  • 问题内容: 当用户选择在另一个线程中启动阻止进程的菜单项时,我试图在JavaFX 8应用程序中提供反馈。在我的实际应用程序中,它是文件下载,但是通过示例,我使用最少的代码创建了一个测试用例: 它的工作方式如下:当选择“开始”菜单项时,主菜单文本应立即更改为“正在运行…”,然后应附加“完成!”。经过5秒钟的模拟我的文件下载的睡眠。 实际上发生的是,即使我正在使用,在阻止过程完成 后 , 两个 文本更

  • 我不明白以下几点: 用户级线程需要非阻塞系统调用,即多线程内核。否则,整个进程将在内核中阻塞,即使进程中还有可运行的线程。 内核线程如何处理阻塞系统调用?在用户级线程中,当一个线程进行阻塞系统调用(例如读取)时,为什么其他线程不能继续工作?

  • 我正在尝试创建一个消费者-生产者程序,其中消费者线程生产者的数字填充数组,消费者线程打印填充数组的数字。目前,我可以填充数组并在使用者/生产者线程之间来回传递数据,但我希望生产者创建数字的速度比使用者处理数字的速度快。 此刻,每1秒产生一个数字,每3消耗一个数字。在消耗一个之前应该产生两个数字,但是我的生产者线程正在等待,直到它产生的数字被消耗。 我试过移动互斥锁和解锁,还有信号,但我没有得到它的

  • 线程实例的join()方法可用于将一个线程的执行开始“连接”到另一个线程的执行结束,这样一个线程在另一个线程结束之前不会开始运行。如果对线程实例调用join(),则当前运行的线程将阻塞,直到线程实例完成执行 但是如果我有多个线程并且当我在循环内部调用join时。所有线程并行运行。但是根据连接的概念,首先连接的线程应该完成,然后只有主线程才允许连接其他线程。 } 在上面的代码中,如果第一个线程被连接