响应式流
Java 9 新引入了Reactive Stream(响应式流),而应用了响应式流的编程即为响应式编程
Reactive Stream标准:异步的流处理,并支持非阻塞式的 backpressure(背压? 很拗口的翻译,就是生产者与消费者之者应有流量控制)
既然 Reactive Stream 和 Java 8 引入的 Stream 都叫做流,它们之间有什么关系呢?有一点关系,Java 8 的 Stream 主要关注在流的过滤,映射,合并,而 Reactive Stream 更进一层,侧重的是流的产生与消费,即流在生产与消费者之间的协调
2015 年,正式的 Reactive Stream 出台,发布在http://www.reactive-streams.org/
实现了Reactive Stream标准的有
- Akka Streams(1.0-RC2)
- MongoDB (1.0.0)
- Ratpack (0.9.16), 可用来创建非阻塞式 HTTP 应用
- Reactive Rabbit (1.0.0), Rabiit MQ /AMQP 的驱动
- Reactor (Spring 5 的响应式 MVC 就是用的它)
- RxJava (1.0.0), Netflix 出品
- Slick (3.0.0), Scala 的函数式关系映射组件,用于操作 数据库
- Vert.x 3.0 (milestone-5a), Ecl ip se 出品,也能用于构建非阻塞式 HTTP 应用
- Java 9 Reactive Streams Flow API ,
所以引入了Spring 5的已经可以开始使用了,不必将项目升级为Java 9支持
参考:http://ju.outofmemory.cn/entry/360633
webflux学习demo
Handler:
package com.jesse.reactiveWebDemo.handler;
import com.jesse.reactiveWebDemo.domain.Man;
import com.jesse.reactiveWebDemo.repository.ManMongoRepository;
import org.bson.types.ObjectId;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.BodyInserters;
import org.springframework.web.reactive.function.server.ServerRequest;
import org.springframework.web.reactive.function.server.ServerResponse;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;
/**
* ServerResponse 是对响应的封装,可以设置响应状态、响应头、响应正文。
* 比如 ok 代表的是 200 响应码、MediaType 枚举是代表这文本内容类型、返回的是 String 的对象。
* <p>
* 这里用 Mono 作为返回对象,是因为返回包含了一个 ServerResponse 对象,而不是多个元素。
*/
@Component
public class HelloHandler {
// @Autowired
// ManRepository manRepository;
@Autowired
ManMongoRepository manMongoRepository;
public Mono<ServerResponse> hello(ServerRequest request) {
return ServerResponse.ok().contentType(MediaType.TEXT_PLAIN)
.body(BodyInserters.fromObject("Hello, my lover!"));
}
public Mono<Man> save(Man man) {
return manMongoRepository.save(man);
}
public Mono<Man> findCityById(ObjectId id) {
return manMongoRepository.findById(id);
}
public Flux<Man> findAllCity() {
return manMongoRepository.findAll();
}
}
Router
@Configuration
public class HelloRouter {
@Bean
public RouterFunction<ServerResponse> route(HelloHandler cityHandler) {
BinaryOperator<Long> binaryOperator = (Long x, Long y) -> x + y;
return RouterFunctions
.route(RequestPredicates.GET("/save")
.and(RequestPredicates.accept(MediaType.TEXT_PLAIN)),
cityHandler::hello);
}
}
由于mysql不支持异步型的事务,所以无法使用webflux
故这里用了mongodb作为实例