在斯卡拉Akka,感叹号和问号

发送信息给演员时,感叹号( ! )和问号( ? )有什么区别?

 myActor ! new hello(value1) myActor ? new hello(value1) 

无耻复制[真棒] 官方文档 (请看发送消息部分更多):

消息通过以下方法之一发送给angular色。

! 意味着“即忘即忘”,例如asynchronous发送消息并立即返回。 也被称为tell

? asynchronous发送消息并返回代表可能回复的Future 。 也被称为ask

从收件人的angular度来看,它可以用同样的方式看待和ask信息。 然而,当收到一个tell时, sender的值将是发送该消息的演员的参考,而对于一个asksender被设置为使得任何答复都进入在做出该询问的演员中创build的Future

ask有一个好处,很容易知道您收到的回复肯定是您询问的信息的结果,而使用Tell时,您可能需要使用唯一的ID来获得类似的结果。 然而,如果没有收到回应, ask你需要设置一个timeout在此之后, Future将会失败。

在下面的代码中, tellask产生相同的效果。

 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!" } }