以下代码的问题在于,订阅者只能看到第一个通量的项目(即仅打印1
)。有趣的是,如果我添加delayElements
,它可以正常工作。
这是一个玩具示例,但我的意图是将其替换为发出HTTP GET请求并发出其结果的Flux
,(也可以是两个以上)。
因此,重新提出我的问题,我需要实现一个多对一关系。考虑到我的情况,如何实施?您会使用某种处理器吗?
public static void main(String[] args) throws Exception {
Flux<Integer> flux1 = Flux.generate(emitter -> {
emitter.next(1);
});
Flux<Integer> flux2 = Flux.generate(emitter -> {
emitter.next(2);
});
Flux<Integer> merged = flux1.mergeWith(flux2);
merged.subscribe(s -> System.out.println(s));
Thread.currentThread().join();
}
试图通过TopicProcessor实现相同的想法,但是却遇到了相同的问题:
public static void main(String[] args) throws Exception {
Flux<Integer> flux1 = Flux.generate(emitter -> {
emitter.next(1);
try {
Thread.sleep(100);
} catch (Exception e) {}
});
Flux<Integer> flux2 = Flux.generate(emitter -> {
emitter.next(2);
try {
Thread.sleep(100);
} catch (Exception e) {}
});
TopicProcessor<Integer> processor = TopicProcessor.create();
flux1.subscribe(processor);
flux2.subscribe(processor);
processor.subscribe(s -> System.out.println(s));
Thread.currentThread().join();
}
答案 0 :(得分:2)
请注意,合并是为与异步源或有限源一起使用而设计的。在处理尚未在专用Scheduler上发布的无限源时,您必须将该源隔离在其自己的Scheduler中,因为合并可能会在订阅另一个源之前尝试耗尽它。
您要在这里创建一个没有专用调度程序的无限源,因此它试图在合并之前完全耗尽该源-这就是您遇到问题的原因。
在您的实际用例中,这可能不是问题,因为GET
请求的结果可能不会是无限的。但是,如果您想确保结果是交错的,则只需确保使用自己的调度程序设置每个流量(通过在每个Flux上调用subscribeOn(Schedulers.elastic());
。)
因此您的示例变为:
Flux<Integer> flux1 = Flux.<Integer>generate(emitter -> emitter.next(1))
.subscribeOn(Schedulers.elastic());
Flux<Integer> flux2 = Flux.<Integer>generate(emitter -> emitter.next(2))
.subscribeOn(Schedulers.elastic());
Flux<Integer> merged = flux1.mergeWith(flux2);
merged.subscribe(s -> System.out.println(s));
Thread.currentThread().join();