解决响应式编程Mono中的doOnNext内容未被执行的问题:
遇到的场景是,需要首先使用一个Mono数据流执行一套异步操作,捕获异步的相应,将响应同步的返回,可以简化为一个方法中需要使用两个Mono数据流,而一个return只会订阅消费一次,怎么解决两个Mono都被订阅的问题
问题描述
例如:代码如下所示:此时stu.doOnNext()整个流程不会被执行
@PostMapping("/testBefore")
public Object testMono(@RequestBody @Validated Mono<Student> stu) {
stu.doOnNext(p -> {
p.setAge(20);
System.out.println("里面是" + p.toString());
System.out.println("执行了吗");
}).subscribe();
return Mono.just(new Student("lisi", 18));
}
结果如下,控制台未输出任何内容,可以得知stu.doOnNext内部未被执行:
原因分析:
1、不能直接使用stu对象进行调用Mono的方法,应使用Mono.just对原数据进行封装
2、Mono的doOnNext()允许我们附加一个侦听器,该侦听器将在发出数据时触发,而str.doOnNext没有任何数据发出,这里修改为对数据是否发出没有要求的doOnSuccess方法,doOnSuccess附加一个监听器,该监听器将在Mono 成功完成时触发,即使没有发出任何数据, Mono也被认为已成功完成
解决方案:
源代码修改为:
@PostMapping("/testMono")
public Object testMono(@RequestBody @Validated Student stu) {
Mono.just(stu).doOnSuccess(p -> {
p.setAge(20);
System.out.println("里面是" + p.toString());
System.out.println("执行了吗吗");
}).subscribe();
return Mono.just(new Student("lisi", 18));
}
结果如下