【发布时间】:2015-08-25 21:21:20
【问题描述】:
Akka Java 在这里。我有两个演员,Parent 和 Child,前者是后者的父级。如果Child 抛出一个特定的异常(比如UnrulyTeenagerExcepton),那么我正在寻找的行为如下:
-
Parent保存了对抛出异常时Child正在处理的消息的引用;那么 -
Child重启,持久化消息“回放”到Child;但是 - 如果此保存 -> 重新启动 -> 重播循环发生 3 次,
Child抛出UnrulyTeenagerException3 次,那么我们SupervisorStrategy.escalate()
迄今为止我最好的尝试:
// Groovy pseudo-code
class ChildFailureDecider extends Function<Throwable,Directive> {
int maxRetries = 3
int numRetries = 0
@Override
Directive apply(Throwable childFailure) {
if(childFailure instanceof UnrulyTeenagerException) {
numRetries++
if(numRetries <= maxRetries) {
// TODO: #1 How to persist the message that caused the ‘childFailure’?
return SupervisorStrategy.restart()
// TODO: #2 How to ‘play back’ the persisted message to Child?
}
}
SupervisorStrategy.escalate()
}
}
但正如您所见,我正在为消息持久性和回放而苦苦挣扎。有任何想法吗? 非常感谢 Java 代码示例,Akka 足够强悍,无需学习 Scala 象形文字!
【问题讨论】:
-
通过'persist',您是否需要将消息写入磁盘,或者只是在其被捕获在Parent内部的变量中的意义上持久化?
-
感谢@mattinbits (+1) - 我猜所说的“持久”是指使用 Akka-Persistence 模块和
UntypedPersistentActorWithAtLeastOnceDelivery完成的任何事情。然而,诚然,我并不完全理解持久性参与者的工作原理,因此它们可能与我在这里展示的用例不同。归根结底,我只需要 Akka 保存(某处)在处理子进程时失败的消息,重新启动子进程,然后在重新启动的子进程上重新处理已保存的消息。想法?再次感谢!
标签: java akka akka-supervision