Mono.fromCallable 和 Mono.justOrEmpty 的区别

Jav*_*mer 5 java reactive-programming project-reactor spring-webflux

下面两个执行有什么不同?

Mono.justOrEmpty(someFunction())
  .doOnNext(() -> doSomeTask()).subscribe();

Mono.fromCallable(() -> someFunction())
  .doOnNext(() -> doSomeTask()).subscribe();
Run Code Online (Sandbox Code Playgroud)

Sim*_*slé 5

对于Mono.fromCallableCallable仅当结果Mono被订阅时才被延迟调用。

(您甚至可以将代码片段重写为Mono.fromCallable(this::someFunction)ifsomeFunction不带任何参数)

使用 时Mono.justOrEmpty,操作员会立即捕获该值以供将来发射。因此,实际上,该someFunction()方法在构造时立即调用。

请注意,这两个变体都会正确处理someFunction()返回null(与 不同Mono.just(...))。在这种情况下,结果Mono将简单地完成(onComplete无信号onNext)。

另请注意,如果该方法是阻塞且长时间运行的,则在这两种情况下它都可能是反模式。请参阅https://projectreactor.io/docs/core/release/reference/#faq.wrap-blocking

  • 另一个重要的考虑因素是错误处理。如果“someFunction”可能抛出异常,“Mono.justOrEmpty”将不允许您将错误作为反应流的一部分进行处理(例如使用“onErrorResume”),因为正如 @Simon 提到的“方法在构造时立即调用”,但“Mono” .fromCallable` 会起作用。 (2认同)

Fat*_*tih 3

基本上 usingMono.fromCallable() Callable发出的结果值为MonoMono.justOrEmpty()只发出指定的项目,就好像Mono它存在一样。

官方文档中的justOrEmpty描述fromCallable如下:

Mono.justOrEmpty()

创建一个新的 Mono,如果非 null,则发出指定的项目,否则仅发出 onComplete。

在此输入图像描述

Mono.fromCallable()

使用提供的 Callable 创建一个产生其值的 Mono。如果 Callable 解析为 null,则生成的 Mono 将完成为空。

在此输入图像描述

如果您需要更详细的信息Mono,可以查看官方文档。