我正在研究 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 在他的评论中指出的那样,您可以从两个角度查看命令模型状态:
- 事件来源
- 状态存储
默认情况下,Axon Framework 会使用 EventSourcingRepository
设置您的聚合。在它后面。这意味着,如果需要聚合(例如您的命令模型)来处理新命令,则将通过检索已发布的所有事件流来加载聚合。
其次,它会调用所有@EventSourcingHandler
聚合实现上的带注释的方法来重新创建命令模型的状态。
最后,一旦处理了属于聚合事件流的所有事件,该命令将被提供给 @CommandHandler
带注释的方法。
状态存储方法显然有点不同,因为这意味着整个聚合将存储在存储库中。
但请注意,状态存储方法仅通过 GenericJpaRepository
支持。类(class)。因此,将聚合完整存储在 MongoDB 中不是一个选项。
如果您正在为聚合寻找事件溯源方法,则事件可以源自任何 EventStore
框架涵盖的实现。
这意味着您可以选择 JPA、JDBC、MongoDb 和 Axon Server 作为存储事件和检索事件流以重新创建命令模型的方法。
配置方面,有几种方法可以实现这一点。 如果您直接使用Axon提供的Configuration API,您可以使用:
-
AggregateConfigurer#defaultConfiguration(Class<A>)
对于事件源方法 -
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/