2013-07-14 166 views

回答

86

無恥複製[真棒]official doc(看發送消息部分,用於更多):

消息是通過以下方法之一發送到演員。

!的意思是「發射後不管」,例如異步發送消息,並立即返回 。也被稱爲tell

?異步發送消息 並返回代表可能回覆的Future。 亦稱ask

17

從收件人的角度來看,它看到tellask消息的方式相同。然而,當收到tell時,sender的值將是發送該消息的演員的參考,而對於ask,則設置sender,使得任何答覆都轉到在進行詢問的演員中創建的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!" 
    } 
}