Spring @Retryable создает новое соединение или использует то же соединение с сервером?

У меня есть проект Spring, в котором я использую аннотацию @Retryable для метода. Метод вызывает API и отправляет в него некоторую полезную нагрузку в формате JSON.

Я установил maxAttempts как 4 и задержку повтора 20 мс, используя Backoff.

Я отлаживаю проблему и, следовательно, пытаюсь понять, создает ли @Retryable новое соединение (новый поток) с сервером, на котором размещен API, после указанной задержки (в моем случае 20 мс) или использует то же соединение (тот же поток)

Ваша логика повтора будет выполняться в одном потоке. Если вы сделаете HTTP-запрос из своей логики повторных попыток, он будет открывать и закрывать соединение при каждом выполнении. Мы не можем ответить, создаст ли это новый серверный поток, не зная, какой HTTP-сервер работает, но я могу с уверенностью 99,99% сказать, что да, каждый запрос будет порождать поток для его обработки.

lane.maxwell 09.04.2024 23:16

@lane.maxwell, проще говоря, согласно конфигурации, которую я определил выше, будет 4 разных потока - по одному на каждую повторную попытку? И если да, то теряется ли и закрывается ли предыдущая ветка?

Tech Savy 09.04.2024 23:25

Да, но имейте в виду, что эти темы очень недолговечны. На стороне клиента будет выполняться один поток для обработки повторных попыток и отсрочки; на стороне сервера будет создан поток для обработки каждого запроса (при условии, что вы не используете какой-то странный однопоточный сервер).

lane.maxwell 10.04.2024 02:39
1
3
166
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

@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.

Tech Savy 09.04.2024 22:25

@EnableRetry импортирует для нас RetryConfiguration. Он сканирует bean-компоненты на предмет @Retryable и применяет к этим методам AnnotationAwareRetryOperationsInterceptor с логикой RetryTemplate.

Artem Bilan 10.04.2024 16:57

Другие вопросы по теме