Axon:Eventsourced聚合无状态改变事件

时间:2017-03-09 16:51:47

标签: java axon

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

  

在绝大多数情况下,聚合将通过应用它们来发布事件。但是,有时需要将事件(可能来自另一个组件内)直接发布到事件总线。要发布事件,只需将描述事件的有效负载包装在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会正确处理这个吗?

1 个答案:

答案 0 :(得分:1)

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

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

在您的情况下,建议的解决方案是apply()事件。事件没有触发状态变化的事实在那一点上并不重要。您没有义务为其定义@EventSourcingHandler