Акка и Спросите Образец. Когда Актер внезапно остановлен, могу ли я вернуть Будущее?
В настоящее время у меня есть код, который отправляет запрос с использованием шаблона Ask. Отправленный запрос сгенерирует Akka Actor, который отправляет HTTP-запрос, а затем возвращает ответ. Я использую API прерывателя цепи Akka для управления проблемами с вышестоящими веб-сервисами, которые я называю.
Если автоматический выключатель находится в разомкнутом состоянии, то все последующие запросы не выполняются быстро, что является желаемым эффектом. Однако, когда субъект терпит неудачу быстро, он просто генерирует CircuitBreakerOpenException, останавливает субъекта, однако элемент управления не возвращается к коду, который сделал первоначальный запрос, пока не будет сгенерировано AskTimeoutException.
Это код, который отправляет запрос
Timeout timeout = new Timeout(Duration.create(10, SECONDS));
Future<Object> future = Patterns.ask(myActor, argMessage, timeout);
Response res = (Response ) Await.result(future, timeout.duration());
Это выключатель
getSender().tell(breaker.callWithSyncCircuitBreaker(new Callable<Obj>()
{
@Override
public Obj call() throws Exception {
return fetch(message);
}
}), getSelf()
);
getContext().stop(getSelf());
Когда этот блок кода выполняется и если цепь разомкнута, она быстро перестает выдавать исключение, однако я хочу вернуть управление обратно к коду, который обрабатывает будущее без необходимости ожидания тайм-аута.
Это возможно?
1 ответ
При сбое и перезапуске субъекта, если он обрабатывал сообщение, ответ не будет автоматически отправлен этому отправителю. Если вы хотите отправить этому отправителю сообщение об этом конкретном сбое, то явно перехватите это исключение и ответьте этому отправителю с ошибочным результатом, убедившись, что сначала перехватили отправителя, прежде чем перейти к любым будущим обратным вызовам, чтобы избежать закрытия этого изменяемого состояния., Вы также можете попытаться сделать это в preRestart, но это не очень безопасно, так как к тому времени отправитель мог измениться, если вы используете фьючерс внутри актера.