0

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

在绝大多数情况下,聚合将通过应用事件来发布事件。但是,有时需要将事件(可能从另一个组件中)直接发布到事件总线。要发布事件,只需将描述事件的有效负载包装在 EventMessage 中。GenericEventMessage.asEventMessage(Object) 方法允许您将任何对象包装到 EventMessage ...

该事件是从 Saga 内部发布的。

当我使用asEventMessage并查看事件表时,我有点困惑。该事件具有一个聚合标识符,该标识符在系统的其余部分中不存在,并且类型条目是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);

}

此事件不会将(数据)状态更改引入其基础聚合。我将其视为在领域中具有重要意义的标志/触发器。

我还可以在命令处理程序中从聚合内发布事件,但是需要执行的一些操作超出了聚合的范围。这就是为什么 Saga 似乎更合适的原因。

所以我的问题是:

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

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

4

1 回答 1

1

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

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

在您的情况下,推荐的解决方案是apply()事件。事件不会触发状态更改的事实在那时并不重要。你没有义务@EventSourcingHandler为它定义一个。

于 2017-03-10T10:56:16.167 回答