当前位置:首页 > 科技  > 软件

新一代WebFlux框架核心技术Reactor响应式编程基本用法

来源: 责编: 时间:2023-11-28 09:36:27 306观看
导读环境:projectreactor2020.0.141. 前言在响应式编程中,Project Reactor提供了两个核心的概念:Mono和Flux。Mono和Flux都是Reactor中的Publisher,它们可以产生并发布数据,然后可以被订阅和消费。这两个概念在WebFlux中有着广

环境:projectreactor2020.0.14

v6k28资讯网——每日最新资讯28at.com

1. 前言

在响应式编程中,Project Reactor提供了两个核心的概念:Mono和Flux。Mono和Flux都是Reactor中的Publisher,它们可以产生并发布数据,然后可以被订阅和消费。这两个概念在WebFlux中有着广泛的应用,帮助我们实现异步和非阻塞的编程模型。v6k28资讯网——每日最新资讯28at.com

在这个主题中,我们将深入探讨Mono和Flux的基本使用。我们将了解它们如何被创建,如何订阅它们的事件,以及如何处理错误和完成通知。通过学习这些内容,你将能够更好地理解WebFlux的响应式编程模型,并能够在你的项目中有效地使用Mono和Flux。v6k28资讯网——每日最新资讯28at.com

让我们开始吧!v6k28资讯网——每日最新资讯28at.com

2. 环境依赖

<dependency>  <groupId>io.projectreactor</groupId>  <artifactId>reactor-core</artifactId></dependency><dependencyManagement>  <dependencies>    <dependency>      <groupId>io.projectreactor</groupId>      <artifactId>reactor-bom</artifactId>      <version>${reactor.version}</version>      <type>pom</type>      <scope>import</scope>    </dependency>  </dependencies></dependencyManagement>

3. Mono & Flux介绍

Flux

Flux表示了0到N个元素序列,下图展示了Flux如何转换元素v6k28资讯网——每日最新资讯28at.com

FluxFluxv6k28资讯网——每日最新资讯28at.com

一个Flux<T>是一个标准的Publisher<T>,它表示一个由0到N个发射项目组成的异步序列,可选地由一个完成信号或一个错误终止。在响应式流规范中,这三种类型的信号转换为对下游订阅者的onNext、onComplete和onError方法的调用。v6k28资讯网——每日最新资讯28at.com

由于可能信号的范围很大,Flux是通用的反应式类型。请注意,所有事件,甚至是终止事件,都是可选的:只有onComplete事件才能表示一个空的有限序列,但删除onComplete事件就会得到一个无限的空序列(没什么用处,除了关于取消的测试)。类似地,无限序列不一定是空的。例如,Flux.interval(Duration)产生一个无限长的Flux<Long>,并从时钟发出规则的时标。v6k28资讯网——每日最新资讯28at.com

Mono

Mono表示了0个或1个元素序列,下图展示了Mono如何转换元素v6k28资讯网——每日最新资讯28at.com

图片图片v6k28资讯网——每日最新资讯28at.com

Monov6k28资讯网——每日最新资讯28at.com

v6k28资讯网——每日最新资讯28at.com

Mono<T>是一个专门的发布者<T>,它通过onNext信号发出最多一个项目,然后以onComplete信号终止(Mono成功,有或没有值),或只发出一个onError信号(Mono失败)。v6k28资讯网——每日最新资讯28at.com

大多数Mono实现都希望在调用onNext之后立即对其订阅者调用onComplete。Mono.never()是一个异常值:它不会发出任何信号,这在技术上并没有被禁止,但在测试之外并不是特别有用。另一方面,onNext和onError的组合是明确禁止的。v6k28资讯网——每日最新资讯28at.com

Mono只提供了可用于` Flux `的操作符子集,有些操作符(特别是那些将Mono与另一个`Publisher`结合的操作符)会切换到`Flux`。例如,Mono#concatWith(Publisher)返回一个Flux,而Mono#then(Mono)返回另一个Mono。v6k28资讯网——每日最新资讯28at.com

注意,你可以使用Mono来表示只有完成概念的无值异步进程(类似于Runnable)。要创建一个,可以使用一个空的Mono<Void>。v6k28资讯网——每日最新资讯28at.com

4. Mono & Flux常用操作

Mono常用操作

  • 创建元素

Mono.just(T value)方法:创建一个包含指定值的Mono对象。v6k28资讯网——每日最新资讯28at.com

Mono.just(10).subscribe(System.out::println) ;

Mono.empty()方法:创建一个空的Mono对象,即不包含任何元素。v6k28资讯网——每日最新资讯28at.com

Mono.justOrEmpty(T value)方法:如果指定值不为null,则创建一个包含该值的Mono对象;否则创建一个空的Mono对象。v6k28资讯网——每日最新资讯28at.com

// 输出10Mono.justOrEmpty(10).subscribe(System.out::println) ;// 如果值为null,没有任何输出Mono.justOrEmpty(null).subscribe(System.out::println) ;

图片图片v6k28资讯网——每日最新资讯28at.com

Mono.fromCallable(Callable<? extends T> supplier)方法:创建一个Mono对象,该对象包含通过调用给定Callable对象的call()方法得到的返回值。v6k28资讯网——每日最新资讯28at.com

// 通过Callable方式,我们可以在内部执行其它一些动作Mono.fromCallable(() -> 666).subscribe(System.out::println) ;

图片图片v6k28资讯网——每日最新资讯28at.com

Mono.fromSupplier(Supplier<? extends T> supplier)方法:创建一个Mono对象,该对象包含通过调用给定Supplier对象的get()方法得到的返回值。v6k28资讯网——每日最新资讯28at.com

Mono.fromSupplier(() -> 666).subscribe(System.out::println) ;

图片图片v6k28资讯网——每日最新资讯28at.com

Mono.fromFuture(CompletableFuture<? extends Integer> future)方法:创建一个Mono对象,该对象包含通过调用给定CompletableFuture对象v6k28资讯网——每日最新资讯28at.com

Mono.fromFuture(CompletableFuture.supplyAsync(() -> 666)).subscribe(System.out::println) ;

图片图片v6k28资讯网——每日最新资讯28at.com

  • 异常处理

下面这个示例完整的展示了当发生异常后的处理v6k28资讯网——每日最新资讯28at.com

public static Mono<Users> invoke(Mono<Users> user) {  return user.flatMap(u -> {    if ("admin".equals(u.getName())) {      return Mono.error(new RuntimeException("越权")) ;    }    u.setName(u.getName() + " - ");    return Mono.just(u) ;  });}public static void main(String[] args) {  invoke(Mono.just(new Users("admin")))    .doOnNext(System.out::println)    .doOnError(e -> {      System.out.println(e.getMessage()) ;    })    // .onErrorResume(e -> Mono.just(new Users(e.getMessage() + " - fallback"))) // 功能更强,可以对捕获的异常进行响应的处理,然后再返回一个值    .onErrorReturn(new Users("return")) // 捕获异常,简单粗暴直接返回一个静态值    .doOnNext(System.out::println)    .subscribe(); }
  • 执行结果
越权Users [name=return]
  • 错误操作符

图片图片v6k28资讯网——每日最新资讯28at.com

  • 错误返回操作符

图片图片v6k28资讯网——每日最新资讯28at.com

  • 连接操作符

将该Mono的发射与提供的发布者连接(不交错)。v6k28资讯网——每日最新资讯28at.com

Mono.just(10).concatWith(Mono.just(20)).subscribe(System.out::println) ;

图片图片v6k28资讯网——每日最新资讯28at.com

  • then操作符

该操作符是在当前Mono执行完成后切换到另外一个Mono。v6k28资讯网——每日最新资讯28at.com

Mono.just(10).doOnNext(System.out::println)  .then(Mono.just(666)) // 切换到另外一个Mono通道, 忽略之前的Mono元素  .doOnNext(System.out::println)  .subscribe();

图片图片v6k28资讯网——每日最新资讯28at.com

Flux常用操作

  • 创建元素

just():直接使用元素创建Flux,即在创建Flux时拿到数据,之后有谁订阅它,就重新发送数据给订阅者。v6k28资讯网——每日最新资讯28at.com

Flux.just(1, 2, 3...)

图片图片v6k28资讯网——每日最新资讯28at.com

fromArray()、fromIterable()和fromStream():可以从数组、Iterable对象或Stream对象中创建Flux对象。v6k28资讯网——每日最新资讯28at.com

Flux.fromArray(new String[]{"1","2","3"});Flux.fromIterable(List.of("a","b","c"));Flux.fromStream(List.of("a","b","c").stream());

fromArray

图片图片v6k28资讯网——每日最新资讯28at.com

fromIterable

图片图片v6k28资讯网——每日最新资讯28at.com

fromStream

图片v6k28资讯网——每日最新资讯28at.com

empty():创建一个不包含任何元素,只发布结束消息的序列。v6k28资讯网——每日最新资讯28at.com

图片图片v6k28资讯网——每日最新资讯28at.com

range(int start, int count):创建包含从start起始的count个数量的Integer对象的序列。v6k28资讯网——每日最新资讯28at.com

Flux.range(1, 10) ;

图片图片v6k28资讯网——每日最新资讯28at.com

  • 错误处理
Flux.error(new RuntimeException("错误")).onErrorResume(ex -> Mono.just("发生异常:" + ex.getMessage())).subscribe(System.out::println) ;

error操作符

图片图片v6k28资讯网——每日最新资讯28at.com

onErrorResume操作符

图片图片v6k28资讯网——每日最新资讯28at.com

  • when操作符将给定的Publisher<T>聚合成一个新的Mono,当所有给定的来源都完成时,这个Mono就会被满足。错误将导致未执行的结果被取消,并立即向返回的Mono发送错误。
Flux.just(1, 3, 6).flatMap(id -> {  Mono<Integer> query = Mono.fromSupplier(() -> {    System.out.println("查询数据...") ;    return id * 10 ;  }).delayElement(Duration.ofSeconds(2)) ;  Mono<String> save = Mono.fromSupplier(() -> {    System.out.println("保存数据...") ;    return "success - " + id ;  }) ;  return Mono.when(query, save) ;}).doOnComplete(() -> {  System.out.println("执行完成...") ;}).subscribe() ;

图片图片v6k28资讯网——每日最新资讯28at.com

  • filterWhen操作符
Flux.just(1,2,3,4,5,6).concatMap(item -> Mono.just(item).filterWhen(r -> {  return Mono.just(r % 2 == 0) ;})).subscribe(System.out::println) ;

图片图片v6k28资讯网——每日最新资讯28at.com

总之,Reactor中的Flux和Mono是响应式编程的核心组件,它们提供了丰富的操作符和方法来处理异步数据流。因此,对于使用WebFlux的开发者来说,掌握Reactor的使用是非常重要的。v6k28资讯网——每日最新资讯28at.com

完毕!!!v6k28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-34654-0.html新一代WebFlux框架核心技术Reactor响应式编程基本用法

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: RabbitMQ高级之失败重试机制(含源码)

下一篇: 不少人面试都挂在这道题了!你挂了吗?

标签:
  • 热门焦点
  • 影音体验是真的强 简单聊聊iQOO Pad

    大公司的好处就是产品线丰富,非常细分化的东西也能给你做出来,例如早先我们看到了新的vivo Pad2,之后我们又在iQOO Neo8 Pro的发布会上看到了iQOO的首款平板产品iQOO Pad。虽
  • 7月安卓手机好评榜:三星S23Ultra好评率第一

    性能榜和性价比榜之后,我们来看最后的安卓手机好评榜,数据来源安兔兔评测,收集时间2023年7月1日至7月31日,仅限国内市场。第一名:三星Galaxy S23 Ultra好评率:95.71%在即将迎来新
  • 2023年Q2用户偏好榜:12+256G版本成新主流

    3月份的性能榜、性价比榜和好评榜之后,就要轮到2023年的第二季度偏好榜了,上半年的新机潮已经过去,最明显的肯定就是大内存和存储的机型了,另外部分中端机也取消了屏幕塑料支架
  • CSS单标签实现转转logo

    转转品牌升级后更新了全新的Logo,今天我们用纯CSS来实现转转的新Logo,为了有一定的挑战性,这里我们只使用一个标签实现,将最大化的使用CSS能力完成Logo的绘制与动画效果。新logo
  • 把LangChain跑起来的三个方法

    使用LangChain开发LLM应用时,需要机器进行GLM部署,好多同学第一步就被劝退了,那么如何绕过这个步骤先学习LLM模型的应用,对Langchain进行快速上手?本片讲解3个把LangChain跑起来
  • Java NIO内存映射文件:提高文件读写效率的优秀实践!

    Java的NIO库提供了内存映射文件的支持,它可以将文件映射到内存中,从而可以更快地读取和写入文件数据。本文将对Java内存映射文件进行详细的介绍和演示。内存映射文件概述内存
  • 只需五步,使用start.spring.io快速入门Spring编程

    步骤1打开https://start.spring.io/,按照屏幕截图中的内容创建项目,添加 Spring Web 依赖项,并单击“生成”按钮下载 .zip 文件,为下一步做准备。请在进入步骤2之前进行解压。图
  • 首发天玑9200+ iQOO Neo8系列发布首销售价2299元起

    2023年5月23日晚,iQOO Neo8系列正式发布。其中,Neo系列首款Pro之作——iQOO Neo8 Pro强悍登场,限时售价3099元起;价位段最强性能手机iQOO Neo8同期上市
  • OPPO Reno10 Pro英雄联盟定制礼盒公布:萨勒芬妮同款配色梦幻十足

    5月24日,OPPO推出了全新的OPPO Reno 10系列,包含OPPO Reno10、OPPO Reno10 Pro和OPPO Reno10 Pro+三款新机,全系标配了超光影长焦镜头,是迄今为止拍照
Top