引言:
spring cloud gateway --> webflux --> reactor-netty --> reactor-core
以上是github上几个项目的依赖关系。
说明:
reactor-core是reactive programming模型的一个具体实现。
本文简单说明在reactor-core中,flux工作底层到底做了什么。
先说给一个完整的demo代码
Flux<String> data = Flux.just("hello", "hello2");//1
data = data.map(e -> e + " world"); //2
data.subscribe( e -> System.out.println(e) );//3
1、Flux<String> data = Flux.just("hello", "hello2");
这个方法内部创建一个FluxArray对象,把数据存储到array参数里。
2、data = data.map(e -> e + " world");
这个方法内部创建一个FluxMapFuseable对象,把FluxArray对象存储到source参数里,把(e -> e + " world")存储到mapper。
这个方法逻辑就是通过把原来的数据和新的处理逻辑,一层一层的封装起来。
3、data.subscribe( e -> System.out.println(e) );
在方法的底层调用的是Flux类的subscribe()方法,比较复杂,下面展开说明。
subscribe的具体代码
OptimizableOperator operator = (OptimizableOperator)publisher;
while(true) {
subscriber = operator.subscribeOrReturn(subscriber);//1
if (subscriber == null) {
return;
}
OptimizableOperator newSource = operator.nextOptimizableSource();//2
if (newSource == null) {
publisher = operator.source();
break;
}
operator = newSource;
}
}
publisher.subscribe(subscriber);//3
参数:publisher就是上面的FluxMapFuseable对象,subscriber就是上面( 的(e -> System.out.println(e) )。
1、subscriber = operator.subscribeOrReturn(subscriber);
这个方法内部MapFuseableSubscriber创建一个FluxMapFuseable对象,把subscriber对象存储到actual参数里,把FluxMapFuseable对象里的map,也就是(e -> e + " world")存储到mapper。
这个方法与生成FluxMapFuseable对象类似,之前是把原始的array一层一层的套上map,现在反过来把FluxMapFuseable对象上的map一层一层解开,再套到subscriber上。
2、OptimizableOperator newSource = operator.nextOptimizableSource();
这个方法比较好理解了,就是获取FluxMapFuseable对象的里面一层。
3、publisher.subscribe(subscriber);
出了while循环,开始真正执行 subscribe。
参数:publisher就是原始的fluxArray数据,subscriber是一层一层的map,最外层是(e -> e + " world"),最里层是(e -> System.out.println(e) )。
subscribe()方法里,先调用fluxArray的fastPath(这个方法名先忽略含义),里面会对每个array元素调用subscriber的onNext方法。onNext方法调用map中的(e -> e + " world")处理数据,然后交给里一层subscriber,继续调用onNext方法,最终到(e -> System.out.println(e) )。
到此,调用完成。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。