=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:
parent
6b6a16637b
commit
146bb89e23
8 changed files with 43 additions and 3 deletions
|
|
@ -1,6 +1,7 @@
|
||||||
akka {
|
akka {
|
||||||
actor {
|
actor {
|
||||||
serialize-messages = on
|
serialize-messages = on
|
||||||
|
warn-about-java-serializer-usage = off
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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] trait TestSerializable
|
||||||
|
|
||||||
protected[akka] class TestSerializer extends Serializer {
|
protected[akka] class TestSerializer extends Serializer {
|
||||||
|
|
|
||||||
|
|
@ -501,7 +501,13 @@ akka {
|
||||||
"[B" = bytes
|
"[B" = bytes
|
||||||
"java.io.Serializable" = java
|
"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.
|
# Configuration namespace of serialization identifiers.
|
||||||
# Each serializer implementation must have an entry in the following format:
|
# Each serializer implementation must have an entry in the following format:
|
||||||
# `akka.actor.serialization-identifiers."FQCN" = ID`
|
# `akka.actor.serialization-identifiers."FQCN" = ID`
|
||||||
|
|
|
||||||
|
|
@ -177,6 +177,11 @@ class Serialization(val system: ExtendedActorSystem) extends Extension {
|
||||||
}
|
}
|
||||||
serializerMap.putIfAbsent(clazz, ser) match {
|
serializerMap.putIfAbsent(clazz, ser) match {
|
||||||
case null ⇒
|
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)
|
log.debug("Using serializer[{}] for message [{}]", ser.getClass.getName, clazz.getName)
|
||||||
ser
|
ser
|
||||||
case some ⇒ some
|
case some ⇒ some
|
||||||
|
|
@ -241,5 +246,10 @@ class Serialization(val system: ExtendedActorSystem) extends Extension {
|
||||||
val serializerByIdentity: Map[Int, Serializer] =
|
val serializerByIdentity: Map[Int, Serializer] =
|
||||||
Map(NullSerializer.identifier -> NullSerializer) ++ serializers map { case (_, v) ⇒ (v.identifier, v) }
|
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.")
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
akka {
|
akka {
|
||||||
actor {
|
actor {
|
||||||
serialize-creators = on
|
serialize-creators = on
|
||||||
serialize-messages = on
|
serialize-messages = on
|
||||||
|
warn-about-java-serializer-usage = off
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -38,6 +38,8 @@ class OptionalSnapshotStoreSpec extends PersistenceSpec(ConfigFactory.parseStrin
|
||||||
akka.persistence.journal.plugin = "akka.persistence.journal.inmem"
|
akka.persistence.journal.plugin = "akka.persistence.journal.inmem"
|
||||||
akka.persistence.journal.leveldb.dir = "target/journal-${classOf[OptionalSnapshotStoreSpec].getName}"
|
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
|
# snapshot store plugin is NOT defined, things should still work
|
||||||
akka.persistence.snapshot-store.local.dir = "target/snapshots-${classOf[OptionalSnapshotStoreSpec].getName}/"
|
akka.persistence.snapshot-store.local.dir = "target/snapshots-${classOf[OptionalSnapshotStoreSpec].getName}/"
|
||||||
""")) with ImplicitSender {
|
""")) with ImplicitSender {
|
||||||
|
|
|
||||||
|
|
@ -56,6 +56,7 @@ object PersistenceSpec {
|
||||||
s"""
|
s"""
|
||||||
akka.actor.serialize-creators = ${serialization}
|
akka.actor.serialize-creators = ${serialization}
|
||||||
akka.actor.serialize-messages = ${serialization}
|
akka.actor.serialize-messages = ${serialization}
|
||||||
|
akka.actor.warn-about-java-serializer-usage = off
|
||||||
akka.persistence.publish-plugin-commands = on
|
akka.persistence.publish-plugin-commands = on
|
||||||
akka.persistence.journal.plugin = "akka.persistence.journal.${plugin}"
|
akka.persistence.journal.plugin = "akka.persistence.journal.${plugin}"
|
||||||
akka.persistence.journal.leveldb.dir = "target/journal-${test}"
|
akka.persistence.journal.leveldb.dir = "target/journal-${test}"
|
||||||
|
|
|
||||||
|
|
@ -2,5 +2,6 @@ akka {
|
||||||
actor {
|
actor {
|
||||||
serialize-creators = on
|
serialize-creators = on
|
||||||
serialize-messages = on
|
serialize-messages = on
|
||||||
|
warn-about-java-serializer-usage = off
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue