4

akka では、各アクターが上流からメッセージを受信し、独自のメッセージを下流に送信し、応答を待ってから上流にメッセージを返すような、アクターの線形チェーンがあるとします。後でアクターに返信する必要がある場合、アクターは上流のアクターのハンドルをどのように覚えていますか?

例えば:

A sends message to B (b ! "msg1")
B sends message to C (c ! "msg2")
C replies to B (self.reply ! "msg3")
B replies to A <--- ???

基本的に、B は A のハンドルをどのように覚えていますか? この時点で self.reply を実行すると、C が現在のメッセージを B に送信したため、C が参照されます。

4

1 に答える 1

6

アクターBはCA の間で応答メッセージを変更する必要がありますか?

  1. そうでない場合、アクターBB forward "msg"はの代わりに を使用する必要がありB ! "msg"ます。これにより、送信者情報が保持されます。Cが返信を使用すると、回答はB を介さずに自動的にAに送信されます。

    A sends message to B (b ! "msg")

    B forward the message to C (c forward "msg")

    C replies to A (self.reply ! "msg3")

  2. はいの場合は、送信者を取得しActorRef、メッセージ送信者参照に沿って渡します。

たとえば、単純なタプルを使用すると、次のようになります。

A sends message to B (b ! "msg1")
B sends message to C, with the sender reference (c ! ("msg2",self.sender) )
C replies to B adding the reference it received (self.reply ! ("msg3",ref) )
B replies to A ( ref ! "msg4" )

ここでは Tuple を使用しましたが、チェーンが長い場合はList[ActorRef]. 先に進むときは、送信者の参照を先頭に追加します。戻るときは、リストの先頭に返信し、返信に沿ってリストの末尾を渡します。

編集:ビクターのコメントを考慮に入れる。

于 2011-07-04T07:43:09.447 に答える