Changing signature for HotSwap to include self-reference, closing ticket #540

This commit is contained in:
Viktor Klang 2010-11-20 22:03:57 +01:00
parent d80883c063
commit 2e12337d78
3 changed files with 18 additions and 10 deletions

View file

@ -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)

View file

@ -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

View file

@ -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
})