【发布时间】:2021-04-27 19:09:10
【问题描述】:
我有一组已重构到另一个包的事件。在我执行事件重播之前,这将保持原样。深入挖掘,我注意到 domainevententry 表中的有效负载类型,并且认为更改它就足够了,但遗憾的是,事件的 xml 根元素似乎也需要更改。我希望有一种简单的方法可以做到这一点。
我找不到任何关于向上转换到不同包或使用 XStream 别名的示例,因此我们将不胜感激。
谢谢
【问题讨论】:
标签: axon axon-framework
我有一组已重构到另一个包的事件。在我执行事件重播之前,这将保持原样。深入挖掘,我注意到 domainevententry 表中的有效负载类型,并且认为更改它就足够了,但遗憾的是,事件的 xml 根元素似乎也需要更改。我希望有一种简单的方法可以做到这一点。
我找不到任何关于向上转换到不同包或使用 XStream 别名的示例,因此我们将不胜感激。
谢谢
【问题讨论】:
标签: axon axon-framework
正如您所注意到的,存储在事件中的默认负载类型是完全限定的类名。这确保了开箱即用的序列化和反序列化按预期工作。但是,移动类意味着无法再找到有效负载类型,需要进行一些调整。
您可以使用EventTypeUpcaster,如Reference Guide 中所述。 EventTypeUpcaster 专用于调整负载类型,因此也可以用于处理更改包名称。
当使用(默认)XStreamSerializer 时,给标签添加别名确实也可以。例如如何设置别名可以看here。正如在该示例中注意到的那样,别名被添加到 XStream 实例中。 XStreamSerializer 使用 XStream 实例来支持从/到 XML 的反序列化/序列化。要调整XStream 实例,您可以简单地使用XStreamSerializer 上的构建器范例。 JavaDoc of the builder 应该足够具体,以帮助您了解如何使用它。
【讨论】:
在这方面走了很长一段路,但它似乎奏效了。与往常一样,在执行大容量更改之前备份您的数据库。我还在完成时使用数据库重新启动了服务。不用说,我会在下次部署之前确保事件在逻辑包中:)
数据库引擎:Postgres 10
表格:域事件条目
update domainevententry
set
payloadtype = '<new.package.Classname>',
payload = lo_from_bytea(0, decode(REPLACE(
subquery.output,
'<old.package.Classname>',
'<new.package.Classname>'
), 'escape'))
from (
SELECT eventidentifier, payloadtype, encode(lo_get(payload::oid), 'escape') as output FROM domainevententry
WHERE eventidentifier in (
'<event guid 1>',
'<event guid 2>'
)
AND payloadtype = '<old.package.Classname>'
) as subquery
where domainevententry.eventidentifier = subquery.eventidentifier;
完成后,我需要更新大对象的 OWNER:
ALTER LARGE OBJECT <LargeObjectId> OWNER TO database_role;
可能不是最优雅的解决方案,但根据我的时间限制,它完成了工作。对于大型对象,此解决方案可能存在编码问题,但最终对我来说都解决了。随意分享任何使上述更合适的优化。
启动 Axon 框架重播重建了投影,一切都排好了。
【讨论】: