アクターBへのメッセージで送信者参照を渡し、pipe
アクターBからの応答をself
に渡すことができます。上記のアプローチは安全ですが、明らかにその応答で俳優のBはバック俳優Aに
import akka.pattern.{ask, pipe}
case class MsgToActorB(..., target: ActorRef)
case class ResponseFromActorB(..., target: ActorRef)
class ActorA extends Actor {
def receive = {
case r: Request =>
val s = sender
implicit val timeout = Timeout(5 seconds)
// do something with the request
if (someCondition)
s ! Try(AbcResponse(...))
else
(actorB ? MsgToActorB(..., s)).mapTo[ResponseFromActorB].pipeTo(self)
case ResponseFromActorB(..., target) =>
// do something with the response from B and send a response to the original sender
target ! Try(AbcResponse(...))
}
}
をこの参照を渡す必要があり、以下に示すようにask
を使用しない方が簡単だろう。あなたはask
を使用して、それが俳優のAからのメッセージを処理する際の俳優Bがブロックしている場合は、説明hereとして別々のディスパッチャを設定することを検討する必要がある場合。
def receive = {
case r: Request =>
val s = sender
// do something with the request
if (someCondition)
s ! Try(AbcResponse(...))
else
actorB ! MsgToActorB(..., s)
case ResponseFromActorB(..., target) =>
// do something with the response from B and send a response to the original sender
target ! Try(AbcResponse(...))
}
この状況では、アクターBを呼び出すと、アクター自体にコールバックを入れるのは悪いですか? – Sidhant
@Sidhant:[ここ](http://doc.akka.io/docs/akka/2.5.4述べたようask' 'と'(コールバックはない)mapTo'と 'pipeTo'を使用して、一般的なパターンであります/scala/actors.html#ask-send-and-receive-future)およびドキュメントの他の部分に記載されています。 – chunjef