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 的代码,这将有很大帮助!
我需要将活动升级到新版本。这需要删除正在增长(由于设计决策)且不再需要的旧 属性。
已阅读 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 的代码,这将有很大帮助!