Switching approaches for EmptyLocalActorRef and DeadLetterActorRef

This commit is contained in:
Viktor Klang 2012-05-29 16:36:24 +02:00
parent e86910c1da
commit a413a9394b

View file

@ -415,15 +415,20 @@ private[akka] class EmptyLocalActorRef(override val provider: ActorRefProvider,
override def isTerminated(): Boolean = true
override def sendSystemMessage(message: SystemMessage): Unit = message match {
case Watch(watchee, watcher) if (watchee == this && watcher != this) watcher ! Terminated(watchee)(stopped = false)
case _
}
override def sendSystemMessage(message: SystemMessage): Unit = specialHandle(message)
override def !(message: Any)(implicit sender: ActorRef = null): Unit = message match {
case DeadLetter(w: Watch, _, _) sendSystemMessage(w)
case d: DeadLetter // do NOT form endless loops, since deadLetters will resend!
case _ eventStream.publish(DeadLetter(message, sender, this))
case d: DeadLetter specialHandle(d.message) // do NOT form endless loops, since deadLetters will resend!
case _ if (!specialHandle(message)) eventStream.publish(DeadLetter(message, sender, this))
}
protected def specialHandle(msg: Any): Boolean = msg match {
case w: Watch
if (w.watchee == this && w.watcher != this) w.watcher ! Terminated(w.watchee)(stopped = false)
true
case w: Unwatch true // Just ignore
case _ false
}
}
@ -437,15 +442,18 @@ private[akka] class DeadLetterActorRef(_provider: ActorRefProvider,
_path: ActorPath,
_eventStream: EventStream) extends EmptyLocalActorRef(_provider, _path, _eventStream) {
override def sendSystemMessage(message: SystemMessage): Unit = message match {
case Watch(watchee, watcher) if (watchee != this && watcher != this) watcher ! Terminated(watchee)(stopped = false)
case _
override def !(message: Any)(implicit sender: ActorRef = this): Unit = message match {
case d: DeadLetter if (!specialHandle(d.message)) eventStream.publish(d)
case _ if (!specialHandle(message)) eventStream.publish(DeadLetter(message, sender, this))
}
override def !(message: Any)(implicit sender: ActorRef = this): Unit = message match {
case DeadLetter(w: Watch, _, _) sendSystemMessage(w)
case d: DeadLetter eventStream.publish(d)
case _ eventStream.publish(DeadLetter(message, sender, this))
override protected def specialHandle(msg: Any): Boolean = msg match {
case w: Watch
if (w.watchee != this && w.watcher != this) w.watcher ! Terminated(w.watchee)(stopped = false)
true
case w: Unwatch true // Just ignore
case _ false
}
@throws(classOf[java.io.ObjectStreamException])