如何将返回 `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&lt;Void&gt;

存储库是我自动装配的服务,我这样使用它

repository.deleteById(id) 以字符串 id 作为参数

【问题讨论】:

如何调用存储库? 存储库是我自动装配的服务,我像 repository.deleteById(id) 这样使用它,以字符串 id 作为参数 【参考方案1】:

如果你想使用响应式堆栈,那么你应该使用spring-data-r2dbc,它提供了ReactiveCrudRepository和方法Mono&lt;Void&gt; deleteById(ID id)

如果由于某种原因您需要使用同步方法,那么您可以使用 Mono.fromRunnable 包装 deleteById 调用

Mono.fromRunnable(() -> repository.deleteById(someId))

但是,应该避免这种情况,因为这样您就不会获得使用反应式堆栈的任何好处。

【讨论】:

根据 OP 的需要,R2DBC 可能就足够了,因为它提供了一个不错的响应式存储库实现,但在功能方面仍然非常缺乏(它不支持实体关系、嵌入等) 问题是使用带有 sql 数据库的反应堆栈是否是一个好主意。据我所知,目前 spring-r2dbc 是这种情况下的最佳选择,而且它会变得更好。它仍然缺乏同步世界的许多功能,但已经支持嵌入式数据库 谢谢,稍后我可能会升级 spring-data-r2dbc,但现在我想尝试将同步存储库(使用 JPA)包装为“反应式”。顺便问一下Mono.fromRunnable(() -&gt; repository.deleteById(someId)) 和使用Mono.create(sink -&gt; failedKafkaRepository.deleteById(id)) 有什么不同?我昨天发现了这个,不太确定它是否与Mono.fromRunnable 实现相同的效果 在反应式编程中,您需要向下一个处理器发送信号/事件,以便向其传递一些数据、错误或只是通知不会传递任何值,因此它可以停止侦听。如果您使用Mono.create,那么您的Callable 函数将获得一个sink,可用于手动发送事件。更多信息可以在文档projectreactor.io/docs/core/release/api/reactor/core/publisher/… 中找到;)

以上是关于如何将返回 `void` 的同步方法包装到 Mono<Void> 中?的主要内容,如果未能解决你的问题,请参考以下文章

将同步 API 包装到 Async 方法中

将同步代码包装成异步方法的最佳方法是啥

使用 SWIG,如何将 C++ void func(Class& out) 包装为 C# Class func()?

Linux中多线程,同步将一个文件内容复制到另一个文件里面

使用async和await将同步方法包装成异步方法

为啥将返回类型添加到 void 返回方法会导致 MissingMethodException