一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第5天,点击查看活动详情。
昨天玩了一下redis,今天我们来玩一下mongo。
搞配置
我们要操作mongo,所以需要mongo的支持,数据是从数据库查的,所以需要jdbc的支持,我们需要导入依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb-reactive</artifactId>
</dependency>
<dependency>
<groupId>org.joda</groupId>
<artifactId>joda-money</artifactId>
<version>1.0.1</version>
</dependency>
需要指定mongo的位置spring.data.mongodb.uri
搞代码
我们需要一个转换器,因为我们在mongo存的时候是存的是long类型,但取的时候我们要转换成money类型,这样方便我们后续进行操作。
所以,聪明的读者想到了,我们需要一个转换器convertor
public class MoneyReadConverter implements Converter<Long, Money> {
@Override
public Money convert(Long aLong) {
return Money.ofMinor(CurrencyUnit.of("CNY"), aLong);
}
}
public class MoneyWriteConverter implements Converter<Money, Long> {
@Override
public Long convert(Money money) {
return money.getAmountMinorLong();
}
}
这是SpringBoot MongoCustomConversions自定义转换类,我们把搞好的转换器放进去,转换的时候就能找到这两个转换器。
@Bean
public MongoCustomConversions mongoCustomConversions() {
return new MongoCustomConversions(
Arrays.asList(new MoneyReadConverter(),
new MoneyWriteConverter()));
}
搞了一个初始化的数据,两个种类的咖啡
然后把这两个数据,塞到我们的mongo中。
mongoTemplate.insertAll(initCoffee())
然后进行发布,发布执行publishOn方法
.publishOn(Schedulers.elastic())
接着会看到我们两个next操作的日志
.doOnNext(c -> log.info("Next: {}", c))
完成之后,我们执行一个ok
.doOnComplete(runnable)
这个任务就是打印个ok
() -> log.info("ok")
结束之后,把任务减1然后打印个最终日志
.doFinally(s -> {
cdl.countDown();
log.info("Finnally 1, {}", s);
})
然后我们进行一个数量统计
.count()
然后我们进行订阅,打印这个数量
.subscribe(c -> log.info("Insert {} records", c));
运行结果
和我说的一样吧,两个next之后是一个ok,当然你还可以调用别的方法,这里可以有非常多的实现可能,然后我们还看到这里是两个线程执行的:主线程和elastic线程。主线程主要是打印一个after starting日志,然后等待子线程任务完成,最后结束。
哈哈,是不是很简单,你学会了吗?