感嘆符(!
)および疑問符(?
)アクターにメッセージを送信するとき?
myActor ! Hello(value1)
myActor ? Hello(value1)
恥知らずにコピーされた[awesome]公式ドキュメント (lookSend messagesセクションもっと):
メッセージは、次のいずれかの方法でアクターに送信されます。
!
は「火と忘れ」を意味します。非同期でメッセージを送信し、すぐに戻ります。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!"
}
}