有没有办法告诉持久性后端在与持久性参与者一起工作时无法访问?
Is there a way to tell that persistence backend is unreachable when working with persistent actor?
我正在使用 EventStore 作为后端,在 Scala 中与一个持久性参与者一起工作。测试是基于 specs2 的。在规范 class 的初始化期间,在另一个正在实例化的 class 的构造函数中,我向我的演员询问一些东西,如果 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 尚未收到任何持久化的命令来更改其状态,因为它刚刚创建。
其次,如何检测后台没有运行事先向用户发出警告?
1) 它很可能发出了一个恢复请求(就像每个 PersistentActor
在启动时所做的那样)并且由于日志没有启动(或者是?)它正在等待它之前的响应(恢复)将接受任何外部消息。您可以通过 override def preStart() = ()
禁用启动时恢复,如 Persistence docs.
中的文档所示
2) 在 "plain old all synchronously writing to a database" 中,您如何知道数据库已关闭?如果写入失败。类似地,在 Akka Persistence 中,如果你 persist()
并且它失败了,你将返回一个 PersistenceFailure
,如 in the docs 所述。
使用来自 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 重新启动 3 次后,一切都终止了(顺便说一句,这里的幕后到底发生了什么?)并且我在日志文件中有所有堆栈跟踪和错误消息。
我正在使用 EventStore 作为后端,在 Scala 中与一个持久性参与者一起工作。测试是基于 specs2 的。在规范 class 的初始化期间,在另一个正在实例化的 class 的构造函数中,我向我的演员询问一些东西,如果 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 尚未收到任何持久化的命令来更改其状态,因为它刚刚创建。
其次,如何检测后台没有运行事先向用户发出警告?
1) 它很可能发出了一个恢复请求(就像每个 PersistentActor
在启动时所做的那样)并且由于日志没有启动(或者是?)它正在等待它之前的响应(恢复)将接受任何外部消息。您可以通过 override def preStart() = ()
禁用启动时恢复,如 Persistence docs.
2) 在 "plain old all synchronously writing to a database" 中,您如何知道数据库已关闭?如果写入失败。类似地,在 Akka Persistence 中,如果你 persist()
并且它失败了,你将返回一个 PersistenceFailure
,如 in the docs 所述。
使用来自 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 重新启动 3 次后,一切都终止了(顺便说一句,这里的幕后到底发生了什么?)并且我在日志文件中有所有堆栈跟踪和错误消息。