java - 在 Project Reactor 中对 doOnNext 执行触发并忘记操作
问题描述
我有一个Flux
流。对于每个处理的元素,我希望触发一个异步/非阻塞的动作。例如,Mono
从数据库更新返回 a 的方法。我希望这个动作在doOnNext
块上完成。我不想影响Flux
那里实施的处理和背压。
假设Mono
要调用的方法是
Mono<Integer> dbUpdate();
我Flux
应该是这样吗?
public Flux<Data> processData(PollRequest request)
{
return searchService.search(request)
.doOnNext(data -> dbUpdate(data));
}
或者应该如堆栈溢出示例中所述。
public Flux<Data> processData(PollRequest request)
{
return searchService.search(request)
.doOnNext(data -> dbUpdate(data).subscribe());
}
以上不会导致内部阻塞问题doOnNext
吗?
还有哪个是最适合用于此类操作的调度程序?
解决方案
dbUpdate()
如果您不订阅它将被忽略。以下代码段不会打印任何内容,因为Mono.just("db update")
没有被订阅。
Mono<String> dbUpdate() {
return Mono.just("db update")
.doOnNext(System.out::println);
}
public Flux<String> processData() {
return Flux.just("item 1", "item 2")
.doOnNext(data -> dbUpdate());
}
请注意,.subscribe()
这不会阻止您的线程,它会启动工作并立即返回。
推荐阅读
- matlab - “数组索引必须是正整数或逻辑值”
- julia - Julia:用于绘制相同数据的两个 x 轴
- java - 如何使用java将普通英语、俄语(西里尔文)和编码俄语字符串的混合字符串转换为普通字符串
- android - 文本小部件中数字数据的颤动百分比
- json - 如何使用 ubuntu bash foreach json 数组名称值 az 组列表
- sql - 使用从列表框中传递的值访问 VBA 运行查询
- java - 使用输入的数字创建一个星方
- image - 如何使用 Flutter 将图像上传到服务器
- javascript - 将 cookie 数据从父级发送到 iframe
- ios - UIRefreshControl 正常运行但没有动画