我在我的 Akka 經典專案中使用了以下代碼片段。
(persistence ? Persist("a", Some(100), 123)) (100.milliseconds)
.mapTo[Persisted]
.recover(ex => Failure(ex.getMessage()))
.pipeTo(self)
當我處理此成功回應時,ask發件人是self. 我怎樣才能得到對此的回應的發件人ask?換句話說,我怎樣才能在這里獲得目標/接收者的地址?
編輯:
很明顯,這persistence是詢問的目標。但我真正想知道的是,是否有辦法persistence通過pipeTo. 假設有一個陣列,persistence我不知道哪個Persist訊息來自哪個persistence.
uj5u.com熱心網友回復:
答案就在你的問題中。 persistence是詢問的目標。
有可能將persistence作業委派給另一個參與者(例如池中的作業人員),但這會揭示實作細節,而 tbh 可能不會那么有用(這是詢問模式不傳播發送者的部分原因)。
如果它是您控制的協議,ActorRef則可以保證在回應中顯式添加。
您可以推出自己的傳播發件人的詢問模式版本,盡管如上所述,它可能不會那么有用。
編輯:傳播persistence到所轉發的答復時,最簡單的是map所述Future的結果問到的東西,其捆綁persistence與所述結果(作為一種相關性ID的),如:
(persistence ? Persist("a", Some(100), 123)) (100.milliseconds)
.mapTo[Persisted]
.map { response => persistence -> response }
.recoverWith { ex => persistence -> Failure(ex.getMessage) }
.pipeTo(self)
發送的訊息將是ActorRef和Persisted或 的元組Failure,因此您可以在接收中將它們與類似的內容進行匹配
case (persistenceTarget, Persisted(...)) => ???
case (persistenceTarget, Failure(msg)) => ???
(您也可以顯式地將協議更改為包含以下內容的內容ActorRef:元組可能有點太原始了,但是在不了解有關協議的更多詳細資訊的情況下對于此答案很方便)
請注意,如果persistence是您的 中的一個欄位Actor,它可能會在您發送詢問和執行map/之間發生變化recoverWith:map/recoverWith最終會獲取更改后的值。這種不經意的“關閉”actor 狀態是 Akka 中令人討厭的錯誤的長期來源,因此可能值得擁有
val persistenceTarget = persistence
和更換的提到persistence在問/ map/recoverWith帶persistenceTarget:因為persistenceTarget是本地(和不可改變的)價值,它可以安全關閉了。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/327821.html
