如何将Akka.NET远程处理解决方案拆分为两个解决方案

本文关键字:解决方案 拆分 两个 处理 Akka NET 程处理 | 更新日期: 2023-09-27 18:26:52

我制作了两个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放在共享项目中可以解决问题。然而,我希望有完全独立的解决方案。

如何将Akka.NET远程处理解决方案拆分为两个解决方案

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

虽然默认的Akka.NET序列化程序使用带有程序集的完全限定类型名来序列化/反序列化消息,但它也具有版本容忍性-您可以修改消息架构,并逐节点逐步更新其程序集。

另一种选择是使用自定义序列化程序。通过这种方式,您将能够自己确定如何在两端序列化/反序列化消息。你可以在这里阅读更多关于这个主题的内容。