2016-03-05 2 views
1

Чтобы включить Spring повторить можно либо включить повторную попытку в Java аннотаций: @EnableRetry в конфигурации или указать попытку в файле конфигурации XML:Как включить повтор Spring с помощью версии Spring Retry 1.0.3?

<context:annotation-config /> 
<aop:aspectj-autoproxy /> 
<bean class="org.springframework.retry.annotation.RetryConfiguration" /> 

Обе спецификации основаны на ... annotation.RetryConfiguration, которая началась только с версии 1.1.2. Как включить повтор в конфигурации XML в предыдущих версиях? Из-за проблем с совместимостью я не могу использовать версию 1.1.2. Конфигурация повтора выглядит следующим образом:

<aop:config> 
    <aop:pointcut id="retrySave" 
     expression="execution(* sfweb.service.webServiceOrders.WsOrderCreationServiceImpl.saveLedger(..))" /> 
    <aop:advisor pointcut-ref="retrySave" advice-ref="retryAdvice" 
     order="-1" /> 
</aop:config> 

<bean id="retryAdvice" 
    class="org.springframework.retry.interceptor.RetryOperationsInterceptor"> 
</bean> 

ответ

1

Spring Retry 1.0.3 не поддерживает AspectJ на основе AOP. Таким образом, повторения аспектного стиля не будут работать с этой версией. Вместо этого повторный код должен быть обернут внутри экземпляра RetryCallback. Общий подход заключается в следующем:

1. Создайте RetryTemplate

SimpleRetryPolicy simpleRetryPolicy = new SimpleRetryPolicy(); 
simpleRetryPolicy.setMaxAttempts(maxAttempts); 

FixedBackOffPolicy fixedBackOffPolicy = new FixedBackOffPolicy(); 
fixedBackOffPolicy.setBackOffPeriod(backOffPeriod); 

RetryTemplate retryTemplate = new RetryTemplate(); 
retryTemplate.setBackOffPolicy(fixedBackOffPolicy); 
retryTemplate.setRetryPolicy(simpleRetryPolicy); 

2. Оберните retryable код в RetryCallback

class FailureProneOperation implements RetryCallback<Void> { 
    public void doWithRetry(RetryContext context) throws Exception { 
    ... 
    } 
} 

3. Выполните retryable кода

retryTemplate.execute(new FailureProneOperation()) 
+0

Так что, если у меня есть метод saveLedger, который вызывается внутри класса, где ме- он должен быть установлен? –

+1

'doWithRetry (...) {saveLedger (...); } '. – manish

+0

Как передать параметр saveLedger() –

0

В дополнении к отправленному ответу, мы должны также код для передачи параметров для retryable операций. Это может быть сделано в конструкторе FailureProneOperation:

public FailureProneOperation(OrderSkuLedger orderSkuLedger) { 
    this.orderSkuLedger = orderSkuLedger; 
} 
Смежные вопросы