Akka Java здесь. У меня есть два актера, Parent
и Child
, где первый является родителем второго. Если Child
выдает конкретное исключение (скажем, UnrulyTeenagerExcepton
), то поведение, которое я ищу, выглядит следующим образом:
Parent
сохраняет ссылку на сообщение, которое обрабатывалосьChild
, когда возникло исключение; потомChild
перезапускается, и сохраненное сообщение «воспроизводится» вChild
; но- Если этот цикл сохранения -> перезапуска -> воспроизведения происходит три раза, и
Child
выдаетUnrulyTeenagerException
три раза, тогда мы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!
UntypedPersistentActorWithAtLeastOnceDelivery
. Однако, по общему признанию, я не совсем понимаю, как работают персистентные акторы, и поэтому, возможно, они отличаются от варианта использования, который я здесь представляю. В конце концов, мне просто нужно, чтобы Akka сохранила (где-то) сообщение, которое не удалось обработать дочернему элементу, перезапустить дочерний элемент, а затем повторно обработать это сохраненное сообщение в перезапущенном дочернем элементе. Мысли? Спасибо еще раз! - person smeeb   schedule 26.08.2015