是什麼感嘆號(!
)和問號(?
)之間的差值將消息發送到演員的時候?阿卡Scala中,感嘆號和問號
myActor ! new hello(value1)
myActor ? new hello(value1)
是什麼感嘆號(!
)和問號(?
)之間的差值將消息發送到演員的時候?阿卡Scala中,感嘆號和問號
myActor ! new hello(value1)
myActor ? new hello(value1)
無恥複製[真棒]official doc(看發送消息部分,用於更多):
消息是通過以下方法之一發送到演員。
!
的意思是「發射後不管」,例如異步發送消息,並立即返回 。也被稱爲tell
。
?
異步發送消息 並返回代表可能回覆的Future
。 亦稱ask
。
從收件人的角度來看,它看到tell
和ask
消息的方式相同。然而,當收到tell
時,sender
的值將是發送該消息的演員的參考,而對於ask
,則設置sender
,使得任何答覆都轉到在進行詢問的演員中創建的Future
。
ask
有一個優勢,即很容易知道您收到的回覆肯定是您詢問的消息的結果,而使用Tell時,您可能需要使用唯一ID來獲得類似的結果。但是,對於ask
,您需要設置一個timeout
,之後如果未收到響應,Future
將失敗。
在下面的代碼中,tell
和ask
的效果相同。
import akka.actor.{Props, Actor}
import scala.concurrent.duration._
import akka.pattern.ask
class TellActor extends Actor {
val recipient = context.actorOf(Props[ReceiveActor])
def receive = {
case "Start" =>
recipient ! "Hello" // equivalent to recipient.tell("hello", self)
case reply => println(reply)
}
}
class AskActor extends Actor {
val recipient = context.actorOf(Props[ReceiveActor])
def receive = {
case "Start" =>
implicit val timeout = 3 seconds
val replyF = recipient ? "Hello" // equivalent to recipient.ask("Hello")
replyF.onSuccess{
case reply => println(reply)
}
}
}
class ReceiveActor extends Actor {
def receive = {
case "Hello" => sender ! "And Hello to you!"
}
}