Java Spring Reactor:这种流量会从内存中消失吗?

Java Spring Reactor:这种流量会从内存中消失吗?,java,reactive-programming,project-reactor,Java,Reactive Programming,Project Reactor,考虑以下代码: public static void main(String[] args) throws Exception { UnicastProcessor<Integer> processor = UnicastProcessor.create(); Flux<Integer> source = Flux .just(1, 2, 3, 4, 5) .delayEle

考虑以下代码:

public static void main(String[] args) throws Exception {

        UnicastProcessor<Integer> processor = UnicastProcessor.create();
        Flux<Integer> source = Flux
                .just(1, 2, 3, 4, 5)
                .delayElements(Duration.ofMillis(1))
                .repeat();

        source.subscribe(processor);

        processor.subscribe(i -> {
            System.out.println("i = " + i);
            System.out.println("processor.size() = " + processor.size());
            try {
                Thread.sleep(1000);
            } catch (Exception e) {
                System.out.println(e);
            }
        });

        Thread.currentThread().join();

    }
publicstaticvoidmain(字符串[]args)引发异常{
UnicastProcessor=UnicastProcessor.create();
通量源=通量
.就(1,2,3,4,5)
.延迟要素(持续时间百万(1))
.重复();
source.subscribe(处理器);
处理器。订阅(i->{
System.out.println(“i=“+i”);
System.out.println(“processor.size()=”+processor.size());
试一试{
睡眠(1000);
}捕获(例外e){
系统输出打印ln(e);
}
});
Thread.currentThread().join();
}
您可以看到
源的延迟
比订户的延迟(睡眠1秒)小得多

问题:

  • 此代码是否可能内存不足
  • 我总是看到
    processor.size()=0
    。为什么?我希望队列被填满(它是无限的)
  • 如果删除
    delayElements
    命令,则什么也看不到。为什么?
  • 谢谢

    创建一个新的单播处理器,该处理器将以无限方式缓冲内部队列。

    (我的重点。)

    具体来说,这意味着如果其订户尚未请求数据,它将尝试缓冲任何可用的数据。它不知道那里的流量是无限的,所以它尽可能多地缓冲这些数据

    如果删除delayElements命令,则什么也看不到。为什么?

    使用
    delayElements()
    调用,在
    Flux
    开始发送数据之前,用户订阅所需的毫秒数,因此在这一点上,它不会尝试缓冲任何数据,而是直接将其发送到Flux。没有它,
    Flux
    会在订户订阅之前发出值,因此您可以获得如上所述的无限缓冲序列

    同样,如果您注释掉Flux上的
    repeat()
    调用,那么它也可以正常工作,因为处理器将只缓冲这5个值,直到发出subscribe调用

    此代码是否可能内存不足

    在无限缓冲发生的情况下,那么是的-最终处理器将没有足够的内存来容纳更多的数据

    我总是看到processor.size()=0。为什么?


    因为处理器在发布到您的订户时没有保存任何值,所以不需要在该点上缓冲这些值。如果在处理器试图无限缓冲这些值时调用
    size()
    ,则会看到它不断上升。

    源.subscribe(处理器)之间放置
    Thread.sleep
    处理器。订阅(i->
    使整个链按预期运行(队列正在填充)。但是,我不知道为什么-可能是并发初始化的原因。重新排列流的顺序不会改变任何东西-感觉有点像一个bug。