=act #18371 Warn if the default Java serializer is used

Unless the message is in akka.* or the configuration setting 'akka.actor.warn-about-java-serializer-usage'
is disabled a warning is logged for each class that the Java serializer is choosen for.
This commit is contained in:
Johan Andrén 2015-09-24 16:45:51 +02:00
parent 6b6a16637b
commit 146bb89e23
8 changed files with 43 additions and 3 deletions

View file

@ -1,6 +1,7 @@
akka {
actor {
serialize-messages = on
warn-about-java-serializer-usage = off
}
}

View file

@ -416,6 +416,24 @@ class OverriddenSystemMessageSerializationSpec extends AkkaSpec(SerializationTes
}
}
@org.junit.runner.RunWith(classOf[org.scalatest.junit.JUnitRunner])
class DefaultSerializationWarningSpec extends AkkaSpec(
ConfigFactory.parseString("akka.actor.warn-about-java-serializer-usage = on")) {
val ser = SerializationExtension(system)
"Using the default Java serializer" must {
"log a warning" in {
EventFilter.warning(message = "Using the default Java serializer for class.*") intercept {
ser.serializerFor(classOf[java.lang.Integer])
}
}
}
}
protected[akka] trait TestSerializable
protected[akka] class TestSerializer extends Serializer {

View file

@ -502,6 +502,12 @@ akka {
"java.io.Serializable" = java
}
# Log warnings when the default Java serialization is used to serialize messages.
# The default serializer uses Java serialization which is not very performant and should not
# be used in production environments unless you don't care about performance. In that case
# you can turn this off.
warn-about-java-serializer-usage = on
# Configuration namespace of serialization identifiers.
# Each serializer implementation must have an entry in the following format:
# `akka.actor.serialization-identifiers."FQCN" = ID`

View file

@ -177,6 +177,11 @@ class Serialization(val system: ExtendedActorSystem) extends Extension {
}
serializerMap.putIfAbsent(clazz, ser) match {
case null
if (shouldWarnAboutJavaSerializer(clazz, ser)) {
log.warning("Using the default Java serializer for class [{}] 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'", clazz.getName)
}
log.debug("Using serializer[{}] for message [{}]", ser.getClass.getName, clazz.getName)
ser
case some some
@ -241,5 +246,10 @@ class Serialization(val system: ExtendedActorSystem) extends Extension {
val serializerByIdentity: Map[Int, Serializer] =
Map(NullSerializer.identifier -> NullSerializer) ++ serializers map { case (_, v) (v.identifier, v) }
private def shouldWarnAboutJavaSerializer(serializedClass: Class[_], serializer: Serializer) =
settings.config.getBoolean("akka.actor.warn-about-java-serializer-usage") &&
serializer.isInstanceOf[JavaSerializer] &&
!serializedClass.getName.startsWith("akka.")
}

View file

@ -2,5 +2,6 @@ akka {
actor {
serialize-creators = on
serialize-messages = on
warn-about-java-serializer-usage = off
}
}

View file

@ -38,6 +38,8 @@ class OptionalSnapshotStoreSpec extends PersistenceSpec(ConfigFactory.parseStrin
akka.persistence.journal.plugin = "akka.persistence.journal.inmem"
akka.persistence.journal.leveldb.dir = "target/journal-${classOf[OptionalSnapshotStoreSpec].getName}"
akka.actor.warn-about-java-serializer-usage = off
# snapshot store plugin is NOT defined, things should still work
akka.persistence.snapshot-store.local.dir = "target/snapshots-${classOf[OptionalSnapshotStoreSpec].getName}/"
""")) with ImplicitSender {

View file

@ -56,6 +56,7 @@ object PersistenceSpec {
s"""
akka.actor.serialize-creators = ${serialization}
akka.actor.serialize-messages = ${serialization}
akka.actor.warn-about-java-serializer-usage = off
akka.persistence.publish-plugin-commands = on
akka.persistence.journal.plugin = "akka.persistence.journal.${plugin}"
akka.persistence.journal.leveldb.dir = "target/journal-${test}"

View file

@ -2,5 +2,6 @@ akka {
actor {
serialize-creators = on
serialize-messages = on
warn-about-java-serializer-usage = off
}
}