【发布时间】:2014-07-27 15:02:51
【问题描述】:
我正在尝试安排在一段时间后发送一条消息 - 一个简单的重试。
override def receive = {
case Worked => ???
case DidNotWork =>
val target = sender() // Avoid closing over sender().
import context._
context.system.scheduler.scheduleOnce(500.milliseconds, target, TryAgain)
}
这按预期工作,但是,当我收到TryAgain 消息并访问sender() 以尝试将ActorRef 获取到此对象时,我得到DeadLetters。为什么会这样?
(请注意,问题在于另一个参与者中的 sender() 调用,它不在闭包中 - 这不是我关闭 sender() 的问题):
override def receive = {
case TryOnce => sender() ! DidNotWork
case TryAgain => sender() ! Worked // sender() here is DeadLetters!
}
完整示例(回复cmbaxter's comment):
import akka.actor.{Props, ActorSystem, Actor}
import scala.concurrent.duration._
object Main {
def main(args: Array[String]) {
val sys = ActorSystem("Test")
val test = sys.actorOf(Props[Test], "test-actor")
test ! "badtest"
test ! "goodtest"
}
}
class Test extends Actor {
override def receive = {
case "badtest" =>
import context._
context.system.scheduler.scheduleOnce(10.milliseconds, this.self, "bad")
case "goodtest" =>
import context.dispatcher
context.system.scheduler.scheduleOnce(10.milliseconds, this.self, "good")
case other => println(s"$sender $other")
}
}
产生:
Actor[akka://Test/deadLetters] bad
Actor[akka://Test/user/test-actor#621986067] good
【问题讨论】: