アクターにメッセージを送信するときの感嘆符 ( !
) と疑問符 ( )の違いは何ですか??
myActor ! Hello(value1)
myActor ? Hello(value1)
受信者の視点から見るtell
とask
、同じようにメッセージを表示します。tell
ただし、の値を受け取ると、sender
はメッセージを送信したアクターの参照になりますが、 の場合ask
、は、要求を行ったアクターで作成された にsender
応答が送信されるように設定されます。Future
ask
には、受け取った応答が、要求したメッセージの結果であることを簡単に知ることができるという利点がありますが、Tell では、同様の結果を得るために一意の ID を使用する必要がある場合があります。ただし、ask
a を設定する必要があり、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!"
}
}