【问题标题】:How to split Akka.NET remoting solution to two solutions?如何将 Akka.NET 远程解决方案拆分为两个解决方案?
【发布时间】:2015-12-15 20:32:56
【问题描述】:

我已经制作了 2 个 Akka.NET 解决方案,希望在一个简单的 hello world 示例上测试 Remoting,但是,当进行通信尝试时,我不断收到 Disassociated 异常。我有理由相信这是因为共享类 Greet 应该是两个系统都应该理解的消息。不幸的是,他们没有。我怎样才能解决这个问题?

这是“服务器”应用程序的代码:

namespace Shared
{
    public class Greet
    {
        public string Who { get; set; }

        public Greet(string who)
        {
            Who = who;
        }
    }
}


namespace AkkaTest
{

    using Shared;

    class GreeterActor : ReceiveActor
    {
        public GreeterActor()
        {
            Receive<Greet>(x => Console.WriteLine("Hello {0}", x.Who));
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            var config =  ConfigurationFactory.ParseString(@"
                akka {
                    actor.provider = ""Akka.Remote.RemoteActorRefProvider, Akka.Remote""

                    remote {
                        helios.tcp {
                            port = 9099
                            hostname = 127.0.0.1
                        }
                    }
                }
            ");

            using (ActorSystem system = ActorSystem.Create("MyServer", config))
            {
                system.ActorOf<GreeterActor>("greeter");

                Console.ReadLine();

                system.Shutdown();
            }
        }
    }
}

这是客户端的代码:

namespace Shared
{
    public class Greet
    {
        public string Who { get; set; }

        public Greet(string who)
        {
            Who = who;
        }
    }
}

namespace AkkaTest
{
    using Shared;

    class Program
    {
        static void Main(string[] args)
        {
            var config = ConfigurationFactory.ParseString(@"
                akka {
                    actor.provider = ""Akka.Remote.RemoteActorRefProvider, Akka.Remote""

                    remote {
                        helios.tcp {
                            port = 9090
                            hostname = 127.0.0.1
                        }
                    }
                }
            ");

            using (var system = ActorSystem.Create("MyClient", config))
            {
                //get a reference to the remote actor
                var greeter = system
                    .ActorSelection("akka.tcp://MyServer@127.0.0.1:9099/user/greeter");
                //send a message to the remote actor
                greeter.Tell(new Greet("Roger"));

                Console.ReadLine();
            }
        }
    }
}

编辑:将客户端和服务器放在相同的解决方案但不同的项目中,并且在共享项目中的 GreetingActor 和 Greet 解决了这些问题。但是,我希望有完全独立的解决方案。

【问题讨论】:

    标签: c# akka akka.net akka-remote-actor


    【解决方案1】:

    如果您在双方都使用Greet 消息,则需要提供某种方式在它们之间共享此消息模式。通常这是作为在其他项目或解决方案之间共享的单独项目来完成的。

    虽然默认的 Akka.NET 序列化程序使用完全限定的类型名称和程序集来序列化/反序列化消息,但它也是版本容错的 - 您可以修改消息模式并逐个节点逐步更新它的程序集。

    其他选项是使用自定义序列化程序。这样您就可以自己确定消息将如何在两端进行序列化/反序列化。您可以阅读有关此主题的更多信息here

    【讨论】:

    • 那么,我可以将一个共享项目添加到两个解决方案中,它会起作用吗?我会试一试。 tnx
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 2019-03-26
    • 1970-01-01
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    • 2021-05-06
    相关资源
    最近更新 更多