如何创建接收的计时器Actor

时间:2014-06-03 13:23:14

标签: scala akka

我想创建一个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演员的正确方法是什么向远方演员发送消息?

谢谢!

1 个答案:

答案 0 :(得分:0)

如果您想通过相对路径(如

)访问您的Timer actor
context.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()
  }
}