如何将2个Spring Mongo Reactive Save操作链接在一起?

时间:2018-04-19 21:06:01

标签: spring-webflux project-reactor spring-mongodb

我有一个测试用例,我试图从两个不同的服务中解除两个保存操作。两者都返回Mono(我没有使用Spring Reactive Repository)。

我想按顺序执行以下操作:

  1. 保存个人资料
  2. 创建特征并使用配置文件
  3. 进行更新
  4. 转换/保存特征(返回特征)
  5. 他们个人工作。当我尝试将它们中的两个链接在一起时,第二个操作会挂起,具体取决于我做什么(或者只是不触发)。

    我认为它被链接/订阅了第一个?

    Profile profile = new GenericProfile();
    
    Object o = profileService.saveProfile(profile)
        .log()
        .flatMap(pp -> {
            TrackingTrait trait = new TrackingTrait(
                "cid",
                "tid",
                pp.getId(),
                null,
                "h",
                "p",
                null);
            return Mono
                .just(trait)
                .log();
        })
        .doOnNext(n -> log.debug("1 {}", n.getProfileId()))
        .flatMap(tt -> this.trackingService
            .track(tt)
            .log())
        .doOnNext(n -> log.debug("2 {}", n.getProfileId()))
        .block();
    

    我的输出看起来像这样,它从未完成打印第二个日志语句(只是旋转)。

    [ INFO] reactor.Mono.FlatMap.1                   : | onSubscribe([Fuseable] MonoFlatMap.FlatMapMain)
    [ INFO] reactor.Mono.FlatMap.1                   : | request(unbounded)
    [ INFO] reactor.Mono.FlatMap.1                   : | onNext(io.logicdrop.profiles.services.GenericProfile@1a01ffff)
    [ INFO] reactor.Mono.Just.2                      : | onSubscribe([Synchronous Fuseable] Operators.ScalarSubscription)
    [ INFO] reactor.Mono.Just.2                      : | request(unbounded)
    [ INFO] reactor.Mono.Just.2                      : | onNext(tid)
    [DEBUG] i.l.analytics.AnalyticsPersistTest       : 1 5ad9ed16a29e0e2f82775a82
    [ INFO] reactor.Mono.FlatMap.3                   : | onSubscribe([Fuseable] MonoFlatMap.FlatMapMain)
    [ INFO] reactor.Mono.FlatMap.3                   : | request(unbounded)
    

1 个答案:

答案 0 :(得分:0)

神圣的废话 - 它看起来像Spring / Mongo处理索引与Reactive东西一样的错误。试图创建索引的第二次调用挂起了。

我偶然发现了Reactive mongo hangs with inheritance hierarchies defined in different gradle project

如果我使用此解决方法并删除所有索引注释(@Index和@CompoundIndex),至少从第二个DAO开始,它就可以了。

现在,我的日志输出如下:

[ INFO] reactor.Mono.FlatMap.1                   : | onSubscribe([Fuseable] MonoFlatMap.FlatMapMain)
[ INFO] reactor.Mono.FlatMap.1                   : | request(unbounded)
[ INFO] reactor.Mono.FlatMap.1                   : | onNext(io.logicdrop.profiles.services.GenericProfile@28519bfb)
[ INFO] reactor.Mono.Just.2                      : | onSubscribe([Synchronous Fuseable] Operators.ScalarSubscription)
[ INFO] reactor.Mono.Just.2                      : | request(unbounded)
[ INFO] reactor.Mono.Just.2                      : | onNext(tid)
[DEBUG] i.l.analytics.AnalyticsPersistTest       : 1 5ad9f248a29e0e307f885e5e
[ INFO] reactor.Mono.FlatMap.3                   : | onSubscribe([Fuseable] MonoFlatMap.FlatMapMain)
[ INFO] reactor.Mono.FlatMap.3                   : | request(unbounded)
[ INFO] reactor.Mono.Just.2                      : | onComplete()
[ INFO] reactor.Mono.FlatMap.1                   : | onComplete()
[ INFO] reactor.Mono.FlatMap.3                   : | onNext(tid)
[DEBUG] i.l.analytics.AnalyticsPersistTest       : 2 5ad9f248a29e0e307f885e5e
[ INFO] reactor.Mono.FlatMap.3                   : | onComplete()