scala - meaning - Los malentendidos de Akka se vuelven/inoportunos
akka vs kafka (2)
El siguiente código:
class HotSwapActor extends Actor {
import context._
def angry: PartialFunction[Any, Unit] = {
case "foo" => sender ! "I am already angry!"
case "bar" => become(happy)
}
def happy: PartialFunction[Any, Unit] = {
case "bar" => sender ! "I am already happy :-)"; unbecome
case "foo" => become(angry)
}
def receive = {
case "foo" => become(angry)
case "bar" => become(happy)
}
}
class OtherActor extends Actor {
val system = ActorSystem()
val actor = system.actorOf(Props[HotSwapActor])
def receive = {
case "start" =>
actor ! "foo"
actor ! "bar"
actor ! "bar"
actor ! "foo"
case a @ _ => println(a)
}
}
object HotSwapMain extends App {
val system = ActorSystem()
val actor = system.actorOf(Props[OtherActor])
actor ! "start"
}
Tiene la salida:
Ya estoy feliz :-)
Pero no podría ser
Ya estoy feliz :-) ¡Ya estoy enojado!
¿O me estoy perdiendo la semántica de impropio en impecable en el caso de la barra de la feliz PartialFunction?
Así es como es el flujo.
- Msg "foo" enviado ->
receive
recibe el mensaje.angry
convierte en la función de recibir. Cualquier siguiente mensaje será enviado aangry
- Mensaje "barra" enviado -> mensaje
angry
recibe.happy
convierte en la función de recibir. Cualquier próximo mensaje será enviado ahappy
Mensaje "barra" enviado ->
happy
recibe el mensaje. RespondióI am already happy :-)
mensaje. Y luego seunbecomes
. Según api para todas las llamadas previas acontext.become
,discardOld
se estableció como predeterminado en true. Ahora, después de reemplazarse, no queda nada para convertirse en el próximo receptor. Toma el predeterminado, es decir,receive
como receptor.Msg "foo" enviado ->
receive
recibe el mensaje.angry
convierte en la función de recibir. Cualquier siguiente mensaje será enviado aangry
se convierte en un segundo parámetro opcional ''discardOld''. Por defecto esto es cierto. Para que la pila no se mantenga. Si desea que se mantenga la pila y obtenga el resultado como: "Ya estoy contento :-) ¡Ya estoy enojado!", Pase el argumento discardOld = false a su función de convertido.