我有一个实用程序,我想发布一个非状态的唱唱事件作为触发器。
在绝大多数情况下,Aggregates将通过应用它们来发布事件。但是,有时需要将事件(可能来自另一个组件)直接发布到事件总线。要发布事件,只需将描述事件的有效负载包装在EventMessage中即可。GenericEventMessage.asEventMessage( object )方法允许将任何对象包装到EventMessage中.
这一事件是在一部传奇中发表的。
当我使用asEventMessage
并查看events表时,我有点困惑。该事件具有系统其他部分中不存在的聚合标识符,且类型条目为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
的行为相同。
聚合中应该有一个非op处理程序,还是axon会正确地处理这个问题?
发布于 2017-03-10 02:56:16
在Axon 3中,将事件发布到EventBus
与从聚合中对事件进行apply()
相同,但有一个区别:apply()
也将调用任何可用的处理程序。如果没有可用的处理程序,则没有区别。
EventBus.publish
的目的是发布不应该直接绑定到聚合的事件。在Event表中,它确实获得了一个聚合标识符(等于消息标识符),但这是一个技术细节。
在您的例子中,推荐的解决方案是apply()
事件。事件不触发状态更改的事实在这一点上并不重要。您不必为它定义一个@EventSourcingHandler
。
https://stackoverflow.com/questions/42701027
复制相似问题