From 2837ebba6ebf5ef1c7379317f173e497aaa2ee64 Mon Sep 17 00:00:00 2001 From: Elijah Rippeth Date: Wed, 1 Nov 2017 19:22:09 -0400 Subject: [PATCH] adds serializer for akka.Done. #23854 (cherry picked from commit 53a543788494d7b6457f129b1ad4ff57ff530584) --- akka-actor/src/main/scala/akka/Done.scala | 5 ++++- akka-docs/src/main/paradox/serialization.md | 11 ++++++++--- akka-remote/src/main/resources/reference.conf | 6 ++++++ .../remote/serialization/MiscMessageSerializer.scala | 5 +++++ .../serialization/MiscMessageSerializerSpec.scala | 4 ++++ 5 files changed, 27 insertions(+), 4 deletions(-) diff --git a/akka-actor/src/main/scala/akka/Done.scala b/akka-actor/src/main/scala/akka/Done.scala index 65c6eed8b6b..4a0c60b574e 100644 --- a/akka-actor/src/main/scala/akka/Done.scala +++ b/akka-actor/src/main/scala/akka/Done.scala @@ -3,12 +3,15 @@ */ package akka +import java.io.Serializable +import akka.annotation.DoNotInherit + /** * Typically used together with `Future` to signal completion * but there is no actual value completed. More clearly signals intent * than `Unit` and is available both from Scala and Java (which `Unit` is not). */ -sealed abstract class Done +@DoNotInherit sealed abstract class Done extends Serializable case object Done extends Done { /** diff --git a/akka-docs/src/main/paradox/serialization.md b/akka-docs/src/main/paradox/serialization.md index 5b2027defa3..9bfc5c62d06 100644 --- a/akka-docs/src/main/paradox/serialization.md +++ b/akka-docs/src/main/paradox/serialization.md @@ -41,11 +41,16 @@ depending on the akka-remote module), so normally you don't need to add configuration for that; since `com.google.protobuf.GeneratedMessage` implements `java.io.Serializable`, protobuf messages will always be serialized using the protobuf protocol unless specifically overridden. In order -to disable a default serializer, map its marker type to “none”: +to disable a default serializer, see @ref:[Disabling the Java Serializer](remoting.md#disable-java-serializer) + +### Enable additional bindings + +`akka.Done` is by default serialized by the Java serializer, add the following binding to avoid that. +It's not enabled by default for compatibility reasons. ``` akka.actor.serialization-bindings { - "java.io.Serializable" = none + "akka.Done" = akka-misc } ``` @@ -251,4 +256,4 @@ incompatibility as Java serialization does. [Akka-kryo by Roman Levenstein](https://github.com/romix/akka-kryo-serialization) -[Twitter Chill Scala extensions for Kryo (based on Akka Version 2.3.x but due to backwards compatibility of the Serializer Interface this extension also works with 2.4.x)](https://github.com/twitter/chill) \ No newline at end of file +[Twitter Chill Scala extensions for Kryo (based on Akka Version 2.3.x but due to backwards compatibility of the Serializer Interface this extension also works with 2.4.x)](https://github.com/twitter/chill) diff --git a/akka-remote/src/main/resources/reference.conf b/akka-remote/src/main/resources/reference.conf index 0411662c4c3..0576308d94a 100644 --- a/akka-remote/src/main/resources/reference.conf +++ b/akka-remote/src/main/resources/reference.conf @@ -49,6 +49,12 @@ akka { "com.google.protobuf.GeneratedMessage" = proto "java.util.Optional" = akka-misc + + # akka.Done is handled by the MiscMessageSerializer, but it is not enabled for + # compatibility reasons (it was added in Akka 2.5.8). Enable by adding + # akka.actor.serialization-bindings { + # "akka.Done" = akka-misc + # } } # Additional serialization-bindings that are replacing Java serialization are diff --git a/akka-remote/src/main/scala/akka/remote/serialization/MiscMessageSerializer.scala b/akka-remote/src/main/scala/akka/remote/serialization/MiscMessageSerializer.scala index 0065dd455c2..5871ff945b1 100644 --- a/akka-remote/src/main/scala/akka/remote/serialization/MiscMessageSerializer.scala +++ b/akka-remote/src/main/scala/akka/remote/serialization/MiscMessageSerializer.scala @@ -8,6 +8,7 @@ import java.nio.charset.StandardCharsets import java.util.Optional import java.util.concurrent.TimeUnit +import akka.Done import akka.actor._ import akka.dispatch.Dispatchers import akka.remote.routing.RemoteRouterConfig @@ -43,6 +44,7 @@ class MiscMessageSerializer(val system: ExtendedActorSystem) extends SerializerW case PoisonPill ⇒ ParameterlessSerializedMessage case Kill ⇒ ParameterlessSerializedMessage case RemoteWatcher.Heartbeat ⇒ ParameterlessSerializedMessage + case Done ⇒ ParameterlessSerializedMessage case hbrsp: RemoteWatcher.HeartbeatRsp ⇒ serializeHeartbeatRsp(hbrsp) case rs: RemoteScope ⇒ serializeRemoteScope(rs) case LocalScope ⇒ ParameterlessSerializedMessage @@ -253,6 +255,7 @@ class MiscMessageSerializer(val system: ExtendedActorSystem) extends SerializerW private val PoisonPillManifest = "P" private val KillManifest = "K" private val RemoteWatcherHBManifest = "RWHB" + private val DoneManifest = "DONE" private val RemoteWatcherHBRespManifest = "RWHR" private val ActorInitializationExceptionManifest = "AIEX" private val LocalScopeManifest = "LS" @@ -281,6 +284,7 @@ class MiscMessageSerializer(val system: ExtendedActorSystem) extends SerializerW PoisonPillManifest → ((_) ⇒ PoisonPill), KillManifest → ((_) ⇒ Kill), RemoteWatcherHBManifest → ((_) ⇒ RemoteWatcher.Heartbeat), + DoneManifest → ((_) ⇒ Done), RemoteWatcherHBRespManifest → deserializeHeartbeatRsp, ActorInitializationExceptionManifest → deserializeActorInitializationException, LocalScopeManifest → ((_) ⇒ LocalScope), @@ -311,6 +315,7 @@ class MiscMessageSerializer(val system: ExtendedActorSystem) extends SerializerW case PoisonPill ⇒ PoisonPillManifest case Kill ⇒ KillManifest case RemoteWatcher.Heartbeat ⇒ RemoteWatcherHBManifest + case Done ⇒ DoneManifest case _: RemoteWatcher.HeartbeatRsp ⇒ RemoteWatcherHBRespManifest case LocalScope ⇒ LocalScopeManifest case _: RemoteScope ⇒ RemoteScopeManifest diff --git a/akka-remote/src/test/scala/akka/remote/serialization/MiscMessageSerializerSpec.scala b/akka-remote/src/test/scala/akka/remote/serialization/MiscMessageSerializerSpec.scala index 3b0c6ed002b..786cb6548ce 100644 --- a/akka-remote/src/test/scala/akka/remote/serialization/MiscMessageSerializerSpec.scala +++ b/akka-remote/src/test/scala/akka/remote/serialization/MiscMessageSerializerSpec.scala @@ -15,6 +15,7 @@ import scala.concurrent.duration._ import java.util.Optional import java.io.NotSerializableException +import akka.Done import akka.remote.routing.RemoteRouterConfig import akka.routing._ @@ -23,6 +24,8 @@ object MiscMessageSerializerSpec { """ akka.actor.serialization-bindings { "akka.remote.serialization.MiscMessageSerializerSpec$TestException" = akka-misc + # not enabled by default + "akka.Done" = akka-misc } """ @@ -85,6 +88,7 @@ class MiscMessageSerializerSpec extends AkkaSpec(MiscMessageSerializerSpec.testC "PoisonPill" → PoisonPill, "RemoteWatcher.Heartbeat" → RemoteWatcher.Heartbeat, "RemoteWatcher.HertbeatRsp" → RemoteWatcher.HeartbeatRsp(65537), + "Done" → Done, "LocalScope" → LocalScope, "RemoteScope" → RemoteScope(Address("akka", "system", "localhost", 2525)), "Config" → system.settings.config,