0

我正在使用 EventStore 作为后端与 Scala 中的持久性参与者合作。测试基于 specs2。在规范类的初始化期间,在正在实例化的另一个类的构造函数中,我向我的演员询问一些事情,如果 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我的演员的名字在哪里。

问题是,

首先,为什么我的演员没有回应提问?请求的命令没有被持久化,并且actor此时还没有收到任何持久化的命令来改变它的状态,因为它刚刚被创建。

其次,如何检测到后端没有预先运行以向用户发出警告?

4

2 回答 2

1

使用来自 ktoso 的指针(谢谢!)和一个小型测试项目,我找到了自己的方式。我按照一些错误消息的建议处理RecoveryFailure我的持久性演员,方法是向前抛出 anew IllegalStateException并建议检查 EventStore 是否正在运行。然后主管可以使用其自定义策略来处理此问题:

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

在我的持久性参与者重新启动 3 次之后,一切都终止了(顺便说一下,这里到底发生了什么?)并且我在日志文件中拥有所有堆栈跟踪和错误消息。

于 2015-05-28T15:28:05.677 回答
0

1)它很可能发出了一个恢复请求(就像每个PersistentActor人在启动时所做的那样),并且由于日志没有启动(或者是它吗?)它在接收任何外部消息之前正在等待响应(恢复)。您可以通过Persistence docsoverride def preStart() = ()中的文档禁用启动时恢复。

2)在“普通的所有同步写入数据库”中,您如何知道数据库已关闭?如果写入失败。同样,在 Akka Persistence 中,如果您persist()失败了,您将得到 a PersistenceFailure,如文档中所述

于 2015-05-27T14:20:40.663 回答