2016-03-29 2 views
2

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

Я, хотя я сделал что-то неправильно и клонировал akka/akka github repo, I sbt run akka-samples/akka-sample-remote-scala. Я удивился, что у них такие же ошибки.

[WARN] [03/29/2016 16: 53: 40,137] [LookupSystem-akka.remote.default-дистанционный диспетчер-8] [akka.serialization.Serialization (Akka: // LookupSystem)] Использование стандартного Java-сериализатора для класса [sample.remote.calculator.Subtract], который не рекомендуется из-за последствий для производительности. Используйте другой сериализатор или отключите это предупреждение, используя настройку «akka.actor.warn-about-java-serializer-usage»

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

ответ

5

Ну, это не ошибка, это всего лишь предупреждение. 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#serialization-scala

тема также рассматривается в удивительном "Zen of Akka" презентации, глава 7.

4

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

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

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

Смежные вопросы