Пользовательский плагин Akka persistance TCK, Как поддерживать не Java сериализацию для типа Tagged? - PullRequest
0 голосов
/ 21 ноября 2018

Я создаю подключаемый модуль Akka Persistence с помощью Apache ignite, у меня возникает вопрос, когда дело доходит до тегов событий, если я отключаю сериализацию Java (allow-java-serialization = no), теговый тип не может быть правильно сериализован, поскольку я используюProtobuf для событий, есть ли способ настроить конкретную сериализацию для оболочки с тегами Event или это нужно обрабатывать в самом плагине?GitHub для моего плагина: https://github.com/Romeh/akka-persistance-ignite

Исключение, которое я получаю:

[2018-11-21 21:20:48] [orderManagerSystem-akka.actor.default-dispatcher-27] ОШИБКА apijournal.IgniteWriteJournal - Попытка сериализации сообщения с использованием сериализации Java, когда akka.actor.allow-java-serialization было отключено.Проверьте журналы WARNING для более подробной информации.akka.serialization.DisabledJavaSerializer $ JavaSerializationException: Попытка сериализации сообщения с использованием сериализации Java, пока akka.actor.allow-java-serialization была отключена.Проверьте журналы WARNING для более подробной информации.[2018-11-21 21:20:48] [orderManagerSystem-akka.actor.default-dispatcher-11] WARN asDisabledJavaSerializer - при исходящем сообщении была предпринята попытка использовать сериализацию Java, даже если akka.actor.allow-java-serialization = off было задано!Тип сообщения был: [class akka.persistence.journal.Tagged]

У меня есть пример приложения, где эта проблема возникает для меня, где я использую Protobuf для сериализации событий, нужно ли мне делать то же самое для события Taggedтип ?

Пример кода GitHub URL: https://github.com/Romeh/spring-boot-akka-event-sourcing-starter/tree/master/spring-event-sourcing-example

В Apache ignite это двоичная сериализация.

Огромное спасибо за вашу помощь!

Ответы [ 2 ]

0 голосов
/ 29 ноября 2018

На самом деле проблема была решена путем проверки типа сообщения, является ли оно теговым событием или нет, прежде чем делать фактическое сохранение события в журнале, что-то вроде:

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 голосов
/ 22 ноября 2018

Судя по диаграмме вашего рабочего процесса, настойчивость Akka стоит на первом месте, поэтому вам нужно убедить ее передать непериализуемые объекты в Apache Ignite как есть.

Я думаю, вы можете либо

  • Укажите akka.serialization.Serializer реализацию для Protobuf, которая превратит Protobuf в Array[Byte]
  • Укажите akka.serialization.Serializer реализацию, которая будет использовать BinaryMarshaller.marshal (Object) в Apache Ignite.Обратите внимание, что Apache Ignite не будет знать, что BinaryObject хранится в его кешах, но будет воспринимать его как byte[], если вы не добавите какую-либо дополнительную обработку.
...