我正在查看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
我的问题是我写了一个代码,其中提供了路由,而且他们不是孩子。正如所料,上述方法不起作用。这里需要的代码是什么?
答案 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
}
}