【问题标题】:Is it a good pattern to subscribe a Mono before return it?在返回之前订阅 Mono 是一个好的模式吗?
【发布时间】:2020-07-02 03:26:45
【问题描述】:

我想在返回之前订阅一个 Mono,订阅者的消费者会做一些工作,比如写一些信息,代码如下:

    Mono result = a remote call by WebClient;
    result.subscribe(data->successLog(log,JSON.toJSONString(data)));
    return result;

现在问题来了:

WebClient 的远程调用会触发两次!

如何订阅 Mono 并在返回之前做一些事情?

【问题讨论】:

  • 使用像 doOnNext 这样的 Mono 运算符,不要调用 subscribe

标签: webclient spring-webflux project-reactor


【解决方案1】:

不是:)

在 Reactive Streams 中,默认情况下一切都是“惰性”的:您不是“调用操作”(命令式),您正在构建一个稍后将被执行的管道(其中subscribe() 是触发执行的原因)。

如果Mono成功解析后需要登录,可以使用Mono#doOnNext

return result.doOnNext(data -> successLog(log, JSON.toJSONString(data)));

这样,每次您的Mono 被解析时,它都会记录下来。
为什么是“每次”?因为,在 Reactive Streams 中,在同一个 Mono 上重新订阅是绝对有效的(例如重试)。

【讨论】:

  • 我也在做同样的事情,但这导致由于某种原因没有打印日志,现在必须恢复订阅才能返回。
猜你喜欢
  • 2022-10-01
  • 1970-01-01
  • 2021-10-13
  • 2019-02-18
  • 2021-09-06
  • 2021-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多