spring boot 2.1学习笔记【十六】SpringBoot 2.1 集成 响应式 MongoDB reactice

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;

文章目录

  • 集成响应式的MongoDB
  • 实时监控获取DB变更

spring boot 2.1学习笔记【十五】SpringBoot 2.1 WebFlux介绍了springboot webflux的使用, spring boot 2.1学习笔记【十三】SpringBoot 2 集成MongoDB介绍了集成MongoDB。那么本篇介绍如何 使用webflux的方式访问MongoDB

集成响应式的MongoDB

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变更

前面文章介绍了服务器端推送,本文介绍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;

你可能感兴趣的:(spring,boot,2.X/spring,cloud,Greenwich)