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()
调用,在Flux
开始发送数据之前,用户订阅所需的毫秒数,因此在这一点上,它不会尝试缓冲任何数据,而是直接将其发送到Flux。没有它,Flux
会在订户订阅之前发出值,因此您可以获得如上所述的无限缓冲序列
同样,如果您注释掉Flux上的repeat()
调用,那么它也可以正常工作,因为处理器将只缓冲这5个值,直到发出subscribe调用
此代码是否可能内存不足
在无限缓冲发生的情况下,那么是的-最终处理器将没有足够的内存来容纳更多的数据
我总是看到processor.size()=0。为什么?
因为处理器在发布到您的订户时没有保存任何值,所以不需要在该点上缓冲这些值。如果在处理器试图无限缓冲这些值时调用
size()
,则会看到它不断上升。在源.subscribe(处理器)之间放置Thread.sleep
代码>和处理器。订阅(i->
使整个链按预期运行(队列正在填充)。但是,我不知道为什么-可能是并发初始化的原因。重新排列流的顺序不会改变任何东西-感觉有点像一个bug。