有没有办法告诉持久性后端在使用持久化actor时无法访问?

时间:2015-05-27 13:58:59

标签: scala akka akka-persistence

我正在使用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在此时没有收到任何持久的命令来改变它的状态,因为它刚刚被创建。

第二,如何检测后端未预先运行以向用户发出警告?

2 个答案:

答案 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