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 和业务线程就不用相互等待了。