我同意反应性代码不应该阻塞,但是...
在下面的方法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:
为什么您认为需要阻止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时。所有线程并行运行。但是根据连接的概念,首先连接的线程应该完成,然后只有主线程才允许连接其他线程。 } 在上面的代码中,如果第一个线程被连接