重構其他程序員編寫的演員代碼時,我在演員A
內遇到Future.onComplete
回調的使用,這違背了使用akka.pattern.pipe
的最佳做法。這是一個壞主意,因爲它暴露了競爭條件的可能性,因爲Future
實例可能在不同的線程上執行。演員和未來:引用onComplete內的演員消息
看代碼,我們可以看到,有沒有sender
也沒有那麼似乎很安全,至少這個特定場合任何可變var
S爲onComplete
塊中提到。然而,讓我想知道的一個灰色區域是對url
的引用,尤其是text
。
是否有可能是類似於Closing Over An Akka Actor Sender In The Receive問題,競爭條件發生,使得當onComplete
調用回調函數的時候,text
值已經指的是不同的演員的消息,導致所有的地獄衝出重圍?
class B extends akka.actor.Actor {
def receive = {
case urlAndText: (String, String) => // do something
}
}
class A extends akka.actor.Actor {
case class Insert(url: String)
def fileUpload(content: String): String = ??? // returns the url of the uploaded content
val b = context.actorOf(Props(classOf[B]))
def receive = {
case text: String =>
Future {
fileUpload(text)
} onComplete {
case Success(url) =>
b ! Insert(url, text) // will this be
}
}
}