Changing signature for HotSwap to include self-reference, closing ticket #540
This commit is contained in:
parent
d80883c063
commit
2e12337d78
3 changed files with 18 additions and 10 deletions
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
})
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue