Axon: Eventsourced Aggregate none 状态改变事件

Axon: Eventsourced Aggregate none state changing event

我有一个用例,我想发布一个非状态改变事件作为触发器。

In the vast majority of cases, the Aggregates will publish events by applying them. However, occasionally, it is necessary to publish an event (possibly from within another component), directly to the Event Bus. To publish an event, simply wrap the payload describing the event in an EventMessage. The GenericEventMessage.asEventMessage(Object) method allows you to wrap any object into an EventMessage ...

事件是从 Saga 内部发布的。

当我使用 asEventMessage 并查看事件时 table 我有点困惑。该事件具有系统其余部分不存在的聚合标识符,类型条目为 null(在阅读文档时,暂时听起来 asEventMessage 的预期行为等于从聚合中应用事件)。

既然我认为我正在谈论的事件在概念上是聚合的一部分,那么它应该指的是它,对吗?

所以我自己制作了一个 GenericDomainMessage 并手动设置了它的聚合标识符、序列号和类型:

@SagaEventHandler
public void on (AnotherEvent event, @SequenceNumber long sequenceNr) {

    // ...

    GenericDomainEventMessage myEvent = new GenericDomainEventMessage(
            MyAggregate.class.getSimpleName(),
            identifier.toString(),
            sequenceNr + 1, 
            payload);
    eventStore.publish(myEvent);

}

此事件不会将(数据)状态更改引入其基础聚合。我将其视为在域中具有强烈含义的flag/trigger。

我也可以在命令处理程序中从聚合内部发布事件,但需要执行的一些操作不在聚合范围内。这就是为什么 Saga 似乎更 suitable.

所以我的问题是:

发布 GenericDomainEventMessage 等于 AggrgateLifeCycle#apply 的行为吗?

聚合中应该有一个空操作处理程序还是轴突会正确处理这个?

在 Axon 3 中,将事件发布到 EventBus 与从聚合中 apply() 发布事件相同,只有一个区别:apply() 将调用任何可用的处理程序作为出色地。如果没有可用的处理程序,则没有区别。

EventBus.publish 旨在发布不应直接绑定到聚合的事件。在事件存储 table 中,它确实获得了聚合标识符(等于消息标识符),但这是一个技术细节。

对于您的情况,推荐的解决方案是 apply() 事件。在这一点上,事件不触发状态更改这一事实并不重要。您不必为其定义 @EventSourcingHandler