Я следую коду из отказоустойчивости akka.io http://doc.akka.io/docs/akka/current/java/fault-tolerance.html
. Я взял этот код в качестве эталона. Мои требования следующие: предположим, что актор терпит крах при получении сообщения и перезапускается своим руководителем. Затем он начинает обрабатывать очередное сообщение в своем почтовом ящике. Сообщение, вызвавшее сбой, «отброшено». Но я хочу обработать одно и то же действие в течение определенного количества раз (допустим, 3 раза) с определенным интервалом между ними (допустим, 1 секунда). Как это сделать с помощью контроля akka. На самом деле через актера я пытаюсь проверить, работает ли конкретный API-интерфейс службы или нет (т.е. Даю какое-то исключение). Поэтому, если есть какое-либо исключение при конкретной попытке (предположим, 404 не найдено), повторно отправьте сообщение неудавшемуся работнику до тех пор, пока maxNrOfRetries достигается, как указано в supervisorStrategy. Если рабочий не смог выполнить "maxNrOfRetries" раз, то просто зарегистрируется как "максимальное количество попыток, достигнутых для этого сообщения xx". Как я сделаю это в java.
мой класс супервайзера:
public class Supervisor extends UntypedActor {
private static SupervisorStrategy strategy =
new OneForOneStrategy(3, Duration.create("1 minute"),
new Function<Throwable, Directive>() {
@Override
public Directive apply(Throwable t) {
if (t instanceof Exception) {
return restart();
}else if (t instanceof IllegalArgumentException) {
return stop();
} else {
return escalate();
}
}
});
@Override
public SupervisorStrategy supervisorStrategy() {
return strategy;
}
public void onReceive(Object o) {
if (o instanceof Props) {
getSender().tell(getContext().actorOf((Props) o), getSelf());
} else {
unhandled(o);
}
}
}
Детский класс:
public class Child extends UntypedActor {
public void onReceive(Object o) throws Exception {
if (o instanceof String) {
Object response = someFunction( (String) message);//this function returns either successfull messgae as string or exception
if(response instanceOf Exception) {
throw (Exception) response;
}
else
getSender().tell(response, getSelf())
}else {
unhandled(o);
}
}
}
Создание актера:
Props superprops = Props.create(Supervisor.class);
ActorRef supervisor = system.actorOf(superprops, "supervisor");
ActorRef child = (ActorRef) Await.result(ask(supervisor,
Props.create(Child.class), 5000), timeout);
child.tell("serVice_url", ActorRef.noSender());
Для service_url я хочу повторить процесс, если произойдет сбой. Но этого не происходит. если написать следующую строку при создании актера как child.tell("serVice_url_2", ActorRef.noSender());
, то эта строка будет выполнена, но я хочу обработать одно и то же действие (для которого происходит сбой) в течение определенного количества раз (допустим, 3 раза) с определенным интервалом между ними. Пожалуйста, помогите мне достичь этого.