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 { 

//ここ }

いくつかの実装のこの作品は、私が@valueを使用してmaxAttempts、遅延および乗算器は、設定することができます方法はありますか? または、注釈内のそのようなフィールドを構成可能にする他の方法はありますか?

答えて

2

現在のところできません。プロパティをワイヤリングするには、アノテーションをString値に変更する必要があり、アノテーションBeanポストプロセッサはプレースホルダおよび/またはSpEL式を解決する必要があります。

代替方法についてはthis answerを参照してください。現在のところ、アノテーションでは実行できません。

EDIT EchoService.testは、あなたが再試行を適用する方法である

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

+0

あなたの心をいけない場合、あなたはRetryOperationsInterceptorを使用して、同様の例を提供することができ:

だからあなたは、このようなものが必要? – Sabarish

+1

XML設定を使用した例を追加しました。 –

0

あなたは、代わりにこのような@Retryable注釈のRetryTemplate Beanを使用することができます。

@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方法を使用します。春のリトライバージョン1.2のリリースで

@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

を、それが可能だ。 @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 { 
関連する問題