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 包
我一直在尝试实现简单示例 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 包