akka-remote сериализуемое предупреждение

Я играл с akka remoting и создал небольшое приложение Scala, которое отправляет сообщения в другие приложения Scala. Это было хорошо, приложению получателя удалось получить сообщения, однако я получил странное предупреждение сериализации (как ниже). Я попытался настроить сериализацию, следуя документации удаленного взаимодействия akka.io, но не смог найти настройки, которые бы избавились от этих предупреждений.

Хотя я сделал что-то не так и клонировал репозиторий akka / akka github, я запускаю akka-samples / akka-sample-remote-scala. Я удивлен, что они имеют одинаковые ошибки.

[ПРЕДУПРЕЖДЕНИЕ] [29.03.2016 16:53:40.137] [LookupSystem-akka.remote.default-remote-dispatcher-8] [akka.serialization.Serialization(akka://LookupSystem)] Использование стандартного сериализатора Java для класс [sample.remote.calculator.Subtract], который не рекомендуется из-за влияния на производительность. Используйте другой сериализатор или отключите это предупреждение, используя параметр "akka.actor.warn-about-java-serializer-Использование"

Кто-нибудь может указать мне правильное направление? Благодарю.

2 ответа

Ну, это не ошибка, это просто предупреждение. Akka использует сериализацию Java для пользовательских сообщений, чтобы люди могли начать работу быстро, без необходимости определять какие-либо сопоставления или тому подобное. Но вы не хотите использовать его в производстве, так как он довольно медленный. Поэтому, если вы просто играете вокруг, вы можете игнорировать предупреждение (или даже отключить его в конфигурации, как объясняется в сообщении). Для серьезного бизнеса используйте JSON, Avro, Kryo, Protobuf...

Определите свой собственный сериализатор в конфиге

akka {
  actor {
    serializers {
      java = "akka.serialization.JavaSerializer"
      proto = "akka.remote.serialization.ProtobufSerializer"
      myown = "docs.serialization.MyOwnSerializer"
    }

    serialization-bindings {
      "java.lang.String" = java
      "docs.serialization.Customer" = java
      "com.google.protobuf.Message" = proto
      "docs.serialization.MyOwnSerializable" = myown
      "java.lang.Boolean" = myown
    }
  }
}

Вам нужно только указать имя интерфейса или абстрактный базовый класс сообщений. В случае неоднозначности, т. Е. В сообщении реализовано несколько настроенных классов, будет использоваться наиболее конкретный настроенный класс, то есть тот, в котором все остальные кандидаты являются суперклассами.

Это было взято с http://doc.akka.io/docs/akka/2.4.2/scala/serialization.html

Тема также освещена в потрясающей презентации "Дзен Акки", глава 7.

Я думаю, что ответ Лутжа довольно полный. Я могу только добавить, что если вы хотите отключить это предупреждение, вы должны установить следующие настройки конфигурации:

akka {
  actor {
    warn-about-java-serializer-usage = false
  }
}

Использование Java-сериализации хорошо, если вы только тестируете, играете или не заботитесь о производительности по какой-либо причине.

Другие вопросы по тегам