如何将返回 `void` 的同步方法包装到 Mono<Void> 中?
Posted
技术标签:
【中文标题】如何将返回 `void` 的同步方法包装到 Mono<Void> 中?【英文标题】:How to wrap synchronous method that returns `void` into Mono<Void>? 【发布时间】:2020-12-07 13:25:26 【问题描述】:我正在尝试调整返回 void
的 postgresql 存储库 deleteById
方法以返回 Mono<Void>
存储库是我自动装配的服务,我这样使用它
repository.deleteById(id)
以字符串 id 作为参数
【问题讨论】:
如何调用存储库? 存储库是我自动装配的服务,我像repository.deleteById(id)
这样使用它,以字符串 id 作为参数
【参考方案1】:
如果你想使用响应式堆栈,那么你应该使用spring-data-r2dbc,它提供了ReactiveCrudRepository
和方法Mono<Void> deleteById(ID id)
。
如果由于某种原因您需要使用同步方法,那么您可以使用 Mono.fromRunnable 包装 deleteById
调用
Mono.fromRunnable(() -> repository.deleteById(someId))
但是,应该避免这种情况,因为这样您就不会获得使用反应式堆栈的任何好处。
【讨论】:
根据 OP 的需要,R2DBC 可能就足够了,因为它提供了一个不错的响应式存储库实现,但在功能方面仍然非常缺乏(它不支持实体关系、嵌入等) 问题是使用带有 sql 数据库的反应堆栈是否是一个好主意。据我所知,目前 spring-r2dbc 是这种情况下的最佳选择,而且它会变得更好。它仍然缺乏同步世界的许多功能,但已经支持嵌入式数据库 谢谢,稍后我可能会升级 spring-data-r2dbc,但现在我想尝试将同步存储库(使用 JPA)包装为“反应式”。顺便问一下Mono.fromRunnable(() -> repository.deleteById(someId))
和使用Mono.create(sink -> failedKafkaRepository.deleteById(id))
有什么不同?我昨天发现了这个,不太确定它是否与Mono.fromRunnable
实现相同的效果
在反应式编程中,您需要向下一个处理器发送信号/事件,以便向其传递一些数据、错误或只是通知不会传递任何值,因此它可以停止侦听。如果您使用Mono.create
,那么您的Callable 函数将获得一个sink
,可用于手动发送事件。更多信息可以在文档projectreactor.io/docs/core/release/api/reactor/core/publisher/… 中找到;)以上是关于如何将返回 `void` 的同步方法包装到 Mono<Void> 中?的主要内容,如果未能解决你的问题,请参考以下文章