diff --git a/akka-actor/src/main/scala/actor/Actor.scala b/akka-actor/src/main/scala/actor/Actor.scala index 6667f7fbc4..8a7b045475 100644 --- a/akka-actor/src/main/scala/actor/Actor.scala +++ b/akka-actor/src/main/scala/actor/Actor.scala @@ -34,8 +34,16 @@ abstract class RemoteActor(address: InetSocketAddress) extends Actor { */ @serializable sealed trait LifeCycleMessage -case class HotSwap(code: Actor.Receive) extends LifeCycleMessage { - def this(behavior: Procedure[Any]) = this({ case msg => behavior.apply(msg) }: Actor.Receive) +case class HotSwap(code: ActorRef => Actor.Receive) extends LifeCycleMessage { + /** + * Java API + */ + def this(code: akka.japi.Function[ActorRef,Procedure[Any]]) = + this( (self: ActorRef) => { + val behavior = code(self) + val result: Actor.Receive = { case msg => behavior(msg) } + result + }) } case object RevertHotSwap extends LifeCycleMessage @@ -66,7 +74,7 @@ class ActorInitializationException private[akka](message: String) extends AkkaEx class ActorTimeoutException private[akka](message: String) extends AkkaException(message) /** - * This message is thrown by default when an Actors behavior doesn't match a message + * This message is thrown by default when an Actors behavior doesn't match a message */ case class UnhandledMessageException(msg: Any, ref: ActorRef) extends Exception { override def getMessage() = "Actor %s does not handle [%s]".format(ref,msg) @@ -426,7 +434,7 @@ trait Actor extends Logging { private lazy val processingBehavior: Receive = { lazy val defaultBehavior = receive val actorBehavior: Receive = { - case HotSwap(code) => become(code) + case HotSwap(code) => become(code(self)) case RevertHotSwap => unbecome case Exit(dead, reason) => self.handleTrapExit(dead, reason) case Link(child) => self.link(child) @@ -444,7 +452,7 @@ trait Actor extends Logging { private lazy val fullBehavior: Receive = { lazy val defaultBehavior = receive val actorBehavior: Receive = { - case HotSwap(code) => become(code) + case HotSwap(code) => become(code(self)) case RevertHotSwap => unbecome case Exit(dead, reason) => self.handleTrapExit(dead, reason) case Link(child) => self.link(child) diff --git a/akka-actor/src/test/scala/actor/actor/HotSwapSpec.scala b/akka-actor/src/test/scala/actor/actor/HotSwapSpec.scala index 5fc9e119a0..011141c746 100644 --- a/akka-actor/src/test/scala/actor/actor/HotSwapSpec.scala +++ b/akka-actor/src/test/scala/actor/actor/HotSwapSpec.scala @@ -16,11 +16,11 @@ class HotSwapSpec extends WordSpec with MustMatchers { val a = actorOf( new Actor { def receive = { case _ => _log += "default" } }).start - a ! HotSwap { + a ! HotSwap( self => { case _ => _log += "swapped" barrier.await - } + }) a ! "swapped" barrier.await _log must be ("swapped") @@ -71,11 +71,11 @@ class HotSwapSpec extends WordSpec with MustMatchers { barrier.reset _log = "" - a ! HotSwap { + a ! HotSwap(self => { case "swapped" => _log += "swapped" barrier.await - } + }) a ! "swapped" barrier.await diff --git a/akka-actor/src/test/scala/actor/actor/ReceiveTimeoutSpec.scala b/akka-actor/src/test/scala/actor/actor/ReceiveTimeoutSpec.scala index b47b6830b4..e469ab43d1 100644 --- a/akka-actor/src/test/scala/actor/actor/ReceiveTimeoutSpec.scala +++ b/akka-actor/src/test/scala/actor/actor/ReceiveTimeoutSpec.scala @@ -41,7 +41,7 @@ class ReceiveTimeoutSpec extends JUnitSuite { assert(timeoutLatch.tryAwait(3, TimeUnit.SECONDS)) val swappedLatch = new StandardLatch - timeoutActor ! HotSwap({ + timeoutActor ! HotSwap(self => { case ReceiveTimeout => swappedLatch.open })