java - Axon:Eventsourced 聚合无状态更改事件

标签 java axon

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

In the vast majority of cases, the Aggregates will publish events by applying them. However, occasionally, it is necessary to publish an event (possibly from within another component), directly to the Event Bus. To publish an event, simply wrap the payload describing the event in an EventMessage. The GenericEventMessage.asEventMessage(Object) method allows you to wrap any object into an 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 的行为?

聚合中是否应该有一个无操作处理程序,或者 axon 会正确处理这个问题吗?

最佳答案

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

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

就您而言,建议的解决方案是 apply() 事件。该事件不会触发状态更改这一事实此时并不重要。您没有义务为其定义 @EventSourcingHandler

关于java - Axon:Eventsourced 聚合无状态更改事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42701027/

相关文章:

java - TestNg 数据绑定(bind) : setting the location of properties on test start up

java - 当我在 NetBeans 中按 "New Project"时,我在类别中找不到 Java

java - 轴突重建聚合状态尚不清楚

cqrs - 是否可以在没有 Axon Server Enterprise 的情况下扩展 Axon Framework

java - 了解在鼠标监听器中编写的代码

java - 在 Java 中不使用 return 语句返回字符串值

java - 在 Mapper 类中执行 Reducer 操作

java - Axon - 事件处理程序拦截器配置

Axon 分布式查询总线?

domain-driven-design - 在新项目中考虑Axon