网站首页 > 技术文章 正文
Aggregate
本章将介绍如何实现 'Aggregate' 的基础知识。 有关什么是聚合的更多详细信息,请阅读 《Axon 官方引用指南 - DDD 和 CQRS 概念》。
基本聚合结构
Aggregate 是一个常规对象,它包含状态和更改该状态的方法。 创建 Aggregate 对象时,您实际上是在创建 'Aggregate Root',通常带有整个聚合的名称。 出于本描述的目的,将使用 'Gift Card' 领域,它为我们带来了 GiftCard 作为聚合(根)。 默认情况下,Axon 会将您的聚合配置为 'Event Sourced' 聚合(如此处所述)。 此后,我们基本的 GiftCard 聚合结构将专注于事件溯源方法:
import org.axonframework.commandhandling.CommandHandler;
import org.axonframework.eventsourcing.EventSourcingHandler;
import org.axonframework.modelling.command.AggregateIdentifier;
import static org.axonframework.modelling.command.AggregateLifecycle.apply;
public class GiftCard {
@AggregateIdentifier // 1.
private String id;
@CommandHandler // 2.
public GiftCard(IssueCardCommand cmd) {
// 3.
apply(new CardIssuedEvent(cmd.getCardId(), cmd.getAmount()));
}
@EventSourcingHandler // 4.
public void on(CardIssuedEvent evt) {
id = evt.getCardId();
}
// 5.
protected GiftCard() {
}
// 省略的命令处理程序和事件溯源处理程序
}
给定的代码片段中有几个值得注意的概念,标有编号的 Java 注释,指的是以下项目符号:
- @AggregateIdentifier 是指向 GiftCard 聚合的外部引用点。 这个字段是一个硬性要求,因为没有它,Axon 将不知道给定命令的目标是哪个聚合。 请注意,此注解可以放在字段和方法上。
- 一个 @CommandHandler 注解的构造函数,或者以不同的方式放置 '命令处理构造函数'。 这个注解告诉框架给定的构造函数能够处理 IssueCardCommand。 @CommandHandler 注解函数是您放置决策/业务逻辑的地方。
- 应该发布事件消息时使用静态的 AggregateLifecycle#apply(Object…)。
调用此函数后,提供的 Object 将在应用它们的聚合范围内作为 EventMessage 发布。 - 使用 @EventSourcingHandler 告诉框架,当聚合 '源自其事件' 时,应调用带注解的函数。
由于所有事件溯源处理程序组合在一起将形成聚合,因此所有状态更改都发生在此处。 请注意,必须在聚合发布的第一个事件的 @EventSourcingHandler 中设置聚合标识符。
这通常是创建事件。 最后,@EventSourcingHandler 注解函数使用特定规则解析。
这些规则对于 @EventHandler 带注解的方法是相同的,并在带注解的事件处理程序中进行了详细说明。 - Axon 需要无参数构造函数。
Axon Framework 使用此构造函数创建一个空的聚合实例,然后再使用过去的事件对其进行初始化。
未能提供此构造函数将在加载聚合时导致异常。
消息处理函数的修饰符
事件处理程序方法可以是私有的,只要 JVM 的安全设置允许 Axon 框架更改方法的可访问性。 这使您可以清楚地将聚合的公共 API(公开生成事件的方法)与处理事件的内部逻辑分开。
大多数 IDE 可以选择忽略带有特定注解的方法的 "unused private method" 警告。 或者,您可以向该方法添加一个 @SuppressWarnings("UnusedDeclaration") 注解,以确保您不会意外删除事件处理程序方法。
聚合生命周期操作
在聚合的生命周期中,需要执行一些操作。 为此,Axon 中的 AggregateLifecycle 类提供了几个静态函数:
- apply(Object) 和 apply(Object, MetaData): AggregateLifecycle#apply 将在 EventBus 上发布一个事件消息,以便知道它源自执行操作的聚合。
有可能只提供事件对象或同时提供事件和一些特定的 MetaData。 - createNew(Class, Callable): 作为处理命令的结果实例化一个新的聚合。阅读此内容以获取更多详细信息。
- isLive(): 检查以验证聚合是否处于 'live' 状态。
如果聚合已完成重播历史事件以重新创建其状态,则该聚合被认为是 'live'。
如果聚合因此处于事件溯源的过程中,则 AggregateLifecycle.isLive() 调用将返回 false。
使用此 isLive() 方法,您可以执行仅应在处理新生成的事件时执行的活动。 - markDeleted(): 将调用函数的聚合实例标记为 'deleted'。
如果领域指定给定的聚合可以被 removed/deleted/closed,则很有用,之后不再允许它处理任何命令。
应该从 EventSourcingHandler 注解函数调用此函数,以确保标记为已删除是该聚合状态的一部分。
- 上一篇: 自动化利器Python类实例方法、静态方法和类方法的区别和用法
- 下一篇: 设计模式之单件模式
猜你喜欢
- 2025-05-24 高中数学解题分析方法及知识点
- 2025-05-24 C/C++编程笔记:无法在C++中重载的函数,六种方式
- 2025-05-24 面试与实战:什么是 Lambda?该如何使用?
- 2025-05-24 设计模式之单件模式
- 2025-05-24 自动化利器Python类实例方法、静态方法和类方法的区别和用法
- 2025-05-24 嵌入式开发必看!面向过程VS面向对象,哪种更适合你的项目?
- 2025-05-24 Python:深度剖析实例方法、类方法和静态方法的区别
- 2025-05-24 避免踩坑,C++常见面试题的分析与解答
- 2025-05-24 一文掌握Python 中的类方法与静态方法
- 2025-05-24 c#入门教程(九)静态变量
- 05-24高中数学解题分析方法及知识点
- 05-24C/C++编程笔记:无法在C++中重载的函数,六种方式
- 05-24面试与实战:什么是 Lambda?该如何使用?
- 05-24设计模式之单件模式
- 05-24Axon Framework - 模型- 聚合
- 05-24自动化利器Python类实例方法、静态方法和类方法的区别和用法
- 05-24嵌入式开发必看!面向过程VS面向对象,哪种更适合你的项目?
- 05-24Python:深度剖析实例方法、类方法和静态方法的区别
- 最近发表
- 标签列表
-
- cmd/c (64)
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- sqlset (64)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- org.redisson (64)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)