2015-12-15 3 views
0

Я сделал 2 решения Akka.NET в надежде на тестирование Out Remoting на простом примере hello world, однако я продолжаю получать исключение Disassociated при попытке связи. У меня есть причина полагать, что это из-за разделяемого класса Greet, который должен быть сообщением, которое обе системы должны понимать. К сожалению, они этого не делают. Как я могу это исправить?Как разбить решение Akka.NET на два решения?

Это код приложения «Сервер»:

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://[email protected]:9099/user/greeter"); 
       //send a message to the remote actor 
       greeter.Tell(new Greet("Roger")); 

       Console.ReadLine(); 
      } 
     } 
    } 
} 

EDIT: Ввод клиента и сервера в том же растворе, но разные проекты, а GreetingActor и Greet в совместных проектах исправляют проблемы. Тем не менее, я хотел бы иметь совершенно отдельные решения.

ответ

2

Если вы используете сообщения Greet с обеих сторон, вам необходимо предоставить некоторые способы обмена этой схемой сообщений между ними. Обычно это делается как отдельный проект, разделяемый между другими проектами или решениями.

По умолчанию сериализатор Akka.NET использует полное имя типа с сборкой для сериализации/десериализации сообщений, а также толерантен к версии - вы можете изменить схему сообщений и постепенно обновлять узел сборки по узлам.

Другой вариант - использовать пользовательский сериализатор. Таким образом, вы сможете самостоятельно определить, как сообщение будет сериализоваться/десериализоваться с обоих концов. Вы можете узнать больше об этой теме here.

+0

Итак, я могу добавить общий проект в оба решения, и это сработает? Я попробую. tnx – Marin

+0

Пробовал, и это сработало! Tnx! – Marin

Смежные вопросы