我有一个用例,我想将非状态转换事件作为触发器发布。
在绝大多数情况下,聚合将通过应用它们来发布事件。但是,有时需要将事件(可能来自另一个组件内)直接发布到事件总线。要发布事件,只需将描述事件的有效负载包装在EventMessage中。 GenericEventMessage.asEventMessage(Object)方法允许您将任何对象包装到EventMessage中......
该活动是从佐贺内部发布的。
当我使用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);
}
此事件不会将(数据)状态更改引入其基础聚合。我把它当作一个在域中具有强烈意义的标志/触发器。
我也可以在聚合内部,在命令处理程序中发布事件,但是需要执行的一些操作超出了聚合的范围。这就是为什么佐贺似乎更合适。
所以我的问题是:
发布GenericDomainEventMessage
是否等同于AggrgateLifeCycle#apply
的行为?
聚合中是否应该有一个no-op处理程序,或者axon会正确处理这个吗?
答案 0 :(得分:1)
在Axon 3中,将事件发布到EventBus
与聚合中的apply()
相同,但有一点不同:apply()
也会调用任何可用的处理程序。如果没有可用的处理程序,则没有区别。
EventBus.publish
旨在发布不应与Aggregate直接关联的事件。在Event Store表中,它确实获得了一个Aggregate标识符(等于消息标识符),但这是一个技术细节。
在您的情况下,建议的解决方案是apply()
事件。事件没有触发状态变化的事实在那一点上并不重要。您没有义务为其定义@EventSourcingHandler
。