首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Akka坚持自定义TCK插件,如何支持非java序列化标记类型?

Akka坚持自定义TCK插件,如何支持非java序列化标记类型?
EN

Stack Overflow用户
提问于 2018-11-21 20:30:48
回答 2查看 141关注 0票数 0

我正在使用Apache ignite构建Akka持久性插件,当涉及到事件标记时,我有一个问题,如果我禁用java序列化(a java-序列化= no),标记类型无法正确序列化,因为我使用Protobuf来处理事件,是否有方法为事件标记包装配置特定的序列化,或者它需要在插件本身中处理?我的插件的GitHub:https://github.com/Romeh/akka-persistance-ignite

我得到的例外是:

2018-11- 21 :20:48错误a.p.i.journal.IgniteWriteJournal -试图在禁用akka.actor.allow-java-serialization时使用akka.actor.allow-java-serialization序列化消息。有关更多细节,请查看警告日志。akka.serialization.DisabledJavaSerializer$JavaSerializationException:试图在禁用akka.actor.allow-java-serialization时使用akka.actor.allow-java-serialization序列化消息。有关更多细节,请查看警告日志。2018-11- 21 :20:48警告a.s.DisabledJavaSerializer -传出消息试图使用akka.actor.allow-java-serialization = off序列化,即使设置了akka.actor.allow-java-serialization = off!消息类型是:类akka.persistence.journal.Tagged

我有一个示例应用程序,当我使用Protobuf进行事件序列化时,会发生此问题,是否需要对事件标记类型执行同样的操作?

GitHub URL示例代码:https://github.com/Romeh/spring-boot-akka-event-sourcing-starter/tree/master/spring-event-sourcing-example

在Apache中,它是二进制序列化。

非常感谢你的帮助!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-29 14:31:40

实际上,在执行日志中的实际事件存储之前,如果msg类型是标记的或不是标记的,就可以通过检查msg类型来解决问题,如下所示:

代码语言:javascript
复制
private JournalItem convert(PersistentRepr p) {
    if (p.payload() instanceof Tagged) {
        Tagged taggedMsg = (Tagged) p.payload();
        PersistentRepr persistentReprWithoutTag = new PersistentImpl(taggedMsg.payload(), p.sequenceNr(), p.persistenceId(), p.manifest(), p.deleted(), p.sender(), p.writerUuid());
        return new JournalItem(persistentReprWithoutTag.sequenceNr(), persistentReprWithoutTag.persistenceId(), serializer.toBinary(persistentReprWithoutTag), JavaConverters.asJavaCollection(taggedMsg.tags()));
    } else {
        return new JournalItem(p.sequenceNr(), p.persistenceId(), serializer.toBinary(p), null);
    }

}

票数 0
EN

Stack Overflow用户

发布于 2018-11-22 08:54:04

从您的工作流图来看,Akka持久化是第一位的,所以您必须说服它将不可序列化的对象按原样传递给Apache。

我想你可以

  • 为Protobuf指定一个akka.serialization.Serializer实现,该实现将Protobuf转换为Array[Byte]
  • 指定一个akka.serialization.Serializer实现,它将利用Apache的BinaryMarshaller.marshal(Object)。请注意,Apache不会注意到BinaryObject存储在其缓存中,而是将其视为byte[],除非添加某种额外的处理。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53420039

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档