02-Spring WebFlux Flux和Mono构建响应式数据流

在上一节入门课程中,我们知道 SpringWebFlux 是借助Reactor来实现的。该框架实现了响应式流规范。我们知道在响应式流规范中,存在代表发布者的 Publisher 接口,而 Reactor 提供了这一接口的两种实现,即 Flux 和 Mono,它们是我们利用 Reactor 框架进行响应式编程的基础组件。
接下来就简单介绍如何使用这两种实现来创建响应式数据流。

1. Flux 代表的是一个包含 0 到 n 个元素的异步序列

创建 Flux 的方式非常多,大体可以分成两大类,一类是基于各种工厂模式的静态创建方法,而另一类则采用编程的方式动态创建 Flux。相对而言,静态方法在使用上都比较简单,但不如动态方法来得灵活。我们来一起看一下。
所谓的静态方法形式的如 just()、error()、interval() 等等。动态方式就是通过编程的方式来构建数据流。

1.1 just()

示例:

public static void test_01(){
	Flux.just(1,2,3).subscribe(System.out::println);
}

写法非常简单 just接收的是一个可变长参数,其实生成的就是3个整数的元素序列。subscribe方法是订阅的意思也就是消费元素的下游方法,这个后面在说。

1.2 fromXxx()

在这里插入图片描述

1.2.1 from(Publisher source)

示例:

    public static void test_02(){

        Flux.from(subscriber->{
            subscriber.onNext(1);
            subscriber.onNext(2);
            subscriber.onNext(3);
            subscriber.onComplete();
        }).subscribe(System.out::println);
    }

测试结果如下:

1
2
3

这里的subscriber其实是一个订阅者对象,它是来消费消息的。对于Publisher 和 SubScriber两者的设计后面在深入。

1.2.2 fromIterable()

示例:

    public static void test_03(){

        Flux.fromIterable(Arrays.asList(1,2,3)).subscribe(System.out::println);

    }

后面这四个fromXXX方法都是类似的。通过一个集合或者可迭代对象或者一个流来创建元素序列。

1.3 range() 生成整数数据流

示例:

    public static void test_04(){

        Flux.range(0, 10).subscribe(System.out::println);

    }

1.4 interval() 周期性的生成连续的元素序列

示例:

    public static void test_05(){
        Flux.interval(Duration.ofMillis(2000), Duration.ofMillis(1000)).subscribe(System.out::println);
    }

还可以通过 empty()、error() 和 never() 等创建一些特殊的序列。

1.5 generate() 编程方式创建

示例:

 public static void test_06(){
     Flux.generate(sink->{
         sink.next(1);
         // 停止
         sink.complete();
     }).subscribe(System.out::println);

     Flux.generate(()->1, (i, sink)->{
         sink.next(i++);
         return i;
     }).subscribe(System.out::println);
 }

方法的定义如下:

public static <T> Flux<T> generate(Consumer<SynchronousSink<T>> generator)

generate 接收一个SynchronousSink 的消费者。这个类是用来生成数据流的。

  • next 生成一个元素, 只能调用一次。
  • complete 表示生成逻辑结束,如果不设置的话 默认会一直调用next方法生成元素。

而第二种重载方法,只不过多了一个状态管理。

1.6 create()

类似generate 不过使用的FluxSink 生成元素

public static <T> Flux<T> create(Consumer<? super FluxSink<T>> emitter)

示例:

    public static void test_07(){
        Flux.create(emitter->{
            emitter.next(1);
            emitter.next(2);
            emitter.complete();
        }).subscribe(System.out::println);
    }

注意这里的next 可以调用多次。

2 Mono 0或者1个元素

Mono 其实就是Flux的特殊形式,Flux中的部分方法Mono同样适用。这里简单示意一个。
示例

    public static void test_08(){

        Mono.create(monoSink -> {
            monoSink.success(1);
        }).subscribe(System.out::println);

    }

MonoSink 创建元素且只能创建一个。并没有complete等方法。

总结

本章只是简单介绍了如何利用Reactor的Mono和Flux实现构建一个异步数据流。只是简单的API的使用介绍,后期慢慢深入。

同时推荐大佬的文章,非常深入和透彻 。https://blog.csdn.net/get_set/article/details/79466657

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WebFluxSpring框架的一部分,它提供了一种响应式编程的方式来构建基于非阻塞I/O的应用程序。在WebFlux中,我们可以使用两种主要的数据类型:MonoFlux。 1. MonoMono是一种包含零个或一个元素的响应式流。它类似于Java 8中的Optional,但具有更多的操作符和功能。下面是一些使用Mono的示例: ```java Mono<String> mono = Mono.just("Hello"); // 创建一个包含单个元素的Mono mono.subscribe(System.out::println); // 订阅并打印元素 Mono<Integer> emptyMono = Mono.empty(); // 创建一个空的Mono emptyMono.subscribe(System.out::println); // 不会输出任何内容 Mono<String> errorMono = Mono.error(new RuntimeException("Error")); // 创建一个包含错误的Mono errorMono.subscribe(System.out::println, Throwable::printStackTrace); // 打印错误信息 ``` 2. FluxFlux是一种包含零个或多个元素的响应式流。它类似于Java 8中的Stream,但具有更多的操作符和功能。下面是一些使用Flux的示例: ```java Flux<String> flux = Flux.just("Hello", "World"); // 创建一个包含多个元素的Flux flux.subscribe(System.out::println); // 订阅并打印元素 Flux<Integer> emptyFlux = Flux.empty(); // 创建一个空的Flux emptyFlux.subscribe(System.out::println); // 不会输出任何内容 Flux<String> errorFlux = Flux.error(new RuntimeException("Error")); // 创建一个包含错误的Flux errorFlux.subscribe(System.out::println, Throwable::printStackTrace); // 打印错误信息 ``` 通过使用MonoFlux,我们可以在WebFlux中处理异步和非阻塞的操作,例如处理HTTP请求和响应。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值