Как связать 2 операции Spring Mongo Reactive Save вместе?

У меня есть тестовый пример, когда я пытаюсь запустить две операции сохранения из двух разных служб. Оба возвращают Mono (я не использую Spring Reactive Repository).

Я хочу сделать следующее по порядку:

  1. Сохраните профиль
  2. Создайте черту и обновите ее с помощью профиля
  3. Преобразовать / сохранить черту (вернуть черту)

Индивидуально они работают. Когда я пытаюсь связать их вместе, вторая операция зависает в зависимости от того, что я делаю (или просто не срабатывает).

Я предположил, что он был привязан / подписан на первый?

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)

person KJQ    schedule 19.04.2018    source источник


Ответы (1)


Святое дерьмо - похоже, это ошибка в том, как Spring / Mongo обрабатывает индексы в сочетании с реактивным материалом. Он завис на втором вызове, пытаясь создать индексы.

Я наткнулся на этот Реактивный монго зависает с иерархиями наследования, определенными в другом проекте Gradle

Если я использую этот обходной путь и удалю все аннотации индекса (@Index и @CompoundIndex), по крайней мере, из 2-го 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()
person KJQ    schedule 20.04.2018