Axon 框架事件包重构

时间:2021-04-27 19:09:10

标签: axon axon-framework

我有一组已重构为另一个包的事件。在我执行事件重播之前,这会一直有效。深入挖掘,我注意到 domainevententry 表中的有效载荷类型,改变它就足够了,但似乎事件的 xml 根元素也需要更改。我希望有一种简单的方法可以做到这一点。

我找不到任何关于向上转换到不同包或使用 XStream 别名的示例,因此将不胜感激任何帮助。

谢谢

2 个答案:

答案 0 :(得分:3)

如您所见,存储在事件中的默认负载类型是完全限定的类名。这确保开箱即用的序列化和反序列化按预期工作。然而,移动类因此意味着无法再找到有效载荷类型,需要进行一些调整。

您可以使用 EventTypeUpcaster,如 Reference Guide 中所述。 EventTypeUpcaster 专用于调整负载类型,因此也可用于处理更改包名称。

当使用(默认)XStreamSerializer 时,标签别名确实也有效。例如如何设置别名可以参见here。在该示例中注意到,别名已添加到 XStream 实例。 XStreamSerializer 使用 XStream 实例来支持从/到 XML 的反/序列化。要调整 XStream 实例,您可以简单地在 XStreamSerializer 上使用构建器范例。 JavaDoc of the builder 应该足够具体以帮助您了解如何使用它。

答案 1 :(得分:0)

在这方面走了很长一段路,但似乎有效。与往常一样,在执行大量更改之前备份数据库。我还在完成时使用数据库重新启动了服务。不用说,在下次部署之前,我会确保事件在逻辑包中:)

数据库引擎:Postgres 10

表格:domainevententry

    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;

完成后,我需要更新大对象的所有者:

ALTER LARGE OBJECT <LargeObjectId> OWNER TO database_role;

可能不是最优雅的解决方案,但基于我的时间限制,它完成了工作。对于大对象,此解决方案可能存在编码问题,但最终对我来说都解决了。随意分享任何可以使上述更合适的优化。

启动 Axon 框架重放重建了投影和所有内容。