Как связать 2 операции Spring Mongo Reactive Save вместе?
У меня есть тестовый случай, когда я пытаюсь запустить две операции сохранения из двух разных сервисов. Оба возвращают Mono (я не использую Spring Reactive Repository).
Я хочу сделать следующее по порядку:
- Сохранить профиль
- Создайте черту и обновите ее, используя профиль
- Трансформировать / Сохранить черту (вернуть черту)
Индивидуально они работают. Когда я пытаюсь связать их вместе, вторая операция зависает в зависимости от того, что я делаю (или просто не срабатывает).
Я предполагал, что это было приковано / подписано на первый?
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();
Мой вывод выглядит так, и он так и не закончил печатать 2-й оператор log (просто вращается).
[ 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 ответ
Святое дерьмо - похоже, это ошибка в том, как Spring/Mongo обрабатывает индексы в сочетании с Reactive. Он зависал при втором вызове, пытаясь создать индексы.
Я наткнулся на это зависание Реактивного Монго с иерархиями наследования, определенными в другом проекте 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()