2015-05-27 37 views
0

我正在使用EventStore作为后端在Scala中执行一个演员。测试是基于specs2的。在规范类的初始化,正被实例化的其他类的构造函数中,我要求我的演员的东西,如果EventStore没有运行,出现因有没有办法说明持久性后端在使用持久性actor时无法访问?

akka.pattern.AskTimeoutException: Ask timed out on 
[Actor[akka://com-optrak-opkakka-authentication-AuthenticationManagementSpec/user/$b/AuthenticationModel#1565142060]] after [2000 ms] 

Could not create an instance of 
com.optrak.opkakka.authentication.AuthenticationManagementSpec 

AuthenticationModel是我演员的名字。

问题是,

首先,为什么我的演员不回答问?被问到的命令没有被保留,并且该角色此时还没有收到任何持久命令来改变其状态,因为它刚刚创建。

秒,我该如何检测后端未事先运行向用户发出警告?

回答

1

使用ktoso(谢谢!)和一个小测试项目的指针,我找到了我自己的方式。我在持续演员中处理RecoveryFailure,正如某些错误消息所建议的,通过向new IllegalStateException提出一个建议来检查EventStore是否正在运行。然后主管在处理这种使用其定制策略得到了一枪:

override def supervisorStrategy = OneForOneStrategy(maxNrOfRetries = 3){ 
    case _: IllegalStateException => Restart 
    case t => 
    super.supervisorStrategy.decider.applyOrElse(t, (_: Any) => Escalate) 
} 

我执着的演员重新启动三次,一切之后,终止(顺便说一下,什么是真正的引擎盖下发生在这里?)和我都日志文件中的堆栈跟踪和错误消息。

0

1)它最有可能发出恢复请求(因为每个PersistentActor在启动时都会这样做),并且由于日志未启动(或是否?),它将等待响应(恢复),然后它将采取任何外部消息。您可以通过override def preStart() =()在启动时禁用恢复,作为Persistence docs中的文档。

2)在一个“普通的老式全部同步写入数据库”中,您如何知道数据库已关闭?如果写入失败。同样在Akka Persistence中,如果您persist()并且失败,则会返回PersistenceFailure,如in the docs所述。