当前位置: 首页 > news >正文

reactor框架使用时,数据流请求流程

1. 我们在Flux打开时,可以看到

      public abstract class Flux<T> implements CorePublisher<T> {

2. 

public interface CorePublisher<T> extends Publisher<T> {void subscribe(CoreSubscriber<? super T> subscriber);
}

Publisher的关键时有个subscribe方法。这个方法就是在reactor的subscribe的时候会调用到这里。

3. 这里subscribe的参数有个CoreSubscriber。其实这个方法基本上最终其实会调用到CoreSubscriber的onSubscribe方法。

随便看对void subscribe(CoreSubscriber<? super T> subscriber);的方法的实现

选择Flux举例。看到最终调用结果:

4. 那么onSubscribe怎么调用下游呢?

注意,void onSubscribe(Subscription s);里面又传入了Subscription。

public interface Subscription {public void request(long n);public void cancel();
}

以Flux.just(1),为例,其实所有的onSubscribe方法会调用到Subscription的request方法。

5. request方法,最后调用到了onnext方法

所以数据流程如下:

subscribe()->subscribe(CoreSubscriber<? super T> subscriber)->CoreSubscriber.onSubscribe->Subscription.request(n)->CoreSubscriber.onNext()

6. 因此,onNext的调用前,数据的准备可以在Subscription.request的方法逻辑中内部进行准备,当准备好了再调用onNext方法。如果是分批request的,也就是说CoreSubscriber.onSubscribe逻辑中是分批次调用Subscription.request(n),则每个批次的Subscription.request(n)中都可以等待数据好了再调用onNext方法。

7. 也就是说,数据调用onNext之前,都可以准备好再调用。但是一旦onNext调用以后,就尽量不能阻塞住后续流程了。如果后续流程中有阻塞的情况,就要用publishon和subscribeon了,让阻塞的内容在单独的线程池中执行。

8. 对zipWith方法的理解。摘自chatgpt。不清楚是否正确

如果某个 Flux 中的数据项尚未准备好,zipWith 会挂起合并操作,直到另一个 Flux 中的数据也准备好为止。只要 zipWith 中的两个流的每一对数据项都准备好了,它才会触发 onNext()

因此这里其实Reactor框架其实netty线程还是在做其他的事情,当都准备好了,才会利用netty线程,进行onNext的处理

http://www.lryc.cn/news/524639.html

相关文章:

  • 读西瓜书的数学准备
  • 摄像头模块如何应用在宠物产品领域
  • c++学习第七天
  • Ubuntu 24.04 LTS 通过 docker 安装 nextcloud 搭建个人网盘
  • RabbitMQ1-消息队列
  • Open3D计算点云粗糙度(方法一)【2025最新版】
  • 算法6(力扣148)-排序链表
  • 一文大白话讲清楚webpack基本使用——9——预加载之prefetch和preload以及webpackChunkName的使用
  • 【大数据2025】MapReduce
  • Windows图形界面(GUI)-QT-C/C++ - Qt List Widget详解与应用
  • 深度学习python基础(第二节) 分支语句和循环语句
  • Gin 源码概览 - 路由
  • 第6章 ThreadGroup详细讲解(Java高并发编程详解:多线程与系统设计)
  • CentOS 7乱码问题如何解决?
  • JavaScript语言的多线程编程
  • OpenSeaOtter使用手册-变更通知和持续部署
  • (2)STM32 USB设备开发-USB虚拟串口
  • 他把智能科技引入现代农业领域
  • ingress-nginx代理tcp使其能外部访问mysql
  • 麒麟操作系统服务架构保姆级教程(十三)tomcat环境安装以及LNMT架构
  • 亚博microros小车-原生ubuntu支持系列:4-手部检测
  • 关于回调函数(callback)
  • Linux Bash 中使用重定向运算符的 5 种方法
  • 硬件作品3----STM32F103RCT6最小系统板MCU配置
  • 人脸识别打卡系统--基于QT(附源码)
  • 【深度学习入门】深度学习知识点总结
  • 通过视觉语言模型蒸馏进行 3D 形状零件分割
  • 机器学习10-解读CNN代码Pytorch版
  • 微服务学习-Gateway 统一微服务入口
  • 2025寒假备战蓝桥杯02---朴素二分查找升级版本的学习+分别求解左右端点