【发布时间】:2014-06-03 13:23:14
【问题描述】:
我想创建一个 Timer Actor 来跟踪整个程序的进度(并估计剩余的执行时间)。由于计时器参与者必须持有可变变量,即“当前进度”,我认为它应该在最高主管下构建,而不是由较低级别的参与者生成。所以我创建了这个:
object Entry extends App {
val system: ActorSystem = ActorSystem("Twitter")
val sup = system.actorOf(Props[Supervisor])
sup ! Sentence(.....)
}
class Supervisor extends Actor {
def receive = {
case sen: Sentence =>
val timer = context.actorOf(Props[Timer])
val pcfg = context.actorOf(Props[PCFGParser])
pcfg ! sen.copy()
}
}
然后我有这个较低的演员来做所有的动作:
class PCFGParser extends Actor{
def receive = {
case sen: Sentence =>
//....business logic
val ps = context.actorOf(Props[PatternSearch]) //create another actor
ps ! sen.copy(tree = Some(tree))
context.actorSelection("../timer") ! PCFGAddOne
}
}
所以在这一点上,我认为它应该将消息发送回那个 Timer Actor。但是如何!?我尝试了actorSelection,但我得到的只是“死信”错误。消息未送达。而且这个 PCFGParser 演员似乎也未能向其子演员和计时器演员发送消息:
[INFO] [06/03/2014 01:35:25.290] [Twitter-akka.actor.default-dispatcher-4] [akka://Twitter/user/$a/$h/$a] 消息[TwitterProject.PCFGParserMsg$Sentence] 来自 Actor[akka://Twitter/user/$a/$h#11 90256968] 到 Actor[akka://Twitter/user/$a/$h/$a#-1918790382] 未交付。 [6] 遇到死信。
[INFO] [06/03/2014 01:35:25.291] [Twitter-akka.actor.default-dispatcher-17] [akka://Twitter/user/$a/$d/../timer ] 来自 Actor[akka://Twitter/user/$a/ 的消息 [TwitterProject.TimerMsg$PCFGAddOne$] $d#-1685001108] 到 Actor[akka://Twitter/user/$a/$d/../timer] 没有送达。 [7] 遇到死信。
首先,我承认这个演员的业务逻辑内部可能有一些错误导致了这个错误(或者真的吗??死演员会触发消息未传递错误吗?)其次,这个 PCFGParser 演员的正确方法是什么向远处的演员发送消息?
谢谢!
【问题讨论】: