网站首页 > java教程 正文
背景
I/O阻塞浪费系统性能,因此为了应对 高并发环境下 的服务端编程,微软提出了一个实现 异步编程 的方案 - Reactive Programming,即响应式编程,通过异步非阻塞处理发挥系统的性能,提升系统的吞吐量;各个语言也跟进推出了自己的响应式框架,而Reactor做为java重要的一款响应式框架也就此诞生。
Reactive Streams、Reactor和WebFlux
- Reactive Streams 是一套响应式编程标准和规范;
- Reactor 是基于 Reactive Streams 一套反应式编程框架;
- WebFlux 以 Reactor 为基础,实现 Web 领域的反应式编程框架。
从上面看的reactor是基础,所以理解reactor的核心思想十分重要。Reactor 框架主要有两个主要的模块: reactor-core reactor-ipc
前者主要负责 Reactive Programming 相关的核心API 实现,后者负责 高性能网络通信 的实现。其实,对于业务开发人员来说,当编写响应式代码时,通常只会接触到 Publisher 这个接口,对应到 Reactor 便是 Mono 和 Flux。本文主要通过一个小例子给大家展示下reactor-core的原理。
代码
reactor-core中有三个重要的接口,分别表示发布者、订阅者,还有订阅关系。
public interface Publisher<T> {
void subscribe(Subscriber<? super T> var1);
}
public interface Subscriber<T> {
void onSubscribe(Subscription var1);
void onNext(T var1);
void onError(Throwable var1);
void onComplete();
}
public interface Subscription {
void request(long var1);
void cancel();
}
整个工作流程是这样的。
- 发布者调用subscribe,该方法接受一个订阅者作为参数,在这个方法里面,发布者会创建一个订阅关系。该订阅关系会维持对应的订阅者从发布者获取数据的状态。
- 发布者调用订阅者提供的onSubscribe,该方法会接受上面的订阅关系为参数
- 订阅者的onSubscribe方法,会调用订阅关系的request方法,该方法会从发布者获取数据,然后逐一的调用订阅者的onNext方法处理获取的元素,所有元素都获得了,便调用onComplete, 当元素为空时,调用onError方法。
然后我们看一个小例子
public static void main(String[] args) {
Flux.just("red", "white", "blue")
.log()
.map(String::toUpperCase)
.subscribe(System.out::println);
}
上面的整个过程第2行调用Flux.just会创建一个FluxArray,FluxArray是一种Flux,
然后第4行调用map方法会创建一个FluxMapFuseable,它也是个Flux.同时它保存了FluxArray的引用。
然后第5行调用subscribe方法,它会创建LamdaSubscriber,同时会调用FluxMapFuseable的subscribeOrReturn,获得一个CoreSubscriber(它保存了map的操作),此时如下面的第三个图,然后调用它的OnNext方法把每个元素变成大写。然后又调用LamdaSubscriber的OnNext方法进行元素输出。
猜你喜欢
- 2024-09-10 感动哭了!《Java 编程思想》最新中文版开源
- 2024-09-10 Java编程思想---对象介绍---参数化类型(泛型)
- 2024-09-10 《JAVA编程思想》5分钟速成:第15章(泛型)
- 2024-09-10 Java基础学习带你了解面向对象的编程思想
- 2024-09-10 Java编程思想——对象介绍——抽象过程
- 2024-09-10 Java编程思想---对象介绍---并发编程
- 2024-09-10 Java编程思想——并发(java并发编程实践和并发编程实战)
- 2024-09-10 Java编程思想:抽象类和方法(java抽象方法是什么)
- 2024-09-10 Java编程思想---万物皆是对象---以引用来操作对象
- 2024-09-10 Java编程思想:我们的第一个 Java 程序
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)