路由器与akka.net中的远程演员

时间:2016-07-01 09:46:08

标签: c# akka.net

我正在尝试使用两个远程actor创建示例路由器。 这是我的代码

class Program
{

        public const string AkkaConfig = @"{
        akka {
            actor {
                provider = ""Akka.Remote.RemoteActorRefProvider, Akka.Remote""
                deployment {
                    /remoteecho1 {
                            remote = ""akka.tcp://Target@my1.lan:8090""
                    }
                    /remoteecho2 {
                            remote = ""akka.tcp://Target@my2.lan:8090""
                    }
            }
            remote{
                helios.tcp{
                    port = 0
                    hostname = localhost
                }
            }
        }
    }";

    static void Main(string[] args)
    {
        using (var system = ActorSystem.Create("Deployer", AkkaConfig))
        {
            var remoteEcho1 = system.ActorOf(Props.Create(() => new EchoActor()), "remoteecho1");
            var remoteEcho2 = system.ActorOf(Props.Create(() => new EchoActor()), "remoteecho2");

            var roundRobinGroup = new RoundRobinGroup(new[]
            {
                remoteEcho1,
                remoteEcho2
            });

            var coordinator = system.ActorOf(Props.Empty.WithRouter(roundRobinGroup),"coordinator");


            system.ActorOf(Props.Create(() => new HelloActor(coordinator)), "localactor");
            system.ActorSelection("/user/localactor").Tell(new SayHelloMessage());
            Console.ReadKey();
        }
    }
}

public class HelloActor:ReceiveActor
{
    private readonly IActorRef remoteActor;

    public HelloActor(IActorRef remoteActor)
    {
        this.remoteActor = remoteActor;
        Context.Watch(remoteActor);
        Receive<HelloMessage>(m =>
        {
            Console.WriteLine("Pingback from {1}: {0}", m.MessageText, Sender.Path);
        });

        Receive<SayHelloMessage>(m =>
        {
            var newMessage = new HelloMessage(Guid.NewGuid().ToString());
            remoteActor.Tell(newMessage);
        });
    }

    protected override void PreStart()
    {
        Context.System.Scheduler.ScheduleTellRepeatedlyCancelable(TimeSpan.FromSeconds(1),
                TimeSpan.FromSeconds(1), Context.Self, new SayHelloMessage(), ActorRefs.NoSender);
    }
}

public class SayHelloMessage
{

}

问题是下面代码中的remoteActor.Tell(newMessage)没有向我的演员发送消息

Receive<SayHelloMessage>(m =>
    {
        var newMessage = new HelloMessage(Guid.NewGuid().ToString());
        remoteActor.Tell(newMessage);
    });

当我将remoteEcho actor传递给HelloActor构造函数而不是路由器实例时,一切正常。如何使该示例与路由器一起使用?

0 个答案:

没有答案