如何订阅合并的无限flowables?

时间:2019-10-17 11:59:35

标签: reactive-programming rx-java2

我有几个无限的Flowable(从BlockingQueues获取数据)。我合并它们并与我的自定义订阅者订阅。我不明白为什么我只能从单个Flowable输入中获取消息。

这是我的代码:

<T> void example() {
    List<BlockingQueue<T>> queues = createQueues();

    List<Flowable<T>> allFlowables = queues.stream()
            .map(this::createFlowable)
            .collect(Collectors.toList());

    FlowableScan.merge(allFlowables)
            .subscribe(new DefaultSubscriber<T>() {

                @Override
                protected void onStart() {
                    System.out.println("Start!");
                    request(1);
                }

                @Override
                public void onNext(T message) {
                    System.out.println(message);
                    request(1);
                }

                @Override
                public void onError(Throwable t) {
                    t.printStackTrace();
                }

                @Override
                public void onComplete() {
                    System.out.println("Done!");
                }
            });
}

<T> Flowable<T> createFlowable(BlockingQueue<T> queue) {
    return Flowable.generate(emitter -> {
        T msg = takeFromQueue(q); // blocking
        emitter.onNext(msg);
    });
}

我错过了仅从单个队列中看到消息的问题? 我已经尝试过使用Schedulers,但是并没有帮助。 如何修复以上代码以从所有输入队列使用?

1 个答案:

答案 0 :(得分:1)

因为您在第一个队列中阻塞了为所有源提供服务的唯一线程。您必须引入异步性,例如在C:\Program Files (x86)\Microsoft Visual Studio\2019\BuildTools\MSBuild\Current\Bin中应用.subscribeOn(Schedulers.io())

createFlowable