处理来自发布者的无用数据

时间:2020-02-18 00:34:00

标签: java rx-java project-reactor reactive-streams

如何处理从Publisher并行订阅的数据?

  1. 我应该在一个工作池中订阅一个循环吗?当我在Project Reactor中呼叫subscribe时,我只有一小部分数据。如何“全部耗尽”?
  2. 如何确保每个工作人员将获取不同的数据块?

2 个答案:

答案 0 :(得分:1)

在Project Reactor中,使用parallel()运算符:

Flux.from(thePublisher) //if we don't assume publisher is already a Flux
    .parallel() //instruct the Flux to divide work on "rails",
    //but so far these rails are running on the same thread !
    .runOn(Schedulers.parallel()) //now each rail runs on its own thread
    .map(...).etc(...)
    .sequential() //merge the rails back to a single sequence
    //subscribe, or continue processing sequentially

RxJava 2非常相似,并且具有相同的parallel运算符。

答案 1 :(得分:0)

将每个数据块转换为一个任务,然后将其提交给Executor。转换器可能如下所示:

class Converter implements Subscriber<T> {
    final Executor executor;
    Subscription subscription;

    Converter(Executor executor) {
        this.executor = executor;
    }

    @Override
    public void onSubscribe(Subscription s) {
        subscription = s;
        s.request(1);
    }

    @Override
    public void onNext(T data) {
        executor.execute(()->process(data));
        subscription.request(1);
    }
    ...        
    void process(T o) {
        ...
    }
}