如果您的示例與您的實際代碼非常接近,那麼我不確定pipeTo
是您想要的。把信息傳遞給你自己,對我來說,沒有太大意義,對於演員向另一個演員發送信息然後等待迴應的情況,有更好的解決方案。首先,我們來談談pipeTo
。我認爲一個很好的例子是什麼時候使用pipeTo
是,如果你有三個演員,A,B和C.A向B發送一條消息,然後B向C發送一條消息,而來自C的響應應該在B之後返回給A首先做一些其他事情。在這個例子中,你可以做這樣的事情裏面B的:
val fut = actorC ? someMessage
fut map(someMapFunc) pipeTo sender
這裏,pipeTo
功能可以防止意外關閉在可變sender
變種,如果你要改用類似onComplete
和響應該回調中的sender
。現在
,對於你的情況,如果你只是想談談B,然後等待B中的響應(和處理潛在的超時),你可以嘗試這樣的事:
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)
}
在這例如,A以默認的receive
部分函數開始。當它收到一條消息時,它會向B發送另一條消息,設置接收超時以接收來自B的響應,然後將它的功能切換爲特定於等待來自B的響應的東西。在那個新的接收函數中,我可以要麼及時得到B的回覆,要麼得到ReceiveTimeout
,這表明我沒有及時得到我的回覆。無論哪種情況,我都會因爲重複而取消接收超時。
現在這是非常簡單的,但我只是試圖展示一種方式來做兩個演員之間來回,這似乎是你的例子顯示。
是否有可能從超時消息中獲得原始消息? – hakunami