by emanjusaka from ​ https://www.emanjusaka.top/archives/4 彼岸花开可奈何

本文欢迎分享与聚合,全文转载请留下原文地址。

前言

Reactor 是一个响应式编程的基础类库,其中有两个很关键的类:Flux 和 Mono。掌握这两个类和相关概念有助于我们学习响应式编程。

Flux 和 Mono 都是数据流的发布者,使用 Flux 和 Mono 都可以发出三种数据信号:元素值,错误信号,完成信号;错误信号和完成信号都代表终止信号,终止信号用于告诉订阅者数据流结束了,错误信号终止数据流同时把错误信息传递给订阅者。

一、Flux

具有 rx 运算符的响应式流发布器,发出 0 到 N 个元素,然后完成(成功或有错误)。

下图显示了 Flux 如何转换项目:

Flux是一个标准的Publisher,表示一个异步的0到N个发出的项目序列,可选择终止于完成信号或错误信号。根据Reactive Streams规范,这三种类型的信号转换为对下游Subscriber的onNext、onComplete和onError方法的调用。

由于可能出现的信号范围很大,Flux是通用的响应式类型。请注意,所有事件,包括终止事件,都是可选的:没有onNext事件但有onComplete事件表示一个空的有限序列,但如果去掉onComplete,则得到一个无限的空序列(除了用于取消测试之外,不是特别有用)。同样,无限序列不一定为空。例如,Flux.interval(Duration)会生成一个无限的Flux,从时钟发出定期的滴答声。Flux 是标准的 Publisher,它表示 0 到 N 个发出项的异步序列,可以选择由完成信号或错误终止。与 Reactive Streams 规范中一样,这三种类型的信号转换为对下游订阅者的 onNext、onComplete 和 onError 方法的调用。

凭借如此大范围的可能信号,Flux 是通用的无功类型。请注意,所有事件,甚至终止事件,都是可选的:没有 onNext 事件,但 onComplete 事件表示一个空的有限序列,但删除 onComplete 并且您有一个无限的空序列(不是特别有用,除了围绕取消的测试)。同样,无限序列不一定是空的。例如, Flux.interval(Duration) 生成无限的 Flux 并从时钟发出规则的滴答声。

二、Mono

具有基本 rx 运算符的 Reactive Streams Publisher 通过 onNext 信号最多发出一项,然后以 onComplete 信号终止(成功的 Mono,有或没有值),或者仅发出单个 onError 信号(失败的 Mono)。

下图显示了 Mono 如何转换项目:

Mono是一种特殊的Publisher,通过onNext信号发出最多一个项目,然后通过onComplete信号终止(成功的Mono,有或没有值),或者只发出一个onError信号(失败的Mono)。

大多数Mono实现在调用onNext后立即调用其Subscriber的onComplete。Mono.never()是一个例外:它不发出任何信号,在技术上并不禁止,但在测试之外没有太大用处。另一方面,明确禁止使用onNext和onError的组合。

Mono只提供了Flux可用的操作符的子集,而某些操作符(特别是将Mono与另一个Publisher组合的操作符)会切换到Flux。例如,Mono#concatWith(Publisher)返回一个Flux,而Monothen(Mono)返回另一个Mono。

请注意,您可以使用Mono来表示只有完成概念的无值异步过程(类似于Runnable)。要创建一个,您可以使用一个空的Mono。

三、代码示例

  1. 创建一个Flux,发出一系列字符串元素并订阅打印出来:

    package top.emanjusaka;
    import reactor.core.publisher.Flux;
    public class Main {
    public static void main(String[] args) {
    Flux<String> flux = Flux.just("Hello", "emanjusaka", "!");
    flux.subscribe(System.out::println);
    }
    } // 输出
    Hello
    emanjusaka
    !
  2. 创建一个Mono,发出一个字符串元素并订阅打印出来:

    package top.emanjusaka;
    import reactor.core.publisher.Mono;
    public class Main {
    public static void main(String[] args) {
    Mono<String> mono = Mono.just("Hello");
    mono.subscribe(System.out::println);
    }
    } // 输出
    Hello
  3. 使用Flux的操作符进行元素转换和过滤:

    package top.emanjusaka;
    
    import reactor.core.publisher.Flux;
    
    public class Main {
    public static void main(String[] args) {
    Flux<Integer> numbers = Flux.range(1, 10);
    numbers.map(num -> num * 2)
    .filter(num -> num % 3 == 0)
    .subscribe(System.out::println);
    }
    } // 输出
    6
    12
    18
  4. 使用Mono的操作符进行元素转换和错误处理:

    package top.emanjusaka;
    
    import reactor.core.publisher.Mono;
    
    public class Main {
    public static void main(String[] args) {
    Mono<Integer> number = Mono.just(5);
    number.map(num -> num * 2)
    .doOnError(Throwable::printStackTrace)
    .subscribe(System.out::println);
    }
    } // 输出
    10

四、总结

Flux 和 Mono 都是位于 reactor.core.publisher包下的类。

Reactor中的Flux和Mono是用于实现响应式编程的两种基本类型:

  1. Flux:表示一个异步序列,可以发出0到N个项目。它可以终止于完成信号或错误信号。Flux适用于处理多个项目的情况,可以使用各种操作符来处理和转换序列。
  2. Mono:表示一个异步序列,最多发出一个项目。它要么终止于完成信号(有或没有值),要么只发出一个错误信号。Mono适用于处理单个项目的情况,也可以使用一些操作符来处理和转换序列。

这两种类型都是Publisher的实现,遵循Reactive Streams规范,并可以与其他响应式库和框架进行互操作。

Flux和Mono都可以表示无限序列,也可以表示空序列。它们提供了丰富的操作符来处理和转换序列,例如映射、过滤、合并、扁平化等。此外,它们还支持异步和并发处理,可以与其他操作符和操作进行组合使用。

总的来说,Flux适用于处理多个项目的情况,而Mono适用于处理单个项目的情况。它们是Reactor中用于实现响应式编程的基本类型,提供了丰富的操作符和功能来处理和转换异步序列。

五、参考文献

  1. 《Reactor》参考文档

本文原创,才疏学浅,如有纰漏,欢迎指正。尊贵的朋友,如果本文对您有所帮助,欢迎点赞,并期待您的反馈,以便于不断优化。

原文地址: https://www.emanjusaka.top/archives/4

微信公众号:emanjusaka的编程栈

响应式编程——初识 Flux 和 Mono的更多相关文章

  1. 学习响应式编程 Reactor (3) - reactor 基础

    Reactor Reactor 项目的主要 artifact 是 reactor-core,这是一个基于 Java 8 的实现了响应式流规范的响应式库. Reactor 提供了实现 Publisher ...

  2. 学习响应式编程 Reactor (2) - 初识 reactor

    Reactor Reactor 是用于 Java 的异步非阻塞响应式编程框架,同时具备背压控制的能力.它与 Java 8 函数式 Api 直接集成,比如 分为CompletableFuture.Str ...

  3. springboot2 webflux 响应式编程学习路径

    springboot2 已经发布,其中最亮眼的非webflux响应式编程莫属了!响应式的weblfux可以支持高吞吐量,意味着使用相同的资源可以处理更加多的请求,毫无疑问将会成为未来技术的趋势,是必学 ...

  4. 响应式编程系列(一):什么是响应式编程?reactor入门

    响应式编程 系列文章目录 (一)什么是响应式编程?reactor入门 (二)Flux入门学习:流的概念,特性和基本操作 (三)Flux深入学习:流的高级特性和进阶用法 (四)reactor-core响 ...

  5. (转)Spring Boot 2 (十):Spring Boot 中的响应式编程和 WebFlux 入门

    http://www.ityouknow.com/springboot/2019/02/12/spring-boot-webflux.html Spring 5.0 中发布了重量级组件 Webflux ...

  6. Spring Boot 2 (十):Spring Boot 中的响应式编程和 WebFlux 入门

    Spring 5.0 中发布了重量级组件 Webflux,拉起了响应式编程的规模使用序幕. WebFlux 使用的场景是异步非阻塞的,使用 Webflux 作为系统解决方案,在大多数场景下可以提高系统 ...

  7. springboot(二十三)Springboot2.X响应式编程

    序言 Spring WebFlux是Spring Framework 5.0中引入的新的反应式Web框架与Spring MVC不同,它不需要Servlet API,完全异步和非阻塞,并 通过React ...

  8. SpringBoot使用WebFlux响应式编程操作数据库

    这一篇文章介绍SpringBoot使用WebFlux响应式编程操作MongoDb数据库. 前言 在之前一篇简单介绍了WebFlux响应式编程的操作,我们在来看一下下图,可以看到,在目前的Spring ...

  9. [转]springboot2 webflux 响应式编程学习路径

    原文链接 spring官方文档 springboot2 已经发布,其中最亮眼的非webflux响应式编程莫属了!响应式的weblfux可以支持高吞吐量,意味着使用相同的资源可以处理更加多的请求,毫无疑 ...

  10. 【SpringBoot】SpringBoot2.0响应式编程

    ========================15.高级篇幅之SpringBoot2.0响应式编程 ================================ 1.SprinBoot2.x响应 ...

随机推荐

  1. web自动化03-xpath定位

      目标: Xpath方法   1.定位一组元素的方法   element = driver.find_elements_by_*("*")      * 可以是name,tag_ ...

  2. 癌症中克隆种群结构统计推断分析软件PyClone安装小记

    由于微信不允许外部链接,你需要点击文章尾部左下角的 "阅读原文",才能访问文中链接. PyClone 是一种用于推断癌症中克隆种群结构的统计模型. 它是一种贝叶斯聚类方法,用于将深 ...

  3. CSS 图片加载提前占位 padding-top、padding-bottom

    今天聊一个图片加载提前占位的一个问题 ,内容比较适合初学者. 起因 在响应式页面当中,图片加载之前是不知道图片高度的,加载成功图片完全撑开.如果不做提前占位会把下面的内容挤下去,页面出现抖动,就像下面 ...

  4. 尚医通day01-【项目环境搭建和医院设置详细步骤】(内附源码)

    第01章-项目介绍 1.课程介绍 项目名称:尚医通预约挂号统一平台 项目原型:https://www.114yygh.com 北京市预约挂号统一平台 项目技术栈:前后端分离 后端技术:SpringBo ...

  5. auto main()-> int的含义是什么?

    42 https://stackoverflow.com/questions/21085446/what-is-the-meaning-of-auto-main-int/21085530   C++1 ...

  6. 如何刷新 DNS 缓存 (macOS, Linux, Windows)

    如何刷新 DNS 缓存 (macOS, Linux, Windows) Unix Linux Windows 如何刷新 DNS 缓存 (macOS, FreeBSD, RHEL, CentOS, De ...

  7. [渗透测试]—7.1 漏洞利用开发和Shellcode编写

    在本章节中,我们将学习漏洞利用开发和Shellcode编写的基本概念和技巧.我们会尽量详细.通俗易懂地讲解,并提供尽可能多的实例. 7.1 漏洞利用开发 漏洞利用开发是渗透测试中的高级技能.当你发现一 ...

  8. Python 一大坑,配置文件中字典引用问题(拷贝)。

    大坑 +1 python 配置文件中字典引用问题 最近在开发系统时发现一个传奇的BUG, 用户未登录就可进入系统内,而且含有真实身份信息. 此问题困扰多时,反复debug.由于找不到问题原因,复现具有 ...

  9. Java批量操作Excel文件实践

    摘要:本文由葡萄城技术团队于博客园原创并首发.转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 前言 | 问题背景 在操作Excel的场景中,通常会有一些针对 ...

  10. Nginx获取用户真实IP

    Nginx获取用户真实IP地址 本人在一次项目中,使用Nginx需要获取到用户IP,本来可以很常规的获取的,可现实往往不常规,项目是前后端分离的,部署时,前端使用了Nginx进行了代理并转发,后端也使 ...