我有一个用例,我想发布一个非状态改变事件作为触发器。
在绝大多数情况下,聚合将通过应用事件来发布事件。但是,有时需要将事件(可能从另一个组件中)直接发布到事件总线。要发布事件,只需将描述事件的有效负载包装在 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
吗?
聚合中应该有一个无操作处理程序还是轴突会正确处理这个?