我正在用Apache ignite构建Akka持久性插件,当涉及事件标记时,我有一个问题,如果我禁用Java序列化(allow-java-serialization = no),则标记类型在我使用时无法正确序列化Protobuf for events,是否可以为Event Tagged包装器配置特定的序列化,还是需要在插件本身中处理? 我的插件的GitHub:https://github.com/Romeh/akka-persistance-ignite
我得到的例外是:
[2018-11-21 21:20:48] [orderManagerSystem-akka.actor.default-dispatcher-27]错误a.p.i.journal.IgniteWriteJournal-尝试在禁用akka.actor.allow-java-serialization
时使用Java序列化对消息进行序列化。检查警告日志以获取更多详细信息。
akka.serialization.DisabledJavaSerializer $ JavaSerializationException:在禁用akka.actor.allow-java-serialization
的情况下,尝试使用Java序列化对消息进行序列化。检查警告日志以获取更多详细信息。
[2018-11-21 21:20:48] [orderManagerSystem-akka.actor.default-dispatcher-11]警告a.s.DisabledJavaSerializer-即使设置了akka.actor.allow-java-serialization = off
,外发消息仍尝试使用Java序列化!消息类型为:[class akka.persistence.journal.Tagged]
我有一个示例应用程序,其中使用Protobuf进行事件序列化的问题对于我来说是正在发生的,是否需要对事件标记类型进行相同的处理?
GitHub URL示例代码: https://github.com/Romeh/spring-boot-akka-event-sourcing-starter/tree/master/spring-event-sourcing-example
在Apache ignite中,它是二进制序列化。
非常感谢您!
答案 0 :(得分:0)
从您的工作流图来看,Akka持久性是第一位的,因此您必须说服它将不可序列化的对象原样传递给Apache Ignite。
我想你可以
akka.serialization.Serializer
实现,它将Protobuf转换为Array[Byte]
akka.serialization.Serializer
实现,它将利用Apache Ignite的BinaryMarshaller.marshal(Object)。请注意,除非您添加某种额外的处理方法,否则Apache Ignite不会意识到BinaryObject将存储在其缓存中,但会将其视为byte[]
。答案 1 :(得分:0)
实际上,通过在日志中存储实际事件之前检查msg类型是否为Tagged事件,可以解决此问题,例如:
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);
}
}