From 234238c7274836b5b64341b512c9cb008a448fea Mon Sep 17 00:00:00 2001 From: Patrik Nordwall Date: Mon, 5 May 2014 08:17:07 +0200 Subject: [PATCH] =act #15102 No serialization needed for EventStreamUnsubscriber * The problem was that akka://all-systems/StandardOutLogger ref was passed during system shutdown * Add special serialization of StandardOutLogger, and Nobody --- .gitignore | 1 + akka-actor/src/main/scala/akka/actor/ActorRef.scala | 13 +++++++++++++ akka-actor/src/main/scala/akka/event/Logging.scala | 13 +++++++++++++ 3 files changed, 27 insertions(+) diff --git a/.gitignore b/.gitignore index 6280a4415b..0203d83f23 100755 --- a/.gitignore +++ b/.gitignore @@ -73,4 +73,5 @@ tm*.log tm.out worker*.log *-shim.sbt +test-output diff --git a/akka-actor/src/main/scala/akka/actor/ActorRef.scala b/akka-actor/src/main/scala/akka/actor/ActorRef.scala index 0e03c92bc5..b11e144c35 100644 --- a/akka-actor/src/main/scala/akka/actor/ActorRef.scala +++ b/akka-actor/src/main/scala/akka/actor/ActorRef.scala @@ -274,6 +274,19 @@ private[akka] abstract class ActorRefWithCell extends InternalActorRef { this: A private[akka] case object Nobody extends MinimalActorRef { override val path: RootActorPath = new RootActorPath(Address("akka", "all-systems"), "/Nobody") override def provider = throw new UnsupportedOperationException("Nobody does not provide") + + private val serialized = new SerializedNobody + + @throws(classOf[java.io.ObjectStreamException]) + override protected def writeReplace(): AnyRef = serialized +} + +/** + * INTERNAL API + */ +@SerialVersionUID(1L) private[akka] class SerializedNobody extends Serializable { + @throws(classOf[java.io.ObjectStreamException]) + private def readResolve(): AnyRef = Nobody } /** diff --git a/akka-actor/src/main/scala/akka/event/Logging.scala b/akka-actor/src/main/scala/akka/event/Logging.scala index e4023275d3..5ab212d426 100644 --- a/akka-actor/src/main/scala/akka/event/Logging.scala +++ b/akka-actor/src/main/scala/akka/event/Logging.scala @@ -782,6 +782,19 @@ object Logging { override def !(message: Any)(implicit sender: ActorRef = Actor.noSender): Unit = if (message == null) throw new InvalidMessageException("Message is null") else print(message) + + @throws(classOf[java.io.ObjectStreamException]) + override protected def writeReplace(): AnyRef = serializedStandardOutLogger + } + + private val serializedStandardOutLogger = new SerializedStandardOutLogger + + /** + * INTERNAL API + */ + @SerialVersionUID(1L) private[akka] class SerializedStandardOutLogger extends Serializable { + @throws(classOf[java.io.ObjectStreamException]) + private def readResolve(): AnyRef = Logging.StandardOutLogger } val StandardOutLogger = new StandardOutLogger