优秀的编程知识分享平台

网站首页 > 技术文章 正文

Axon Framework - 模型- 聚合

nanyue 2025-05-24 15:49:50 技术文章 4 ℃

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 注释,指的是以下项目符号:

  1. @AggregateIdentifier 是指向 GiftCard 聚合的外部引用点。 这个字段是一个硬性要求,因为没有它,Axon 将不知道给定命令的目标是哪个聚合。 请注意,此注解可以放在字段和方法上。
  2. 一个 @CommandHandler 注解的构造函数,或者以不同的方式放置 '命令处理构造函数'。 这个注解告诉框架给定的构造函数能够处理 IssueCardCommand@CommandHandler 注解函数是您放置决策/业务逻辑的地方。
  3. 应该发布事件消息时使用静态的 AggregateLifecycle#apply(Object…)
    调用此函数后,提供的 Object 将在应用它们的聚合范围内作为 EventMessage 发布。
  4. 使用 @EventSourcingHandler 告诉框架,当聚合 '源自其事件' 时,应调用带注解的函数。
    由于所有事件溯源处理程序组合在一起将形成聚合,因此所有状态更改都发生在此处。 请注意,必须在聚合发布的第一个事件的 @EventSourcingHandler 中设置聚合标识符。
    这通常是创建事件。 最后,@EventSourcingHandler 注解函数使用特定规则解析。
    这些规则对于 @EventHandler 带注解的方法是相同的,并在带注解的事件处理程序中进行了详细说明。
  5. Axon 需要无参数构造函数。
    Axon Framework 使用此构造函数创建一个空的聚合实例,然后再使用过去的事件对其进行初始化。
    未能提供此构造函数将在加载聚合时导致异常。

消息处理函数的修饰符

事件处理程序方法可以是私有的,只要 JVM 的安全设置允许 Axon 框架更改方法的可访问性。 这使您可以清楚地将聚合的公共 API(公开生成事件的方法)与处理事件的内部逻辑分开。

大多数 IDE 可以选择忽略带有特定注解的方法的 "unused private method" 警告。 或者,您可以向该方法添加一个 @SuppressWarnings("UnusedDeclaration") 注解,以确保您不会意外删除事件处理程序方法。

聚合生命周期操作

在聚合的生命周期中,需要执行一些操作。 为此,Axon 中的 AggregateLifecycle 类提供了几个静态函数:

  1. apply(Object)apply(Object, MetaData): AggregateLifecycle#apply 将在 EventBus 上发布一个事件消息,以便知道它源自执行操作的聚合。
    有可能只提供事件对象或同时提供事件和一些特定的 MetaData
  2. createNew(Class, Callable): 作为处理命令的结果实例化一个新的聚合。阅读此内容以获取更多详细信息。
  3. isLive(): 检查以验证聚合是否处于 'live' 状态。
    如果聚合已完成重播历史事件以重新创建其状态,则该聚合被认为是 'live'。
    如果聚合因此处于事件溯源的过程中,则 AggregateLifecycle.isLive() 调用将返回 false
    使用此 isLive() 方法,您可以执行仅应在处理新生成的事件时执行的活动。
  4. markDeleted(): 将调用函数的聚合实例标记为 'deleted'。
    如果领域指定给定的聚合可以被 removed/deleted/closed,则很有用,之后不再允许它处理任何命令。
    应该从 EventSourcingHandler 注解函数调用此函数,以确保标记为已删除是该聚合状态的一部分。
最近发表
标签列表