java reactor 响应式编程

Spring framework 5 的一大新特性:响应式编程(Reactive Programming)。

 

响应式编程就是基于reactor的思想,当你做一个带有一定延迟的才能够返回的io操作时,不会阻塞,而是立刻返回一个流,并且订阅这个流,当这个流上产生了返回数据,可以立刻得到通知并调用回调函数处理数据。

Flux: 注册一个io 并向其中发送数据,支持 ,Object ,List<T>, io,和定时功能,

//创建一个流,并直接往流上发布一个值为value数据
Flux.just(value);

//通过list创建一个流,往流上依次发布list中的数据
Flux.fromIterable(list);

//创建一个流,并向流上从i开始连续发布n个数据,数据类型为Integer
Flux.range(i, n);

//创建一个流,并定时向流上发布一个数据,数据从0开始递增,数据类型为Long
Flux.interval(Duration.ofSeconds(n));

Flux: 还支持对中的数据进行处理,返回回为其它对象。

    @Test
    public void testJust() {
        String body = "hello";
        Flux<String> just = Flux.just(body, "world").map(s -> {
            String s1 = s.toUpperCase(Locale.ROOT);
            try {

              //  throw new RuntimeException("test");

            } catch (Exception e) {
                e.printStackTrace();
            }
            return s1;
        });

        just.subscribe(System.out::println,
                e -> e.printStackTrace(),
                () ->{
                    System.out.println(11);
                });

    }

Subscriber 

subscriber是一个订阅者,当数据处理完时 会调用subscriber 方法。主要有以下三个重载方法可供选择。



    public final Disposable subscribe(Consumer<? super T> consumer) {
        Objects.requireNonNull(consumer, "consumer");
        return this.subscribe(consumer, (Consumer)null, (Runnable)null);
    }

    public final Disposable subscribe(@Nullable Consumer<? super T> consumer, Consumer<? super Throwable> errorConsumer) {
        Objects.requireNonNull(errorConsumer, "errorConsumer");
        return this.subscribe(consumer, errorConsumer, (Runnable)null);
    }

    public final Disposable subscribe(@Nullable Consumer<? super T> consumer, @Nullable Consumer<? super Throwable> errorConsumer, @Nullable Runnable completeConsumer) {
        return this.subscribe(consumer, errorConsumer, completeConsumer, (Consumer)null);
    }

以上只是TEST,

flux在 web项目中也很有用途

    public Mono<ServerResponse> flux(ServerRequest request) {
        Person person1 = new Person("John");
        Person person2 = new Person("Jane");
        return ServerResponse.ok().body(
                fromPublisher(Flux.just(person1, person2), Person.class));
    }


	public Mono<Void> handle(ServerHttpRequest request, ServerHttpResponse response) {
		DataBuffer buffer = response.bufferFactory().allocateBuffer(body.length);
		buffer.write(body);
		return response.writeAndFlushWith(Flux.just(Flux.just(buffer)));
	}
	

这样就将response 交给 spring去处理了,等业务处理完将数据放入到response对象中就可以了,这样workthred 和业务线程就不用相互等待了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值