Veamos hoy un simple ejemplo que crea dos actores y les envía mensaje. El código completo está en:
https://github.com/ajlopez/Aktores/tree/master/Samples/PingPong
Como siempre, todo es “trabajo en progreso”, y puede cambiar en el futuro. Estoy siguiendo el flujo de trabajo de TDD (Test-Driven Development), así que alguna llamada a la API puede ir cambiado, o cambiar algún concepto de base, a medida que me planteo casos de uso cada vez más interesantes (ya llegué a implementar caso de uso distribuido, por ejemplo).
En este ejemplo, tenemos un actor:
using Aktores.Core; public class PingActor : Actor { private int messagecount; public int MessageCount { get { return this.messagecount; } } public override void Receive(object message) { messagecount++; this.Sender.Tell("ping", this.Self); } }
Vean que un actor desciende de una clase base Actor. El gran método a implementar es el Receive, que recibe un mensaje enviado por alguien en el sistema (otro actor, otro objeto) a nuestra instancia. Aktores se asegura que los mensajes nos lleguen y se procesen de a uno por vez. En el actor de arriba, una vez recibido un mensaje, incrementa un contador y le responde al enviador del mensaje original con otro mensaje (el enviador está referenciado en this.Self, DURANTE el proceso de un mensaje; luego puede cambiar al llegar otro mensaje).
Otro actor similar:
using Aktores.Core; public class PongActor : Actor { private int messagecount; public int MessageCount { get { return this.messagecount; } } public override void Receive(object message) { messagecount++; this.Sender.Tell("pong", this.Self); } }
El programa principal, lo que hace, es crear un sistema de actores, crear dos actores, uno del tipo Ping y otro del tipo Pong, y luego le envía mensajes a procesar:
public static void Main(string[] args) { ActorSystem system = new ActorSystem(2); var pingactor = new PingActor(); var pongactor = new PongActor(); var ping = system.ActorOf(pingactor); var pong = system.ActorOf(pongactor); for (int k = 0; k < 10; k++) { ping.Tell("pong", pong); pong.Tell("ping", ping); } // .... }
Tiene código adicional para medir la cantidad de mensajes que se procesan en el tiempo. El parámetro 2 en el constructor de ActorSystem indica que necesita DOS threads de trabajo interno para procesar mensajes. Deberé revisar si esa información queda ahí o de otra manera. Dos threads son suficientes porque no tenemos más que dos instancias de actores, pero podríamos poner otro número si usamos más actores.
Nos leemos!
Angel “Java” Lopez
http://www.ajlopez.com
http://twitter.com/ajlopez