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 ->
receiverecibe el mensaje.angryconvierte en la función de recibir. Cualquier siguiente mensaje será enviado aangry - Mensaje "barra" enviado -> mensaje
angryrecibe.happyconvierte en la función de recibir. Cualquier próximo mensaje será enviado ahappy Mensaje "barra" enviado ->
happyrecibe el mensaje. RespondióI am already happy :-)mensaje. Y luego seunbecomes. Según api para todas las llamadas previas acontext.become,discardOldse 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,receivecomo receptor.Msg "foo" enviado ->
receiverecibe el mensaje.angryconvierte 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.