2016-05-04 4 views
2

Ich habe versucht, das einfache Beispiel here zu implementieren.Akka.NET Persistenz mit SQL Server funktioniert nicht

Ich habe die erforderlichen Tabellen in SQL Server erstellt, wie im GitHub-Repository und der HOCON-Konfiguration beschrieben. Die Anwendung wird ohne Fehler ausgeführt, es bleibt jedoch nichts erhalten. Ich sah eine frühe Diskussion, wo jemand anderes das gleiche Problem hatte und die Lösung SqlServerPersistence.Init() -Funktion aufrufen sollte, mit einer Notiz, dass dies bald nicht mehr benötigt würde. Und tatsächlich existiert die Methode nicht mehr.

class Program 
{ 
    private static void Main(string[] args) 
    { 
     try 
     { 
      using (var actorSystem = ActorSystem.Create("PersistenceActorSystem")) 
      { 
       SqlServerPersistence persistence = SqlServerPersistence.Get(actorSystem); 

       var actor = actorSystem.ActorOf(Props.Create<ParentActor>(), "ParentActor"); 

       actorSystem.WhenTerminated.Wait(); 
       Console.WriteLine("Actor system shutdown..."); 
      } 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex); 
     } 
    } 
} 


public class ParentActor : ReceiveActor 
{ 
    public ParentActor() 
    { 
     var actor = Context.ActorOf(Props.Create<PersistentChildActor>(), "PersistentChildActor"); 

     actor.Tell("Message 1"); 
     actor.Tell("Message 2"); 
     actor.Tell(new PersistentChildActor.GetMessages()); 

     Receive<IReadOnlyList<string>>(messages => 
     { 
      Console.WriteLine("Received messages..."); 

      foreach (var message in messages) 
      { 
       Console.WriteLine(message); 
      } 

      Context.System.Terminate(); 
     }); 
    } 
} 


public class PersistentChildActor : ReceivePersistentActor 
{ 
    public class GetMessages {} 

    private List<string> _messages = new List<string>(); 

    public override string PersistenceId 
    { 
     get 
     { 
      return "HardCoded"; 
     } 
    } 

    public PersistentChildActor() 
    { 
     // recover 
     Recover<string>(message => _messages.Add(message)); 

     // commands 
     Command<string>(message => Persist(message, s => 
     { 
      _messages.Add(message); //add msg to in-memory event store after persisting 
     })); 
     Command<GetMessages>(get => 
     { 
      IReadOnlyList<string> messages = new List<string>(_messages); 
      Sender.Tell(messages); 
     }); 
    } 
} 

Ich verwende Akka 1.0.8 mit Persistence 1.0.8.25 und Persistence.SqlServer 1.0.6.3.

Hocon Config

akka { 
     akka.persistence{ 

      journal { 
       plugin = "akka.persistence.journal.sql-server" 
       sql-server { 

        class = "Akka.Persistence.SqlServer.Journal.SqlServerJournal, Akka.Persistence.SqlServer" 

        connection-string = "Data Source=USER-PC\\SQLEXPRESS;Initial Catalog=AkkaPersistenceDemo;Integrated Security=True;" 

        schema-name = dbo 

        auto-initialize = on 
       } 
      } 

      snapshot-store { 
       plugin = "akka.persistence.snapshot-store.sql-server" 
       sql-server { 

        class = "Akka.Persistence.SqlServer.Snapshot.SqlServerSnapshotStore, Akka.Persistence.SqlServer" 

        connection-string = "Data Source=USER-PC\\SQLEXPRESS;Initial Catalog=AkkaPersistenceDemo;Integrated Security=True;" 

        schema-name = dbo 

        auto-initialize = on 
       } 
      } 
     }   
    } 
+0

Könnten Sie Ihre aktuelle Hocon Config hinzufügen? Sie haben wahrscheinlich einen Fehler drin. – Danthar

Antwort

1

Try

akka { 
    akka.persistence{ 

Um

akka { 
    persistence{ 

Es scheint, Ihre Ausdauer Einstellungen werden nicht angewendet, und Journalstandardwerte zu ändern

+0

Danke @ andrey.leskov.Es funktioniert jetzt.Ich entfernte das äußere Akka-Element in meinem Fall, da ich sonst nichts in der HOCON habe. Aber ich auch Ich habe die Schachtelungs-Persistenz innerhalb von akka wie vorgeschlagen versucht, was auch funktioniert. Ich musste auch meine Journaltabelle mit einer zusätzlichen Spalte aktualisieren, die seit dem ersten Versuch hinzugefügt wurde. –

2

ich auch in diese lief. Ich habe es behoben, indem ich das Journal-Plugin in der HOCON-Konfiguration eingestellt habe.

journal { 
    plugin = "akka.persistence.journal.sql-server" 
    sql-server { 

     # qualified type name of the SQL Server persistence journal actor 
     class = "Akka.Persistence.SqlServer.Journal.SqlServerJournal, Akka.Persistence.SqlServer" 

     # dispatcher used to drive journal actor 
     plugin-dispatcher = "akka.actor.default-dispatcher" 

Wenn Sie Journal Eigenschaft Ihre Schauspieler Instanz überprüfen, bevor diese Änderung würden Sie feststellen, dass es im Speicher Journal der festgelegt ist. Deshalb sehen Sie es nicht bestehen.

+0

Mein Fehler, ich habe Persistence 1.0.6.17-beta in meinem Code verwendet, der funktioniert. Persistence (und Persistence.Sql.Common) Version 1.0.8.25 löst eine NullReferenceException beim Versuch CreateNewActorInstance (0. –

+0

Ich legte das Journal-Plugin, aber es machte keinen Unterschied in meinem Fall. Die Journal -Eigenschaft zeigte immer noch die im Speicher Journal. –

+0

Du hast meinen Tag gerettet.Es funktioniert mit der Version (1.1.1.7-beta) – fra

Verwandte Themen