在 return 之前订阅一个 Mono 是个好模式吗?
Is it a good pattern to subscribe a Mono before return it?
我想在 return 之前订阅一个 Mono,订阅者的消费者会做一些工作,比如写一些信息,代码如下所示:
Mono result = a remote call by WebClient;
result.subscribe(data->successLog(log,JSON.toJSONString(data)));
return result;
现在问题来了:
WebClient远程调用会触发两次!
如何订阅 Mono 并在 return 之前做点什么?
不是:)
在 Reactive Streams 中,默认情况下一切都是“惰性”的:您不是在“调用操作”(命令式),而是在构建一个稍后将执行的管道(其中 subscribe()
是触发器处决)。
如果需要在Mono
解析成功时登录,可以使用Mono#doOnNext
:
return result.doOnNext(data -> successLog(log, JSON.toJSONString(data)));
这样,每次您的 Mono
解决时它都会记录下来。
为什么是“每次”?因为,在 Reactive Streams 中,重新订阅相同的 Mono
是绝对有效的(例如重试)。
我想在 return 之前订阅一个 Mono,订阅者的消费者会做一些工作,比如写一些信息,代码如下所示:
Mono result = a remote call by WebClient; result.subscribe(data->successLog(log,JSON.toJSONString(data))); return result;
现在问题来了:
WebClient远程调用会触发两次!
如何订阅 Mono 并在 return 之前做点什么?
不是:)
在 Reactive Streams 中,默认情况下一切都是“惰性”的:您不是在“调用操作”(命令式),而是在构建一个稍后将执行的管道(其中 subscribe()
是触发器处决)。
如果需要在Mono
解析成功时登录,可以使用Mono#doOnNext
:
return result.doOnNext(data -> successLog(log, JSON.toJSONString(data)));
这样,每次您的 Mono
解决时它都会记录下来。
为什么是“每次”?因为,在 Reactive Streams 中,重新订阅相同的 Mono
是绝对有效的(例如重试)。