У меня есть проект Spring, в котором я использую аннотацию @Retryable для метода. Метод вызывает API и отправляет в него некоторую полезную нагрузку в формате JSON.
Я установил maxAttempts
как 4 и задержку повтора 20 мс, используя Backoff
.
Я отлаживаю проблему и, следовательно, пытаюсь понять, создает ли @Retryable новое соединение (новый поток) с сервером, на котором размещен API, после указанной задержки (в моем случае 20 мс) или использует то же соединение (тот же поток)
@lane.maxwell, проще говоря, согласно конфигурации, которую я определил выше, будет 4 разных потока - по одному на каждую повторную попытку? И если да, то теряется ли и закрывается ли предыдущая ветка?
Да, но имейте в виду, что эти темы очень недолговечны. На стороне клиента будет выполняться один поток для обработки повторных попыток и отсрочки; на стороне сервера будет создан поток для обработки каждого запроса (при условии, что вы не используете какой-то странный однопоточный сервер).
@Retryable
использует RetryTemplate
, и логика у него такая:
while (canRetry(retryPolicy, context) && !context.isExhaustedOnly()) {
try {
...
T result = retryCallback.doWithRetry(context);
doOnSuccessInterceptors(retryCallback, context, result);
return result;
}
catch (Throwable e) {
...
if (canRetry(retryPolicy, context) && !context.isExhaustedOnly()) {
...
}
...
}
Итак, все повторные попытки происходят в одном и том же потоке — вызывающем.
Спасибо Артем Билан. Логика имеет смысл. Однако я пытаюсь связать эти 2 (@Retryable и RetryTemplate). Мне кажется, что это два разных способа применения логики повтора. Можете ли вы помочь мне понять, как @Retryable использует RetryTemplate? Я просматриваю Retryable.java и не могу понять, как он использует RetryTemplate.
@EnableRetry
импортирует для нас RetryConfiguration
. Он сканирует bean-компоненты на предмет @Retryable
и применяет к этим методам AnnotationAwareRetryOperationsInterceptor
с логикой RetryTemplate
.
Ваша логика повтора будет выполняться в одном потоке. Если вы сделаете HTTP-запрос из своей логики повторных попыток, он будет открывать и закрывать соединение при каждом выполнении. Мы не можем ответить, создаст ли это новый серверный поток, не зная, какой HTTP-сервер работает, но я могу с уверенностью 99,99% сказать, что да, каждый запрос будет порождать поток для его обработки.