RxJava 2-并行化事件以产生副作用

时间:2019-01-06 02:23:49

标签: java rx-java2 reactive-streams

我想并行执行,而不必在最后汇总事件。我是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/

1 个答案:

答案 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
    );

希望这会有所帮助。