Akka.NET 持久性 SQL 服务器不工作

Akka.NET Persistence with SQL Server not working

我一直在尝试实现简单示例 here

我已经按照 GitHub 存储库和 HOCON 配置中的描述在 SQL 服务器中创建了所需的表。应用程序运行没有错误,但没有任何内容被保留。我确实看到了早期的讨论,其中其他人遇到了同样的问题,解决方案据说是调用 SqlServerPersistence.Init() 函数,并指出很快就不再需要了。而事实上这个方法已经不存在了。

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);
        });
    }
}

我正在使用带有 Persistence 1.0.8.25 和 Persistence.SqlServer 1.0.6.3 的 Akka 1.0.8。

Hocon 配置

    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
              }
          }
      }          
    }

我运行也喜欢这个。我通过在 HOCON 配置中设置日志插件来修复它。

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"

如果您在进行此更改之前检查您的 Actor 实例的 日志 属性,您会注意到它被设置为内存日志。这就是为什么您看不到它持续存在的原因。

尝试改变

akka {
    akka.persistence{

akka {
    persistence{

您的持久性设置似乎没有应用,日志默认为 inmem

目前没有适用于 Akka 1.0.8 的 SqlServer 提供程序。您可以从源代码构建它或从 Akka 每晚构建 (https://www.myget.org/F/akkadotnet/api/v2)

下载 nuget 包