akka如何知道哪个特定邮件回复与正确的未来相关联?

时间:2013-04-25 21:30:16

标签: akka actor future

让我说(?)两个回复的同一个演员。 它存储发件人以供日后使用。 之后,它会将消息返回给发件人。我们得到了正确的发件人(对邮件进行了哈希)但Akka如何知道响应的邮件是什么? ActorRef中是否有某些内容指示每个响应的消息是什么?

是'频道'吗?

我想更好地了解基础技术。 我会尝试同时阅读来源,但我认为这是一个非常好的问题。

代码示例:

class TestActor
[...]
def onReceive = {
case r: MessageToGoOut ⇒
      messageId += 1
      val requestId = clientConnectionId + messageId 
      senders += (requestId -> sender) //store sender for later
      anotherActor ! WrappedUpMessage(requestId, MessageOut))

case m: MessageToGoBackToSender ⇒
          val requestId = m.requestId
          senders.get(requestId) map { client ⇒
            client ! Response(m.message)
            senders -= requestId
          }
}


val futures = for(i <- 1 to 100) yield testActor ? new MessageToGoOut ("HEYO!" + i)

现在akka如何确保消息回到正确的演员?

1 个答案:

答案 0 :(得分:3)

每个Actor都有一条路径。从Actor的内部,您可以说:

context.path

Actor外部,如果你有ActorRef,你可以说:

ref.path

此路径如果是该单个actor实例的地址,那么我相信内部路由系统将消息路由到actor实例的邮箱。当您在Actor之外时,就像您在示例中循环和发送消息时一样,当您使用ask?)时,临时Actor实例启动时,当收到消息的Actor需要响应时,它有一个响应的路径。这可能有点过于简单了,可能不是你想要的详细程度,所以如果我错过了你问题的要点,我会道歉。

此外,sender中的Actor变量是ActorRef,因此它有一条路径,您可以路由回来。

创建Future时,akka会创建一个临时(可寻址)Actor,基本上为Future提供服务。当该临时Actor发送给另一个Actor时,其ActorRef将作为发件人进行传输。当接收方正在处理该特定消息时,发件人var被设置为该临时演员的ActorRef,这意味着您有一个要响应的地址。即使您决定稍后保留该发件人,您仍然有一个地址可以发送回并最终完成临时演员正在服务的Future。关键是,只要你有一个ActorRef,无论是请求还是响应,它所做的就是将消息路由到ActorRef的路径。

Ask (?)tell (!)确实差别不大。 Ask基本上是tell,其中发件人期望接收者向tell发回一条消息。