c# - 应用重启后 Akka.Net 内存中持久性调用“Recover”
问题描述
我正在尝试测试持久性演员,但行为很奇怪。
我测试过的演员:
public class PredictionManager : ReceivePersistentActor
{
public override string PersistenceId => _persistanceId;
public PredictionManager(string persistenceId)
{
_persistanceId = persistenceId;
Command<AddPredictionRequest>(OnPrediction);
Recover<SnapshotOffer>(x => OnRecover((PredictionManagerState)x.Snapshot), x => x.Snapshot is PredictionManagerState);
}
private void OnPrediction(AddPredictionRequest request)
{
/* some code */
_state.Add(request);
SaveSnapshot(_state);
}
private void OnRecover(PredictionManagerState state)
{
foreach(var request in state.RequestMap)
{
OnPrediction(request.Value);
}
}
}
我的状态保存所有消息并在经理演员收到一些消息后将其删除。当我尝试调试我的测试时,Recover
首先调用函数,然后调用OnPrediction
. 我的问题是——这怎么可能?如果数据存储在内存中,为什么它有SnapshotOffer
?我也尝试过从中生成新percistenceId
的,Guid.NewGuid()
但它不起作用。
public void AddPrediction_PassToChild_CreateNewManager_PassToChild()
{
var sender = CreateTestProbe(Sys);
var persistanceId = "AddPrediction_PassToChild_CreateNewManager_PassToChild";
var props = Props.Create(() => new PredictionManager(Mock.Of<IEventBus>(), persistanceId));
var predictionManager = ActorOf(props);
var message = new PredictionManager.AddPredictionRequest(Props.Create(() => new ChildTestActor(sender.Ref)),
new StartPrediction<IPredictionParameter>("a", 1, "a", new Param() ));
//Act
predictionManager.Tell(message, sender);
sender.ExpectMsg<string>(x => x == "ok", TimeSpan.FromSeconds(15));
Sys.Stop(predictionManager);
predictionManager = Sys.ActorOf(props);
sender.ExpectMsg<string>(x => x == "ok", TimeSpan.FromSeconds(15));
Sys.Stop(predictionManager);
}
解决方案
我发现快照的默认存储LocalStorage
不是MemoryStorage
. 所以它将快照存储在文件中,这就是它SnapshotOffer
在应用重启后的原因。但我仍然不明白为什么Guid.NewGuid()
aspersistanceId
不起作用。
推荐阅读
- javascript - 查询生成器的正则表达式匹配和替换
- java - Deeplearning4j 在 Scala 中的线程之间共享计算图
- c - main() 上没有参数的分段错误
- ti-nspire - 在 TI nspire cx cas 上定义导数运算符矩阵
- go - 如何使用 Go 在大查询中获取表列名列表
- python - 以变量为约束的约束回归python
- ios - 无法以编程方式重置 UINavigationController.presentedViewController
- javascript - JavaScript typeof 运算符号与字符串
- python - 如何在 Python Flask 中编辑从数据库中获取的数据
- installation - 安装 Babun 失败 - 创建空的 .babun 文件夹