java - 命令状态的自动持久化[Axon框架]

标签 java spring mongodb axon

我正在研究 Axon 框架,但我在命令状态的自动持久性方面遇到了困难。

我查看了有关 command model repository 的文档根据我的理解,如果我具有正确的依赖项,标准存储库的命令模型的状态应该自动保留。这种情绪也存在于另一个 blog/tutorial 中。我已经查看过(您可能需要向下滚动到“存储库”部分)。

问题是,尽管我添加了 axon-mongo 依赖项,但命令状态并未自动保留。我尝试按照文档配置相关的存储库 bean,但它似乎也不起作用。我什至不确定是否需要这样做,因为(根据我对文档的理解)如果您想查询命令状态,您主要会这样做。

虽然我知道我可以创建自己的存储库并自己保存实体(类似于 this tutorial ),但我宁愿不提供开箱即用的功能。

我在这里遗漏了什么吗?

注意:我的 Mongo 设置似乎是正确的,因为我已按照 documentation 设法将我的事件保留在 MongoDB 中。 .

更新

根据 Steven 的评论(以及后续评论),我决定尝试实现状态存储聚合,但是我发现聚合的(反)序列化存在问题。我已将我的聚合发送给 Steven,他已确认它足够简单,应该由 XStream 对其进行(反)序列化。我还尝试使用 XStream 的独立实例序列化我的聚合,并且它有效,这让我相信这更多是 Axon 问题而不是 XStream 问题。我还尝试使用 Jackson 和 java(反)序列化器(因为它们是 Axon 提供的其他选项),并且发现了类似的问题。我得出的结论是,这是一个 Axon 错误,我已停止尝试解决该问题。

最佳答案

从您的问题来看,目前尚不清楚您是否知道可以选择的可能的命令模型存储机制。 因此,首先,就像 @Mzzl 在他的评论中指出的那样,您可以从两个角度查看命令模型状态:

  1. 事件来源
  2. 状态存储

默认情况下,Axon Framework 会使用 EventSourcingRepository 设置您的聚合。在它后面。这意味着,如果需要聚合(例如您的命令模型)来处理新命令,则将通过检索已发布的所有事件流来加载聚合。 其次,它会调用所有@EventSourcingHandler聚合实现上的带注释的方法来重新创建命令模型的状态。 最后,一旦处理了属于聚合事件流的所有事件,该命令将被提供给 @CommandHandler带注释的方法。

状态存储方法显然有点不同,因为这意味着整个聚合将存储在存储库中。

但请注意,状态存储方法仅通过 GenericJpaRepository 支持。类(class)。因此,将聚合完整存储在 MongoDB 中不是一个选项。 如果您正在为聚合寻找事件溯源方法,则事件可以源自任何 EventStore框架涵盖的实现。 这意味着您可以选择 JPA、JDBC、MongoDb 和 Axon Server 作为存储事件和检索事件流以重新创建命令模型的方法。

配置方面,有几种方法可以实现这一点。 如果您直接使用Axon提供的Configuration API,您可以使用:

  1. AggregateConfigurer#defaultConfiguration(Class<A>)对于事件源方法
  2. AggregateConfigurer#jpaMappedConfiguration(Class<A>)对于状态存储方法

如果您的应用程序处于 Spring Boot 环境中,则在事件源和状态存储之间切换会更简单。 只需拥有 @Entity聚合实现上的注释足以让框架注意到您想要按原样存储聚合。

希望这能让@The__Malteser 的情况有所了解!


更新

根据评论,很明显 XStreamSerializer框架默认使用它来反/序列化对象,但无法以状态存储的方式序列化您的聚合实例。

根据您收到的异常,为 Cannot marshal the XStream instance in action ,我做了一些搜索/挖掘。我有预感XStream默认情况下不能简单地序列化非静态内部类。

但是,由于我们不确定您的聚合的实现是什么,因此很难推断这是否是当前的问题。您能否在这里与我们分享您的实现,以便我们更好地推断内部类是否是问题所在?

关于java - 命令状态的自动持久化[Axon框架],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56680699/

相关文章:

java - Hibernate JCache 5.4.3.Final 不适用于 JCache 5.4.2.Final 配置

在 Tomcat 8 上启动 Spring 应用程序时出现 java.lang.IllegalAccessError

MongoDB到Java的集成

java - MongoDB - 可用于 MongoDB 的不同 ORM 工具的比较

java - Android - 无法通过 fragment 中的 Intent 启动 Activity

java - 如何使用 Geotools 生成带样式的 KML 文件?

java - 如何获取二维数组的众数

java - 数组 contains() 方法行为不当

java - Spring AOP 表达式中访问修饰符有什么用?

c# - 如何使用 C# 驱动程序设置 MongoDB 的路径?