Mongodb 通量串联不返回

Mongodb 通量串联不返回,mongodb,spring-boot,spring-data-mongodb,reactive,spring-webflux,Mongodb,Spring Boot,Spring Data Mongodb,Reactive,Spring Webflux,我正在试验SpringBoot2.0、webflux和reactiv Mongo存储库。我有两种方法,首先删除数据,然后向集合中添加数据。在第一个变量中,线程阻塞直到删除完成,在第二个变量中,数据的添加连接到删除 变体A @GetMapping("init") public String init() { Random rand = new Random(); Flux<Power> powers = Flux.range(0, 10000)

我正在试验SpringBoot2.0、webflux和reactiv Mongo存储库。我有两种方法,首先删除数据,然后向集合中添加数据。在第一个变量中,线程阻塞直到删除完成,在第二个变量中,数据的添加连接到删除

变体A

@GetMapping("init")
public String init() {
    Random rand = new Random();
    Flux<Power> powers = Flux.range(0, 10000)
            .map(i -> new Power(i,
                    LocalDateTime.now().toEpochSecond(ZoneOffset.of("+1")),
                    rand.nextDouble()));
    powerRepository.deleteAll().block();
    powerRepository.save(powers).blockLast();
    return "ok";
}
@GetMapping(“init”)
公共字符串init(){
Random rand=新的Random();
通量功率=通量范围(0,10000)
.map(i)->新电源(i,
LocalDateTime.now().Toepochssecond(ZoneOffset.of(“+1”)),
rand.nextDouble());
powerRepository.deleteAll().block();
powerRepository.save(powers.blockLast();
返回“ok”;
}
变体B

@GetMapping("init")
public String init() {
    Random rand = new Random();
    Flux<Power> powers = Flux.range(0, 10000)
            .map(i -> new Power(i,
                    LocalDateTime.now().toEpochSecond(ZoneOffset.of("+1")),
                    rand.nextDouble()));
    powerRepository.deleteAll()
            .concatWith((v) -> powerRepository.save(powers)).blockLast();
    return "ok";
}
@GetMapping(“init”)
公共字符串init(){
Random rand=新的Random();
通量功率=通量范围(0,10000)
.map(i)->新电源(i,
LocalDateTime.now().Toepochssecond(ZoneOffset.of(“+1”)),
rand.nextDouble());
powerRepository.deleteAll()
.concatWith((v)->powerRepository.save(powers)).blockLast();
返回“ok”;
}

变量A返回,变量B不返回。有什么区别?组合两个存储库操作的正确方法是什么

使用链。如果没有更好的方法,则调用。避免阻塞调用,而是返回Mono.just(“ok”)

public Mono init(){
返回repo.deleteAll()
。然后(()->回购保存(…)
然后(()->Mono.just(“ok”);
}

使端点返回Mono

基本上是格雷格写的。差异是由于发出值:
deleteAll()
在执行
deleteAll
期间终止,而不发出值并连接结果。Concat在执行父发布服务器时执行,这可能会导致不期望的行为。通常,返回反应类型(
Mono
Flux
),而不是解析类型(
String
),以保留反应行为。否则,仍然会阻止调用线程。Spring WebFlux为您处理执行。如果需要保存实体列表,请将Flux返回为响应类型并使用。然后是many(()->repo.save(powers))。然后是many(()->Flux.just(“ok”))
public Mono<String> init() {
    return repo.deleteAll()
        .then(() -> repo.save(...))
        .then(() -> Mono.just("ok"));
}