Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

akka-remote serializable warning

Tags:

scala

akka

I was playing with akka remoting and created a small Scala application which sends messages to other Scala apps. That was fine, the receiver application managed to receive the messages, however I got strange serialization warning (like below). I tried to configure serialization following the documentation of akka.io remoting, but didn't manage to find a setup which get rid of those warnings.

I though that I did something wrong and cloned akka/akka github repo, I sbt run akka-samples/akka-sample-remote-scala. I surprised that they have the same errors.

[WARN] [03/29/2016 16:53:40.137] [LookupSystem-akka.remote.default-remote-dispatcher-8] [akka.serialization.Serialization(akka://LookupSystem)] Using the default Java serializer for class [sample.remote.calculator.Subtract] which is not recommended because of performance implications. Use another serializer or disable this warning using the setting 'akka.actor.warn-about-java-serializer-usage'

Anyone can point me the right direction? Thanks.

like image 476
Richard Jonas Avatar asked Mar 29 '16 15:03

Richard Jonas


2 Answers

Well, it's not an error, it's just a warning. Akka uses the Java serialization for user messages so people get started quickly, without having to define any mappings or the like. But you don't want to use it in production, as it's pretty slow. So if you're just playing around, you can ignore the warning (or even disable it in the config as the message explains). For serious business, use JSON, Avro, Kryo, Protobuf...

Define your own serializer in the config

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
    }
  }
}

You only need to specify the name of an interface or abstract base class of the messages. In case of ambiguity, i.e. the message implements several of the configured classes, the most specific configured class will be used, i.e. the one of which all other candidates are superclasses.

This was taken from http://doc.akka.io/docs/akka/2.4.2/scala/serialization.html#serialization-scala

The topic is also covered in the awesome "Zen of Akka" presentation, chapter 7.

like image 89
lutzh Avatar answered Sep 23 '22 09:09

lutzh


I think lutzh's answer is quite complete. I can only add that if you want to disable this warning you should set following configuration setting:

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

Using Java serialization is fine if you are only testing, playing around or don't care about performance for any reason.

like image 27
wlk Avatar answered Sep 24 '22 09:09

wlk