我想并行执行,而不必在最后汇总事件。我是RxJava的新手,正在尝试评估它是否适合我的需求。
我知道如何执行正常的非并行执行。为简单起见,让我们开始:
taskReader.stream() // returns Flowable<Task>
.subscribe(this::processTask) // sends results to another micro service
这很好地以有序,阻塞的方式工作。但是,我想并行化并同时执行所有任务。该文档基本上告诉您使用flatMap,这很有意义,但是我无法全神贯注于如何运行整个过程。让我们看看:
taskReader.stream() // returns Flowable<Task>
.flatMap(
Flowable.just(task)
.subscribeOn(Schedulers.computation())
.map(this::processTask)
)
这是我所需要的,但是由于没有订阅任何内容,因此这当然不会启动Flowable [1]。我所有的任务都不相关,因此我不需要再次将它们聚合到顶级流中,并且我当然不在乎它们的顺序。
如何启动这样的Flowable?我不想订阅顶级Flowable,因为我在那里不需要做其他事情。
或者,文档告诉您使用并行流:
taskReader.stream() // returns Flowable<Task>
.parallel()
.runOn(Schedulers.computation())
.map(this::processTask)
.sequential();
同样,我不需要在序列末尾排序,因为我不在乎顺序。另外,我也不想订阅这个,因为地图上的工作就是我所需要的。
我真正想要的是:
taskReader.stream() // returns Flowable<Task>
.flatMap(
Flowable.just(task)
.subscribeOn(Schedulers.computation())
.subscribe(this::processTask)
)
但这不是RxJava的工作方式。
有帮助吗?
某些背景:我正在从事件彼此无关的队列(特别是AWS SQS)接收事件。对于每一项,我将需要执行一些I / O密集型工作,然后执行一些CPU密集型工作,最后将结果发送到另一个系统。我想并行运行所有这些事件,因此,我实际上不需要为计算io工作而安排良好的调度。我以为RxJava可以为我提供帮助,但也许我在第一步的过程中尝试使用错误的工具。
[1]这是我们从文档中获得的信息,除非我搜索错误。这真的是我们唯一的文档-https://github.com/ReactiveX/RxJava/wiki吗?我希望有类似Reactor的东西:https://projectreactor.io/docs/core/release/reference/
答案 0 :(得分:0)
将processTask()更改为类似Flowable流的
public Flowable<ProcessTask> processTask() {
return Flowable
.create(
e -> {
//Put the complete code inside this block which you have currently inside your processTask() method
//Whatever processed output you get pass it as shown below.
e.onNext(//Pass <ProcessTask> object);
},
BackpressureStrategy.BUFFER //Choose any BackpressureStrategy which suits your requirement
)
.subscribeOn(Schedulers.io());
}
因此,基本上,processTask()也将返回Flowable流。
这是您现在可以使用flatMap()的方式,
taskReader
.stream() // returns Flowable<Task>
.flatMap(task -> processTask(task))
.subscribe(
result -> //Processed task, result from e.onNext(),
error -> //Error
);
希望这会有所帮助。