我似乎无法获得不受限制的需求来与bufferTimeout
一起使用的无限资源。我的源中有很多数据,但是我可以有选择地从中获取数据,因此,如果不需要,则无需在内存中缓冲很多数据。但是,我无法弄清楚如何使两个反应堆同时使用。1.不要求无限需求。 2.当信号源响应慢时不会溢出。
这是一个JUnit测试用例:
@Test
void bufferAllowsRequested() throws InterruptedException {
ExecutorService workers = Executors.newFixedThreadPool(4);
AtomicBoolean down = new AtomicBoolean();
Flux.generate(sink -> {
produceRequestedTo(down, sink);
}).concatMap(Flux::fromIterable).bufferTimeout(400, Duration.ofMillis(200))
.doOnError(t -> {
t.printStackTrace();
down.set(true);
})
.publishOn(Schedulers.fromExecutor(workers), 4)
.subscribe(this::processBuffer);
Thread.sleep(3500);
workers.shutdownNow();
assertFalse(down.get());
}
private void processBuffer(List<Object> buf) {
System.out.println("Received " + buf.size());
try {
Thread.sleep(400);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private void produceRequestedTo(AtomicBoolean down, SynchronousSink<Object> sink) {
Thread.sleep(new Random().nextInt(1000));
try {
sink.next(IntStream.range(0, 500).boxed().collect(Collectors.toList()));
} catch (Exception e) {
e.printStackTrace();
down.set(true);
}
}
我已经尝试了Flux.create和Flux.generate,但是似乎都遇到了这个问题。我不明白这不是常见的用例。
我在这里提出了一个问题:https://github.com/reactor/reactor-core/issues/1557