Каков хороший способ заставить актера повторить что-то в случае неудачи, но с увеличивающимися временными интервалами между повторными попытками? Скажем, я хочу, чтобы актер повторил попытку через 15 секунд, затем через 30 секунд, затем каждую минуту в течение ограниченного числа раз.
Вот что я придумал:
- метод актора, который выполняет фактическую работу, имеет необязательный параметр
RetryInfo
, который, если он присутствует, содержит номер повторной попытки, в которой мы находимся в данный момент. - в случае неудачи актор отправит себе новый
ScheduleRetryMessage
сretryCount + 1
, а затем выдаст исключение RuntimeException. - другой актор наблюдает за рабочим актором, используя
new OneForOneStrategy(-1, Duration.Inf()
, возвращающийResume
в качестве своей директивы. У актера нет состояния, поэтомуResume
должно быть в порядке - on receiving the
ScheduleRetryMessage
, the actor will- if
retryCount < MAX_RETRIES
: use Akka's scheduler to schedule sending aRetryMessage
after the desired delay - еще: наконец сдаться, отправив сообщение другому актеру для сообщения об ошибке
- if
Это хорошее решение или есть лучший подход?