反应器:背压和缓冲,无溢出

时间:2019-03-20 00:57:59

标签: spring project-reactor

我似乎无法获得不受限制的需求来与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

0 个答案:

没有答案