我正在使用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中,它是二进制序列化。
非常感谢你的帮助!
发布于 2018-11-29 14:31:40
实际上,在执行日志中的实际事件存储之前,如果msg类型是标记的或不是标记的,就可以通过检查msg类型来解决问题,如下所示:
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);
}}
发布于 2018-11-22 08:54:04
从您的工作流图来看,Akka持久化是第一位的,所以您必须说服它将不可序列化的对象按原样传递给Apache。
我想你可以
akka.serialization.Serializer实现,该实现将Protobuf转换为Array[Byte]akka.serialization.Serializer实现,它将利用Apache的BinaryMarshaller.marshal(Object)。请注意,Apache不会注意到BinaryObject存储在其缓存中,而是将其视为byte[],除非添加某种额外的处理。https://stackoverflow.com/questions/53420039
复制相似问题