2016-06-29 2 views
3

У меня есть этот кусок кодаКак я могу настроить spring @retryable?

@Retryable(maxAttempts = 3, stateful = true, include = ServiceUnavailableException.class, 
     exclude = URISyntaxException.class, backoff = @Backoff(delay = 1000, multiplier = 2)) 
public void testThatService(String serviceAccountId) 
     throws ServiceUnavailableException, URISyntaxException { 

// некоторые реализации здесь }

Есть ли способ, что я могу сделать maxAttempts, задержки и умножитель конфигурируемый с помощью @value? Или существует ли какой-либо другой подход, позволяющий настраивать такие поля внутри аннотаций?

ответ

2

В настоящее время это невозможно; для проводки в свойствах аннотация должна была бы быть изменена, чтобы принимать значения String, а постобразетка компонента аннотации должна была бы разрешать заполнители и/или выражения SpEL.

См. this answer для альтернативы, но в настоящее время это невозможно сделать с помощью аннотации.

EDIT

<bean id="retryAdvice" class="org.springframework.retry.interceptor.RetryOperationsInterceptor"> 
    <property name="retryOperations"> 
     <bean class="org.springframework.retry.support.RetryTemplate"> 
      <property name="retryPolicy"> 
       <bean class="org.springframework.retry.policy.SimpleRetryPolicy"> 
        <property name="maxAttempts" value="${max.attempts}" /> 
       </bean> 
      </property> 
      <property name="backOffPolicy"> 
       <bean class="org.springframework.retry.backoff.ExponentialBackOffPolicy"> 
        <property name="initialInterval" value="${delay}" /> 
        <property name="multiplier" value="${multiplier}" /> 
       </bean> 
      </property> 
     </bean> 
    </property> 
</bean> 

<aop:config> 
    <aop:pointcut id="retries" 
     expression="execution(* org..EchoService.test(..))" /> 
    <aop:advisor pointcut-ref="retries" advice-ref="retryAdvice" 
     order="-1" /> 
</aop:config> 

Где EchoService.test это метод, который вы хотите применить повторные попытки.

+0

Если вы не возражаете, могли бы вы привести пример, а также с помощью RetryOperationsInterceptor? – Sabarish

+1

Я добавил пример, используя конфигурацию XML. –

0

Вы можете использовать RetryTemplate боб вместо @Retryable аннотацию, как это:

@Value("${retry.max-attempts}") 
private int maxAttempts; 
@Value("${retry.delay}") 
private long delay; 

@Bean 
public RetryTemplate retryTemplate() { 
    SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy(); 
    retryPolicy.setMaxAttempts(maxAttempts); 

    FixedBackOffPolicy backOffPolicy = new FixedBackOffPolicy(); 
    backOffPolicy.setBackOffPeriod(delay); 

    RetryTemplate template = new RetryTemplate(); 
    template.setRetryPolicy(retryPolicy); 
    template.setBackOffPolicy(backOffPolicy); 
    return template; 
} 

И затем использовать execute метод этого шаблона:

@Autowired 
private RetryTemplate retryTemplate; 

public ResponseVo doSomething(final Object data) { 
    RetryCallback<ResponseVo, SomeException> retryCallback = new RetryCallback<ResponseVo, SomeException>() { 
     @Override 
     public ResponseVo doWithRetry(RetryContext context) throws SomeException { 
      // do the business 
      return responseVo; 
     } 
    }; 
    return retryTemplate.execute(retryCallback); 
} 
4

с выпуском Spring-повторов версии 1.2, возможно. @Retryable можно настроить с помощью SPEL.

@Retryable(value = { SomeException.class,AnotherException.class }, maxAttemptsExpression = "#{@myBean.getMyProperties('retryCount')}", backoff = @Backoff(delayExpression = "#{@myBean.getMyProperties('retryInitalInterval')}")) 
    public void doJob(){ 
    //your code here 
     } 

Для получения более подробной информации см: https://github.com/spring-projects/spring-retry/blob/master/README.md

0

Как поясняется здесь: https://stackoverflow.com/a/43144064

версии 1.2 появилась возможность использовать выражения для определенных свойств.

Так что вам нужно что-то вроде этого:

@Retryable(maxAttempts = 3, stateful = true, include = ServiceUnavailableException.class, 
     exclude = URISyntaxException.class, backoff = @Backoff(delayExpression = "#{${your.delay}}" , multiplier = 2)) 
public void testThatService(String serviceAccountId) 
     throws ServiceUnavailableException, URISyntaxException { 
Смежные вопросы