2017-01-21 2 views
1

Я пытаюсь найти свою настойчивость, и я еще не смог восстановить актера.Akka.Net и в памяти жизнеспособность

Мое намерение состоит в том, чтобы получить актера по его persistenceId (Точно так же мы получаем Entity с использованием GetById в DDD).

Я могу получить ссылку на список и добавить его к переменной в диспетчере списков, но то, что я ищу, - это то, что после того, как Актер умрет, как получить Актер с его текущим состоянием (Revovery By Events), чтобы модификация могла сделайте.

Позвольте мне знать, если мой вопрос не ясно

Это то, что я сделал до сих пор: ** Команды и события **

using System; 
    namespace AkkaPersistence 
    { 
     public class CreateNewList 
     { 
      public string ListName { get; private set; } 
      public Guid UserId { get; private set; } 
      public string ListId { get; set; } 

      public CreateNewList(string listName, Guid userId, string listId) 
      { 
       ListName = listName; 
       UserId = userId; 
       ListId = listId; 
      } 
     } 


     public class RemoveList 
     { 
      public string ListId { get; private set; } 
      public Guid UserId { get; private set; } 

      public RemoveList(string listId, Guid userId) 
      { 
       ListId = listId; 
       UserId = userId; 
      } 
     } 


     public class ListCreated 
     { 
      public string ListName { get; private set; } 
      public Guid UserId { get; private set; } 
      public string ListId { get; private set; } 

      public ListCreated(string listName, Guid userId, string listId) 
      { 
       ListName = listName; 
       UserId = userId; 
       ListId = listId; 
      } 
     } 


     public class ListRemoved 
     { 
      public Guid UserId { get; private set; } 
      public string ListId { get; private set; } 

      public ListRemoved(Guid userId, string listId) 
      { 

       UserId = userId; 
       ListId = listId; 
      } 
     } 
    } 

** Список Class **

using System; 
using Akka.Actor; 
using Akka.Persistence; 
namespace AkkaPersistence 
{ 
    public class List: ReceivePersistentActor 
    { 
     public override string PersistenceId => "AKKANETLIST"; 

     private string Name { get; set; } 

     private Guid CreatedBy { get; set; } 

     private Guid ModifiedBy { get; set; } 

     public List() 
     { 


      Recover<ListCreated>(evnt => 
      { 
       Console.WriteLine(" List :: Recovery Hit'"); 
       Console.WriteLine("PID:{0}, Name {1}, CreatedBy:{2}, ModifiedBy{3}", PersistenceId, evnt.ListName, evnt.UserId, evnt.UserId); 
       Name = evnt.ListName; 
       CreatedBy = evnt.UserId; 
       ModifiedBy = evnt.UserId; 
      }); 




      Command<CreateNewList>(cmd => 
      { 
       Console.WriteLine(" List :: Received Command 'CreateNewList'"); 
       var listCreated= new ListCreated(cmd.ListName,cmd.UserId, PersistenceId); 

       Persist(listCreated, lc => 
       { 
        Console.WriteLine(" List::Event 'ListCreated' persisted"); 
        Name = cmd.ListName; 
        CreatedBy = cmd.UserId; 
        ModifiedBy = cmd.UserId; 
        Sender.Tell(listCreated, ActorRefs.Nobody); 
        Console.WriteLine(" List::Event 'ListCreated' sent out"); 
       }); 

      }); 


      Command<RemoveList>(cmd => 
      { 
       Console.WriteLine(" List :: Received Command 'RemoveList'"); 

       Console.WriteLine("PID:{0}, Name {1}, CreatedBy:{2}, ModifiedBy{3}",PersistenceId, Name, CreatedBy, ModifiedBy); 
       var listRemoved = new ListRemoved(cmd.UserId,PersistenceId); 

       Persist(listRemoved, lc => 
       { 
        Console.WriteLine(" List::Event 'ListRemoved' persisted"); 
        ModifiedBy = cmd.UserId; 
        Sender.Tell(listRemoved, ActorRefs.Nobody); 
        Console.WriteLine(" List::Event 'ListRemoved' sent out"); 
       }); 

      }); 
     } 
    } 
} 

** List Manager **

using System; 
using Akka.Actor; 

namespace AkkaPersistence 
{ 
    public class ListManager : ReceiveActor 
    { 

     public ListManager() 
     { 
      Receive<CreateNewList>(cmd => 
      { 
       Console.WriteLine(" List Manager:: Received Command 'CreateNewList'"); 
       var newListRef = Context.ActorOf(Props.Create(typeof(List))); 
       newListRef.Tell(cmd, Self); 
       Console.WriteLine(" List Manager:: Command To Create New List sent to List Actor"); 
      }); 

      Receive<RemoveList>(cmd => 
      { 
       Console.WriteLine(" List Manager:: Received Command 'RemoveList'"); 
       var newListRef = Context.ActorOf(Props.Create(() => new List()), "AKKANETLIST"); 
       newListRef.Tell(cmd, Self); 
       Console.WriteLine(" List Manager:: Command To 'Remove List' sent to List Actor"); 
      }); 


      Receive<ListCreated>(evnt => 
      { 
       Console.WriteLine(" List Manager:: Event 'ListCreated' Received"); 
      }); 
     } 
    } 
} 

** Program.cs ** имен AkkaPersistence { класс Программа { статической силы Main (string [] арг) {

 var system = ActorSystem.Create("MySystem"); 
     var listManager = system.ActorOf<ListManager>("ListManager"); 


     // create command 
     var newListId = Guid.NewGuid().ToString("N"); 
     var createCommand= new CreateNewList("Akka List 1", Guid.NewGuid(), newListId); 
     listManager.Tell(createCommand); 



     //remove Command 

     var removeCommand = new RemoveList(newListId, createCommand.UserId); 
     listManager.Tell(removeCommand); 

     Console.ReadLine(); 


    } 
} 

}

** Консоль Text **

[WARNING][1/21/2017 3:11:47 PM][Thread 0009][ActorSystem(MySystem)] NewtonSoftJsonSerializer has been detected as a default serializer. It will be obsoleted in Akka.NET starting from version 1.5 in the favor of Wire (for more info visit: http://getakka.net/docs/Serialization#how-to-setup-wire-as-default-serializer). If you want to suppress this message set HOCON `akka.suppress-json-serializer-warning` config flag to on. 
List Manager:: Received Command 'CreateNewList' 
List Manager:: Command To Create New List sent to List Actor 
List Manager:: Received Command 'RemoveList' 
List Manager:: Command To 'Remove List' sent to List Actor 
List :: Received Command 'CreateNewList' 
List :: Received Command 'RemoveList' 
PID:AKKANETLIST, Name , CreatedBy:00000000-0000-0000-0000-000000000000, ModifiedBy00000000-0000-0000-0000-000000000000 
List::Event 'ListCreated' persisted 
List::Event 'ListCreated' sent out 
List Manager:: Event 'ListCreated' Received 
List::Event 'ListRemoved' persisted 
List::Event 'ListRemoved' sent out 

** Обновление 1 ** 2017-01-24

дальнейшие усилия, я смог получить экземпляр актера, основанного на имени. Для этого мне нужно создать PersistenceId как часть команды и имени актера с настойчивостью Id

Делая это, я мог бы использовать Context.Child (Name), чтобы получить актер.

Я делаю Context.Stop (newListRef) в ListManager: Получаем, что это остановит действие Актера списка и заставит его Восстановить, когда я получаю доступ к Context.Child (Name), но этого не происходит, но каким-то образом Состояние списка правильное. Не знаете, как это сделать.

Я сделаю еще несколько тестов, основанных на комментарии, который я получил сегодня от Horusiath

ответ

0

Я не совсем понимаю ваш вопроса, но когда вам нужно воссоздать постоянный актер, вы просто создаете еще один экземпляр актера с тем же PersistenceId.

Единственное, что следует иметь в виду, это то, что у вас никогда не должно быть более одного живого экземпляра стойкого актера с тем же PersistenceId в то время. В противном случае вы можете завершить несколько субъектов, которые одновременно пытаются записать события, возможно, повреждая поток событий.

+0

Horusiath, Спасибо за комментарий. Как мы узнаем, есть ли у нас другой актер с одинаковым идентификатором постоянства? Если идентификатор persistence создается вне создания актера, и мы называем Actor, с идентификатором persistence, и, я думаю, мы можем найти его в Context.Ребенок (persestreneid), но если в персонаже создается идентификатор сдерживания, существует ли какой-либо способ найти, доступен ли экземпляр. – TheMar

+0

Если у вас нет прямой связи между именем актера и идентификатором персистентности, вам необходимо сохранить привязки одного к другому самостоятельно. Другая вещь, которую вы можете сделать, - отказаться от управления жизненным циклом актера в стороннем плагине, например [Akka.Cluster.Sharding] (http://getakka.net/docs/clustering/cluster-sharding). – Horusiath

+0

Я посмотрю на Akka.Cluster.Sharding, как из комментария к другому сообщению, он sems предлагает некоторые из потока, который я ищу. благодаря – TheMar

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