Axon 框架事件包重构
Axon Framework Event Package Refactoring
我有一组事件已重构为另一个包。在我执行事件重播之前,这将按原样工作。深入挖掘,我注意到 domainevententry table 中的 payloadtype 并且更改它就足够了,但遗憾的是,事件的 xml 根元素似乎也需要更改。我希望有一个简单的方法来做到这一点。
我找不到任何关于升级到不同包或使用 XStream 别名的示例,因此非常感谢任何帮助。
谢谢
用这个走了很长的路,但它似乎有效。一如既往,在执行大量更改之前备份您的数据库。完成后我还使用数据库重新启动了服务。不用说,在下次部署之前,我会确保事件在逻辑包中 :)
数据库引擎:Postgres 10
Table: 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 Framework 重播重建了投影,一切都排好了。
正如您所注意到的,存储在事件中的默认负载类型是完全限定的 class 名称。这确保开箱即用的序列化和反序列化按预期工作。然而,四处移动 classes 意味着无法再找到有效负载类型,需要进行一些调整。
您可以使用 EventTypeUpcaster
,如 Reference Guide 中所述。 EventTypeUpcaster
专门用于调整payload类型,因此也可以用来处理包名的变化。
使用(默认)XStreamSerializer
时,为标签添加别名确实也有效。怎么设置别名可以看一下here for example. AS noticed in that sample, the alias is added to the XStream
instance. The XStreamSerializer
uses an XStream
instance to support de-/serialization from/to XML. To adjust the XStream
instance, you can simply use the builder paradigm on the XStreamSerializer
. The JavaDoc of the builder应该说的很具体,帮你搞定怎么用。
我有一组事件已重构为另一个包。在我执行事件重播之前,这将按原样工作。深入挖掘,我注意到 domainevententry table 中的 payloadtype 并且更改它就足够了,但遗憾的是,事件的 xml 根元素似乎也需要更改。我希望有一个简单的方法来做到这一点。
我找不到任何关于升级到不同包或使用 XStream 别名的示例,因此非常感谢任何帮助。
谢谢
用这个走了很长的路,但它似乎有效。一如既往,在执行大量更改之前备份您的数据库。完成后我还使用数据库重新启动了服务。不用说,在下次部署之前,我会确保事件在逻辑包中 :)
数据库引擎:Postgres 10
Table: 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 Framework 重播重建了投影,一切都排好了。
正如您所注意到的,存储在事件中的默认负载类型是完全限定的 class 名称。这确保开箱即用的序列化和反序列化按预期工作。然而,四处移动 classes 意味着无法再找到有效负载类型,需要进行一些调整。
您可以使用 EventTypeUpcaster
,如 Reference Guide 中所述。 EventTypeUpcaster
专门用于调整payload类型,因此也可以用来处理包名的变化。
使用(默认)XStreamSerializer
时,为标签添加别名确实也有效。怎么设置别名可以看一下here for example. AS noticed in that sample, the alias is added to the XStream
instance. The XStreamSerializer
uses an XStream
instance to support de-/serialization from/to XML. To adjust the XStream
instance, you can simply use the builder paradigm on the XStreamSerializer
. The JavaDoc of the builder应该说的很具体,帮你搞定怎么用。