我正在使用EventStore作为后端在Scala中使用持久性actor。测试是基于specs2的。在spec类的初始化期间,在实例化的另一个类的构造函数中,我向我的actor询问一些东西,如果EventStore没有运行,则获取
Could not create an instance of
com.optrak.opkakka.authentication.AuthenticationManagementSpec
由引起的
akka.pattern.AskTimeoutException: Ask timed out on
[Actor[akka://com-optrak-opkakka-authentication-AuthenticationManagementSpec/user/$b/AuthenticationModel#1565142060]] after [2000 ms]
AuthenticationModel
是我演员的名字。
问题是,
首先,我的演员为什么不回答? ask命令没有被持久化,并且actor在此时没有收到任何持久的命令来改变它的状态,因为它刚刚被创建。
第二,如何检测后端未预先运行以向用户发出警告?
答案 0 :(得分:1)
使用来自ktoso的指针(谢谢!)和一个小型测试项目,我找到了自己的方式。我按照一些错误消息的建议在我的持久化actor中处理RecoveryFailure
,向前推一个new IllegalStateException
,并建议检查EventStore是否正在运行。然后,主管使用其自定义策略来处理这个问题:
override def supervisorStrategy = OneForOneStrategy(maxNrOfRetries = 3){
case _: IllegalStateException => Restart
case t =>
super.supervisorStrategy.decider.applyOrElse(t, (_: Any) => Escalate)
}
在我的持久化actor重启三次之后,一切都终止了(顺便说一句,这里真的发生了什么?)并且我在日志文件中有所有堆栈跟踪和错误消息。
答案 1 :(得分:0)
1)它很可能发出一个恢复请求(正如每个PersistentActor
在启动时所做的那样)并且由于日志未启动(或者是它?)它正在等待响应(恢复)才会开始在任何外部消息上。您可以在override def preStart() = ()
作为Persistence docs中的文档,在启动时禁用恢复。
2)在一个普通的老年人中同步写入数据库"你怎么知道数据库已关闭?如果写入失败。同样在Akka Persistence中,如果你persist()
并且它失败了,你将按照in the docs的说明回复PersistenceFailure
。