2013-07-14 12 views

答えて

86

は臆面もなく[すごい]official doc(多くのためのメッセージにセクションを送る見て)コピー:

メッセージは次のいずれかの方法で俳優に送信されます。

!は、「火と忘れ」を意味します。メッセージを非同期で送信し、 がすぐに戻ります。 tellとも呼ばれます。

?は、メッセージ を非同期的に送信し、可能な応答を表すFutureを返します。 別名:ask

17

受信者の視点からは、tellaskのメッセージが同じように見えます。しかし、tellを受け取った場合、senderという値はメッセージを送信した俳優の参照になりますが、askでは尋ねた俳優で作成されたFutureに返信されるようにsenderが設定されます。

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