我想创建一个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 actor也无法向其子actor和Timer Actor发送消息:
[INFO] [06/03/2014 01:35:25.290] [Twitter-akka.actor.default-dispatcher-4] [akka:// Twitter / user / $ a / $ h / $ a]留言来自演员的[TwitterProject.PCFGParserMsg $ Sentence] [akka:// Twitter / user / $ a / $ h#11 90256968]对于演员[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的消息[TwitterProject.TimerMsg $ PCFGAddOne $] [akka:// Twitter / user / $ a / $ d#-1685001108]演员[akka://Twitter/user/$a/$d/../timer]未送达。 [7]遇到死信。
首先,我承认可能存在一些错误,这个错误导致这个角色的业务逻辑导致了这个错误(或者真的??死亡的演员可能触发消息未传递错误吗?)其次,这个PCFGParser演员的正确方法是什么向远方演员发送消息?
谢谢!
答案 0 :(得分:0)
如果您想通过相对路径(如
)访问您的Timer actorcontext.actorSelection("../timer")
首先需要将此Timer实例命名为“timer”
val timer = context.actorOf(Props[Timer], name = "timer")
另一点,如果您在context.actorOf
块中使用Receive
,您将为每个处理的消息创建新的actor实例。我不认为这是你想要做的。
例如,如果每个Supervisor actor的实例都是唯一的,那么你应该写一下。
class Supervisor extends Actor {
val timer = context.actorOf(Props[Timer])
val pcfg = context.actorOf(Props[PCFGParser])
def receive = {
case sen: Sentence => pcfg ! sen.copy()
}
}