Axon 框架执行 EventUpcaster

Axon Framework Execute EventUpcaster

我需要将活动升级到新版本。这需要删除正在增长(由于设计决策)且不再需要的旧 属性。

已阅读 https://docs.axoniq.io/reference-guide/axon-framework/events/event-versioning 上提供的文档并实施所需的部分

@Bean
    public EventUpcasterChain eventUpcasterChain(){
        return new EventUpcasterChain(
                new CurrentLoanBalanceAcceptedEventUpcaster(),
                new InterestCalculatedEventUpcaster()
        );
    }

我似乎无法让 upcasters 触发“doUpcast”方法。我的理解是,在启动时,应用程序会找到所有旧事件并将它们转换为新版本的事件。这个对吗?还是仅在重播旧事件时才将其更新?我希望有一种方法可以在不重播所有事件的情况下做到这一点。

版本:

Spring 开机:2.4.11

轴突框架:4.5.4

更新:

在尝试弄清楚如何使用 upcasters 从事件 xml 中删除节点后,我惨遭失败。我必须指出,这个问题不是 Axon 的问题,而是一个糟糕的设计决策,并且缺乏理解 Axon 对事件所做的事情。主要的教训是让事件尽可能简单。

我使用以下查询从域事件存储中卸载了不必要的 xml:

update domainevententry
set payload = lo_from_bytea(0, decode(regexp_replace(
                                              subquery.output,
                                              '\<nodeToReplace\>(.*)\<\/nodeToReplace\>',
                                              ''
                                          ), 'escape'))
from (
         SELECT eventidentifier, payloadtype, encode(lo_get(payload::oid), 'escape') as output
         FROM domainevententry
         WHERE eventidentifier in (
             '<id>'
             )
           AND payloadtype = '<payloadType>'
     ) as subquery
where domainevententry.eventidentifier = subquery.eventidentifier;

upcaster 链中的每个 upcaster 仅在找到要转换为新事件的 'old' 事件时才会被调用。触发的新事件是它的新版本,因此不会使用 upcaster。

Upcasters 用于以下情况:

  • 加载聚合(没有快照)并遇到旧事件
  • 重播投影并遇到旧事件

在所有其他情况下,这将是新事件,因此不必解雇 upcaster。 upcaster 在那里,因此可以继续加载聚合,并且可以从事件存储的开头重放投影。

如果不是这种情况,我们需要查看旧事件定义和新事件定义上的 Revision 参数。例如,如果旧事件没有 @Revision 注释,则 SimpleSerializedType 需要 null 的版本,否则将不匹配。

如果我们需要进一步挖掘,请包括 upcasters 的代码,这将有很大帮助!