あなたの事例が実際のコードとよく似ている場合、私はpipeTo
があなたが欲しいものと確信していません。私にメッセージを送り返すことはあまり意味がなく、俳優が別の俳優にメッセージを送ってから応答を待つ場合には、より良い解決策があります。まず、pipeTo
について話しましょう。 pipeTo
を使用する良い例は、A、B、Cの3人の俳優がいる場合です。AはBにメッセージを送信し、CはCにメッセージを送信し、Cからの応答はBの後にAに返す必要がありますまず何か他のことをします。その例では、あなたはBのこの内部のような何かができる:ここでは
val fut = actorC ? someMessage
fut map(someMapFunc) pipeTo sender
、pipeTo
機能があなたの代わりにonComplete
ようなものを使用してに反応した場合に、誤って変更可能なsender
VARの上に閉じてからあなたを防ぐことができますそのコールバックの内側にsender
この中で
class ActorA extends Actor{
import context._
val myB = context.actorOf(Props[ActorB])
def receive = {
case msg =>
myB ! msg
setReceiveTimeout(2 seconds)
become(waitingForResponse)
}
def waitingForResponse:Receive = {
case ReceiveTimeout =>
println("got a receive timeout")
cancelReceiveTimeout
case response =>
println("got my response back")
cancelReceiveTimeout
}
def cancelReceiveTimeout = setReceiveTimeout(Duration.Undefined)
}
:あなただけのBに話をして、Bからの応答を待つ(および潜在的なタイムアウトを処理)する場合
今、あなたのケースのために、あなたはこのような何かを試みることができますたとえば、Aはデフォルトのreceive
部分関数で始まります。メッセージを受信すると、Bに別のメッセージを送り、Bからの応答を受信するための受信タイムアウトを設定し、次にreceive
の機能をBからの応答を待つことに特有のものに切り替えます。その新しい受信機能では、 Bから私の応答を得るか、ReceiveTimeout
を得ることができます。これは、時間内に私の応答を得られなかったことを示しています。どちらの場合でも、繰り返しているので、受信タイムアウトをキャンセルします。
これは非常に簡略化されていますが、私は2つのアクターの間で前後にやりとりする方法を示しています。
タイムアウトメッセージから発信元のメッセージを取得することは可能ですか? – hakunami