Akka路由器向工作人员发送消息

时间:2015-11-08 04:14:02

标签: scala akka

我正在查看Akka文档中有关路由器的一些示例。

来自文档:

默认情况下,当routee发送邮件时,它会隐式将自己设置为发件人。

sender ! x // replies will go to this actor

但是,路由器将路由器设置为发送方通常很有用。例如,如果要隐藏路由器后面路由的详细信息,可能需要将路由器设置为发送方。以下代码段显示了如何将父路由器设置为发件人。

sender.tell("reply", context.parent) // replies will go back to parent
sender.!("reply")(context.parent) // alternative syntax (beware of the parens!)

请注意,如果路由不是路由器的子节点,则需要使用不同的代码,即如果在创建路由器时提供了这些代码。

链接:http://doc.akka.io/docs/akka/2.2.3/scala/routing.html

我的问题是我写了一个代码,其中提供了路由,而且他们不是孩子。正如所料,上述方法不起作用。这里需要的代码是什么?

1 个答案:

答案 0 :(得分:1)

你可能想要做的就是让路由器发送它的" self"引用每个路由,然后通过以下方式设置发送方:

sender.tell("reply", routerRef) // or
sender.!("reply")(routerRef)

您需要确定一个合适的消息(可能只是一个ActorRef,或者可能是一个建议使用的案例类,例如:case class RouterRef(ref: ActorRef)),并让routee接收方法能够接受这样的消息一条消息并存储它。一个例子可能是:

class MyRoutee(...) extends Actor with ActorLogging with ... {

  import context._

  def receive = init

  def init: Receive = LoggingReceive { // Initially waits for router ref (and/or any other initialisation info it needs to be fed with)
    case RouterRef(ref) => become(active(ref)) // Received the router ref - change behaviour
  }

  def active(routerRef: ActorRef): Receive = LoggingReceive {
    ... // Normal running mode - routerRef is available
  }

}