4

同じアクターに 2 つの応答を求める (?) としましょう。送信者を後で保存します。その後、送信者に送信するためにメッセージが返されます。正しい送信者 (メッセージにハッシュされたもの) を取得しますが、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 はメッセージが適切なアクターに確実に戻るようにするにはどうすればよいでしょうか??

4

1 に答える 1

3

それぞれActorに道があります。の中からActor、次のように言えます。

context.path

の外側からActor、 があればActorRef、次のように言うことができます。

ref.path

このパスは、個々のアクター インスタンスのアドレスであり、内部ルーティング システムがアクター インスタンスのメールボックスにメッセージをルーティングすると私が信じている方法です。の外部にいるActor場合、例でループしてメッセージを送信している場合のように、 ask( ?) を使用すると、一時Actorインスタンスが起動されるためActor、メッセージを受信した が応答する必要がある場合に、パスがあります。応答する。これはおそらく少し単純化しすぎており、探している詳細レベルではない可能性があるため、質問の要点を見逃していた場合はお詫び申し上げます.

また、 an のsendervar は anActorであるActorRefため、パスがあるため、そこに戻ることができます。

Futureが作成されると、akka は基本的にその にサービスを提供する一時 (およびアドレス指定可能)をActor作成しFutureます。その一時的なActor送信が別のActorActorRef送信されると、送信者として送信されます。受信アクターがその特定のメッセージを処理している場合、送信者はその一時アクターvarの に設定されます。これは、応答するアドレスがあることを意味します。ActorRef後でその送信者を保持することにした場合でも、返送先のアドレスがまだあり、最終的にFutureは一時的なアクターがサービスを提供しています。要点は、 がある限り、ActorRefそれがリクエストであろうとレスポンスであろうと、そのパスにメッセージをルーティングするだけですActorRef

Ask (?)tell (!)実際にはあまり違いはありません。 Ask基本的に、送信者は受信者にメッセージが返されることtellを期待しています。tell

于 2013-04-25T21:54:56.020 に答える