如何为由system.actorOf创建的actor设置Akka supervisor

时间:2014-08-01 10:54:55

标签: akka actor

如何为使用系统上下文创建的两个actor设置两个不同的超级用户策略:

val exporter = system.actorOf(Props[DataExporter], name = "dataExporter")
val communicator = system.actorOf(Props[DeviceCommunicator], name = "deviceCommunicator")

我可以在处理异常期间检查演员类型吗?

2 个答案:

答案 0 :(得分:4)

不是让顶级演员旋转并让Akka对他们采取不同的行动,你应该创建更深层次的演员层次。

你应该创建定义不同策略的顶级演员(system.actorOf),然后他们应该创建你的“工人”演员。所以你会有2个顶级演员 - 按照你的解释定义策略。他们应该使用context.actorOf开始儿童演员。通过这种方式,您可以定义“当我的孩子失败时该怎么做”的层次结构。

换句话说,将顶级演员保持为“监督者”,在那里定义监督,并让他们创造孩子来完成实际工作。

另请参阅文档:Fault Tolerance

答案 1 :(得分:2)

我认为没有办法在一个演员内部定义多个监督策略。但是你可以创建另一个包含两个actor的层,每个actor都实现一个特定的策略,并让它们将消息转发给相应的worker actor。

val exporter = system.actorOf(Props[DataExporterSupervisor], ...)
val communicator = system.actorOf(Props[DeviceCommunicatorSupervisor], ...)


class DataExporterSupervisor extends Actor {

  val exporter = system.actorOf(Props[DataExporter], ...)

  override val supervisorStrategy = ???

  def receive = {
    case _ => exporter forward _
  }
}


class DeviceCommunicatorSupervisor extends Actor {

  val communicator = system.actorOf(Props[DeviceCommunicator], ...)

  override val supervisorStrategy = ???

  def receive = {
    case _ => communicator forward _
  }
}