springboot系列学习笔记全部文章请移步值博主专栏**: spring boot 2.X/spring cloud Greenwich。
由于是一系列文章,所以后面的文章可能会使用到前面文章的项目。springboot系列代码全部上传至GitHub:https://github.com/liubenlong/springboot2_demo
本系列环境:Java11;springboot 2.1.1.RELEASE;springcloud Greenwich.RELEASE;MySQL 8.0.5;
springboot 本身提供了cassandra/couchbase/mongodb/redis
这几个NoSQL数据库的响应式驱动:
阻塞是的spring-boot-starter-data-mongodb 改为响应式的mongodb依赖spring-boot-starter-data-mongodb-reactive
:
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-mongodb-reactiveartifactId>
dependency>
之前的Repository是继承的MongoRepository类。这里改为响应式的ReactiveMongoRepository
:
public interface StuRepository extends ReactiveMongoRepository<Stu, Long> {
}
编写controller,该controller中都是异步响应式
的编程风格:
@RestController
public class MyController {
@Autowired
private StuRepository stuRepository;
/**
* 最简单的webflux程序
*
* @return
*/
@GetMapping("/hello")
public Mono<String> hello1() {
return Mono.just("Welcome to reactive world ~");
}
@GetMapping("/save")
public Mono<Stu> save() {
return stuRepository.save(Stu.builder().name("赵六").age(12).build());
}
@GetMapping("/findAll")
public Flux<Stu> findAll() {
return stuRepository.findAll();
}
@GetMapping("/findOne")
public Flux<Stu> find1() {
Example<Stu> e = Example.of(Stu.builder().name("张三").build());
return stuRepository.findAll(e);
}
/**
* 以stream+json流的方式推送到客户端
* @return
*/
@GetMapping(value = "/findAllPreSec", produces = MediaType.APPLICATION_STREAM_JSON_VALUE)
public Flux<Stu> findAllPreSec() {
return stuRepository.findAll().delayElements(Duration.ofSeconds(1));
}
}
比较简单,自行运行服务即可。
这里单独说一下findAllPreSec这个方法。使用了delayElements使得每隔一秒钟获取一条数据发送给客户端,以“异步响应式流”
的方式逐条推送。这里指定了MediaType是APPLICATION_STREAM_JSON
,即application/stream+json
格式。
在浏览器中就可以看到每隔一秒出现一条记录。
总结:到此为止,我们从HttpServer(如Netty或Servlet3.1以上的Servlet容器)到ServerAdapter(Spring WebFlux框架提供的针对不同server的适配器),到我们编写的Controller和DAO,以及异步数据库驱动,构成了一个完整的异步非阻塞的管道,里边流动的就是响应式流。
前面文章介绍了服务器端推送,本文介绍DB的变更可以实时的推送到前端。有一些业务比如日志展示等需要类似的需求。
在StuRepository中编写监控DB变更的方法,需要使用@Tailable
注解,该注解类似于Linux中的tail
,可以将DB的变化以响应式流的方式获取到并推送给前端。
public interface StuRepository extends ReactiveMongoRepository<Stu, Long> {
//@Tailable注解的作用类似于linux的tail命令,被注解的方法将发送无限流
@Tailable
Flux<Stu> findBy();
}
controller中添加:
@GetMapping(path = "getStusUnlimited", produces = MediaType.APPLICATION_STREAM_JSON_VALUE)//produces生产者是一个数据流
public Flux getStusUnlimited() {
return this.stuRepository.findBy();
}java
运行程序,访问getStusUnlimited接口,然后测试调用save接口添加stu数据,或者直接通过MongoDB Compass客户端添加Stu数据,就会看到在页面中实时看到新添加的数据了。
springboot系列学习笔记全部文章请移步值博主专栏**: spring boot 2.X/spring cloud Greenwich。
由于是一系列文章,所以后面的文章可能会使用到前面文章的项目。springboot系列代码全部上传至GitHub:https://github.com/liubenlong/springboot2_demo
本系列环境:Java11;springboot 2.1.1.RELEASE;springcloud Greenwich.RELEASE;MySQL 8.0.5;