Spring Retry - это энергетическая функция, независимая от пружинной партии, которая в основном реализует повторение и предотвращение. Существуют ограничения сценариев для повторной попытки, и не все сценарии подходят для повторной попытки, такие как нелегальная проверка параметров, операции записи и т. Д. (Вам необходимо рассмотреть вопрос о том, является ли запись идентифицирующей) не подходят для повторной попытки. Удаленный тайм -аут звонка или прерывание сети может быть повторно повторно. В рамках управления микросервисом он обычно имеет свою собственную повторную попытку и конфигурацию тайм -аута. Например, Dubbo может установить RESRIES = 1, Timeout = 500 вызов сбоя и повторения только один раз, а вызов не удастся, если он не возвращается через более 500 мс. Весной повторной попытки вы можете указать тип исключения, который необходимо повторно, и установить интервал для каждой повторной попытки и, если повторная попытка не удается, будь то повторная попытка или предохраните (прекратить повторение).
Проектирование и реализация
RetryOperations определяет Retry API. RetryTemplate - это реализация режима шаблона API, которая реализует повторную попытку и разрыв схемы. Предоставленный API выглядит следующим образом:
public interface retryoperations {<t, e Extends Throwable> t выполнить (retrycallback <t, e> retrycallback) бросает e; } // другие API были опущены RetryCallback определяет операцию, которая необходимо выполнить. После определения операции речь идет о том, как повторно повторить. RetryTemplate выполняет логику того, как повторно повторить, сформулируя различные стратегии повторения. Стратегия повторного возрождения по умолчанию SimpleRetryPlicy , что означает, что она будет повторена 3 раза. Если попытка успешна, вы не будете продолжать пытаться снова. Так что, если повторение 3 фута не удалось? Процесс заканчивается или возвращает результат снизу вверх. Чтобы вернуть результат снизу вверх, вам необходимо настроить RecoveyCallBack . Из имени вы можете видеть, что это интерфейс обратного вызова снизу вверх, который является логикой выполнения после удара повторного переказа. В дополнение к SimpleRetryPolicy , есть и другие стратегии повторения. Давайте посмотрим на интерфейс RetryPolicy :
публичный интерфейс retrypolicy Extends Serializable {Boolean Canretry (ContryContext Context); Retrycontext open (retrycontext parent); void закрыть (контекст RetryContext); void registerThable (контекст retryContext, бросаемый бросок);} canRetry называется каждый раз, когда вы попробуете еще раз. Условие суждения о том, сможете ли вы продолжить попытку снова
Вызовов до начала open повторного периода, контекст повторной попытки будет создан в RetryContext , а стек Retry будет сохранен.
registerThrowable называется каждый раз, когда исключение повторно (есть исключение, и оно будет продолжать повторить)
В качестве примера взять SimpleRetryPolicy . Когда количество повторений достигает 3 (по умолчанию 3 раза), прекратите повторение, а количество повторений сохраняется в контексте повторной попытки.
Предоставьте следующую реализацию стратегии повторения:
Повторяйте стратегию отступления, ссылается на то, немедленно повторно повторит, или подождите некоторое время, прежде чем попробовать снова. По умолчанию вам необходимо указать политику отступления BackoffRetryPolicy , если вам нужно настроить период ожидания, а затем повторить попытку. Backoffretrypolicy имеет следующую реализацию:
Stateful Relry или безрассудная попытка
Так называемая попытка без гражданства относится к повторной попытке завершить в контексте потока. В противном случае, если повторная попытка не завершена в контексте потока, является Stateful Retry. Предыдущая SimpleRetryPolicy была попыткой без сохранения состояния, потому что повторная попытка была завершена в цикле. Так что же происходит после этого или нужно повторно повторно в штате? Обычно есть две ситуации: откат транзакции и выключатель схемы.
DataCcessException является исключительным. RETRY не может быть выполнена, но если будут брошены другие исключения, вы можете попробовать еще раз.
Предохранитель означает не повторение в текущем цикле, а в глобальном режиме повторной попытки (не контекст потока). Выключатель схемы выпрыгнет из петли, а информация о стеке контекста потока неизбежно будет потеряна. Тогда определенно необходимо сохранить эту информацию в «глобальном режиме». Текущая реализация помещается в кэш (реализация карты). Вы можете продолжать попробовать еще раз после того, как в следующий раз вы получите его из кэша.
Быстрый старт
Используйте @EnableRetry в классе, который должен выполнить повторную попытку, если установлен proxyTargetClass=true , он использует динамический прокси CGLIB:
@Configuration@enableretry (proxytargetClass = true) @componentpublic class retryexamples {} Повторная попытка на основе максимального количества стратегии повторных рисков, если повторение повторяется 3 раза, а исключение все еще отброшено, повторение останавливается и выполняется обратный вызов снизу вверх. Следовательно, конечным результатом вывода является Integer.MAX_VALUE :
private void retryExample3 () бросает исключение {retrytemplate retrytemplate = new RetryTemplate (); SimpleRetryPolicy SimpleRetryPolicy = new SimpleRetryPolicy (); SimpleRetrypolicy.setMaxattempts (3); retrytemplate.setretrypolicy (simpleeretrypolicy); Integer result = retryTemplate.execute (new RetryCallback <integer, excection> () {int i = 0; // Повторите операцию @Override public integer dowithretry (retryContext retryContext) Throws Exception {log.info ("retry count: {}", retryContext.getRightRycount (); RecordyCallback <Integer> () {// Base Callback @Override Public Integer Recover (retryContext retryContext) Throws exection {log.info ("После повторного действия: {}, метод восстановления!", RetryContext.getRetryCount ()); log.info ("Окончательный результат: {}", result); } private int len (int i) бросает исключение {if (i <10). Выбросить новое исключение (i + "le 10"); вернуть я; }В следующем описывается, как использовать режим политики повторного выключателя цепи (CircuitErryerryPolicy). Необходимо установить следующие три параметра:
Открытие и закрытие выключателя цепи:
Тестовый код заключается в следующем:
Retrytemplate шаблон = new Retrytemplate (); CircuitBreakerretrypolicy Retrypolicy = new CircuitBreakerretrypolicy (new SimpleRetryPolicy (3)); retrypolicy.setopentimeout (5000); retrypolicy.setresettimeout (20000); Template.setretrypolicy (retrypolicy); для (int i = 0; i <10; i ++) {//thread.sleep(100); try {object key = "current"; логический isforcerefresh = false; RETRYSTATE State = New DefaultretryState (Key, ISFORCEREFRESH); String result = template.execute (new retrycallback <string, runtimeexception> () {@override public String dowithretry (context retrycontext) throws runtimeexception {log.info ("retry count: {}", context.getRetRecount ()); Throw New Runtimexcept ("timeout"); @Override public String Recover (RetryContext Context) Throws Exception {return "default";}}, State); log.info ("result: {}", result); } catch (Exception e) {System.out.println (e); }} Поскольку установлено isForceRefresh = false , значение key = "circuit" (то есть RetryContext) будет получено из кэша. Следовательно, когда повторная попытка выходит из строя, и this.time < this.openWindow сливается, вы все равно можете продолжать реализовать повторение в глобальном режиме (полученный RetryContext является одинаковым).
Разработка аннотаций
Если писать RetryTemplate каждый раз, когда у вас есть требование повторения, слишком раздувается, использование аннотаций может значительно упростить разработку и уменьшить дублированный код. Вот попытка максимальной стратегии повторного повторения, реализованной с использованием аннотаций:
@Retryable (value = sqldataexception.class, backoff = @backoff (value = 0l)) public String Service3 () Throws SqlDataException {log.info ("Service3 Open"); бросить новый sqldataexception (); } @Recover public String recovery (sqldataexception ne) {return "sqlDataException recovery"; }Аннотации включают:
@Enableretry
@Retryable
@Восстанавливаться
@Backoff
@Circuitbreaker
@EnableRETRY: Вы можете попробовать еще раз? Когда свойство ProxyArgetClass True (по умолчанию false), используйте Cglib Proxy
@Retryable: метод, который необходимо повторно повторно
@Backoff: повторите стратегию отступления (попробуйте сейчас или подождите некоторое время, прежде чем попробовать снова)
@Recover: для использования с методами. Используется в качестве «гарантированного» метода, когда @retryable не удается. Метод аннотации @recover должен соответствовать методу «подпись» @retryable аннотации. Первый параметр записи является исключением, которое будет повторно повторно. Другие параметры согласуются с @retryable. Возвратное значение должно быть одинаковым, иначе оно не может быть выполнено!
@Circuitbreaker: используется для метода, реализовать режим разрыва схемы.
Для получения дополнительных примеров, добро пожаловать в мой github (https://github.com/happyxiaofan/springboot-learning-example). Спасибо
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.