【问题标题】:Axon creating aggregate inside saga轴突在传奇中创建聚合
【发布时间】:2019-03-05 16:57:17
【问题描述】:

我不知道如何正确地问这个问题,但这里是:

我在特定事件上启动 saga,然后我调度应该创建一些聚合的命令,然后发送另一个将由 saga 处理的事件以继续执行逻辑。

但是,每次我重新启动应用程序时,我都会收到一条错误消息,指出序列 x 处的聚合事件已插入,我想这是因为 saga 尚未完成,当我重新启动它时,它会再次启动它通过尝试创建新的聚合。

问题是,axoniq 中是否有任何方法可以跟踪 saga 的进度?就像我应该在收到事件时设置一些标志并在 ifs 聚合创建中包装? 也许还有另一种我没有看到的方式,我只是不想从一开始就重播这个传奇。

谢谢

【问题讨论】:

  • 小笨蛋,但我会将您的问题的标题重命名为“Axon - 在 Saga 中创建聚合”。 AxonIQ 是公司名称,而不是产品名称。 ;)

标签: domain-driven-design axon


【解决方案1】:

您发布的解决方案肯定会奏效。 让我解释一下你在这里遇到的场景,也供其他人参考。

在 Axon Framework 4.x 应用程序中,任何事件处理组件,以及您的 Saga 实例,都由 TrackingEventProcessor 支持。 跟踪事件处理器“跟踪”它正在处理事件的事件流中的哪个点。它通过TrackingToken 存储此信息,TokenStore 是其委派工作。

但是,如果您没有指定 TokenStore,则每个跟踪事件处理器都将拥有内存中的 TrackingTokens。 这意味着在重新启动时,您的跟踪事件处理器会认为“哦,我还没有进行任何事件处理,让我从时间的开始开始”。 因此,您的 Saga 实例每次都会启动一个新实例,尝试重新创建给定的 Aggregate 实例。

此后,指定TokenStore,就像您解决了您遇到的问题一样。

请注意,在 Spring Boor 环境中,例如存在 Spring Data 启动器,Axon 将自动为您创建 JpaTokenStore

【讨论】:

    【解决方案2】:

    我通过简单地添加令牌存储配置解决了我的问题,它完全符合我的要求 - 跟踪处理的事件。

    基本弹簧配置:

        @Bean
        fun tokenStore(client: MongoClient): TokenStore = MongoTokenStore.builder()
            .mongoTemplate(DefaultMongoTemplate.builder().mongoDatabase(client).build())
            .serializer(JacksonSerializer.builder().build())
            .build()
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-12
      • 1970-01-01
      • 2018-08-21
      相关资源
      最近更新 更多