当前位置: 首页 > 知识库问答 >
问题:

如何将2个Spring Mongo被动保存操作链接在一起?

骆鸿运
2023-03-14

我有一个测试用例,试图从两个不同的服务启动两个save操作。两者都返回Mono(我没有使用Spring反应存储库)。

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

  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)

共有1个答案

包德业
2023-03-14

天哪,这看起来是Spring/Mongo处理索引和反应性内容的方式中的一个bug。它在第二次尝试创建索引时挂起。

我偶然发现这个反应式mongo挂起了在不同的gradle项目中定义的继承层次结构

如果我使用此解决方法并删除所有索引注释(@index和@compoundex),至少从第二个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()
 类似资料:
  • 从研究中,我发现thunk是一种工具,您可以使用它将动作链接在一起和/或处理回调、异步动作和副作用。 我无法理解thunk中间件指南。他们总是引用store.dispatch(就像大多数关于redux的教程一样),但我从未真正调用调度,也从未访问过商店,所以我不确定如何实现他们提出的任何建议。(我假设这是因为我在反应中使用mapDispatchToProps......这在我的动作创建者文件中不是

  • 第一个API调用返回一个元素列表,然后我想随后调用另一个API,在第一个API调用的列表的每个元素中返回一个。我(想我)已经得到了它,所以它用列表的每个元素调用第二个应用编程接口调用,但是我不确定如何订阅它来获得第二个调用返回的结果。 改装接口: 我不确定从这里去哪里。 我相信然后使我能够获得可观察的

  • 我用的是Flink 1.4.0 我正在尝试将Table API查询的结果保存到CSV文件,但我收到错误。以下是详细信息: 我的输入文件如下所示: 我对此运行查询以仅选择犬类,我想将其保存到csv文件中: 当我运行此命令时,我看到数据集的结果被输出: 犬科动物,2 然而,我在输出文件中没有得到任何结果,我在下面看到了这些错误。我能做些什么来解决这个问题?谢谢

  • 保存连结 将超链接转换为档案并保存至Memory Stick™或主机内存。 1. 让指标对准想要保存的连结,从选单列中选择[档案] > [保存连结]。 2. 选择[保存]。 因应文件类型,自动选择适切的保存位置。 提示 部分超链接可改变文件名或保存位置。若要变更,请选择各项输入栏,并执行决定。 若没有适合的保存位置,将保存至[COMMON]文件夹。但保存于COMMON文件夹的档案,无法使用PSP™

  • 我想创建两个链接的表。我的问题是这个设计工作和我的加入声明工作。 表#1宴会厅id(PK),姓名,地点等

  • 在Angular 1. x中,我可以执行以下操作来创建一个基本上什么都不做的链接: 但在Angular 2中,相同的标签会导航到应用程序库。角2的等效值是什么? 编辑:这看起来像Angular 2路由器中的一个bug,现在github上有一个关于这一点的公开问题。 我正在寻找一个开箱即用的解决方案,或者确认不会有任何解决方案。