tres - Akka en Scala, signo de admiración y signo de interrogación
signos de interrogacion y exclamacion (2)
Copia desvergonzadamente [impresionante] documento oficial (mira la sección Enviar mensajes para más información):
Los mensajes se envían a un actor a través de uno de los siguientes métodos.
!
significa "disparar y olvidar", por ejemplo, enviar un mensaje de forma asincrónica y regresar inmediatamente. También conocido comotell
.
?
envía un mensaje de forma asincrónica y devuelve unFuture
representa una posible respuesta. También conocido comoask
.
¿Cuál es la diferencia entre un signo de exclamación ( !
) Y un signo de interrogación ( ?
) Al enviar mensajes a Actores?
myActor ! Hello(value1)
myActor ? Hello(value1)
Desde el punto de vista del destinatario, ve tell
y ask
mensajes de la misma manera. Sin embargo, al recibir un tell
el valor del sender
será la referencia del actor que envió el mensaje, mientras que para una ask
, el sender
se configurará de manera que cualquier respuesta vaya al Future
creado en el actor que hizo la pregunta.
Hay una ventaja en ask
, que es fácil saber que la respuesta que recibes fue definitivamente el resultado del mensaje que pediste, mientras que con Tell, es posible que debas usar ID únicos para lograr un resultado similar. Sin embargo, con ask
, debe establecer un timeout
después del cual el Future
fallará si no se recibe respuesta.
En el siguiente código, el mismo efecto se logra con 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!"
}
}