trabajo sobre practico plataforma organigrama objetivos scala akka scheduler

scala - sobre - series de netflix pdf



¿Es posible utilizar el programador Akka dentro de un actor? (3)

La respuesta de Roland Kuhn cubre el tema, solo quería agregar que hay otro caso de uso común para usar el programador: cuando se envía un mensaje a un actor diferente y se espera que este actor responda, es bastante común limitar la espera con un tiempo de espera. .

otherActor ! Request(...) context.system.scheduler.scheduleOnce(duration, self, WakeUp) ... case Response(...) => ... case WakeUp => context stop self

Quiero tener la posibilidad de poner a los actores a dormir por un tiempo. Los actores deben decidir por sí mismos cuánto tiempo van a dormir. Como Thread.sleep () no es una forma recomendada de hacer esto, pensé en usar el programador en akka. Por lo tanto, definí a un actor donde otro actor puede registrarse para ser despertado.

class Scheduler extends Actor { def receive = { case Sleep(duration) => context.system.scheduler.scheduleOnce(duration) { sender ! Ring } } }

Pero el actor que envía nunca recibe el mensaje del Anillo. Así que mis preguntas son

  • ¿Se recomienda programar con el programador dentro de un actor?
  • ¿Por qué el actor que envía nunca recibe el mensaje de timbre?
  • Si esto no es posible, ¿cuál es la forma recomendada de resolver el problema?

Primero, permítame responder la pregunta del título: sí, es posible usar el programador dentro de un actor.

case Sleep(duration) => context.system.scheduler.scheduleOnce(duration, self, Ring)

Ahora a la pregunta detrás de la pregunta

No dijiste lo que realmente quieres lograr, así que supongo que quieres que el actor, que normalmente hace algo llamado "X", haga algo llamado "Y" por un tiempo, suspendiendo la "X " actividad. Las soluciones completas a esto serían

class Sleepy extends Actor { def receive = { ... // cases doing “X” case Sleep(duration) => case object WakeUp context.system.scheduler.scheduleOnce(duration, self, WakeUp) context.become({ case WakeUp => context.unbecome() // drop the rest }, discardOld = false) } }

Lo mismo podría implementarse utilizando el rasgo FSM y cambiando entre el estado normal y el estado de reposo. Y, por supuesto, puedes hacer lo que quieras mientras duermes, por ejemplo, mezcla el rasgo Stash en Akka 2.1 y llama stash() para todos (o algunos) mensajes mientras duermes, unstashAll() cuando unstashAll() el mensaje WakeUp ; o podrías hacer otra cosa por completo. Los actores son muy flexibles.

Lo que los actores no hacen

Los actores nunca duermen, siempre manejan los mensajes entrantes. Como se muestra arriba, puede definir lo que eso significa, pero el principio básico es que no puede suspender a un actor de manera que no procese los mensajes en su buzón.


Se está cerrando sobre "remitente" en su cierre que se pasa al programador. Esto significa que lo más probable es que el mensaje de timbre se envíe al actor equivocado. Deberías hacer esto en su lugar:

case Sleep(duration) => val s = sender context.system.scheduler.scheduleOnce(duration) { s ! Ring } }