пружина, повторяемая с различными перехватчиками

#java #spring #spring-retry

Вопрос:

Предположим, что это довольно простой случай. У меня есть @Service :

 @Service
public class Dummy {

    @Retryable(interceptor = "myInterceptor")
    public Response getResponse() {
       // whatever
    }

}
 

Теперь , в зависимости от a @Conditional , я хочу либо включить, либо отключить @Retryable . В настоящее время у меня есть (грязный?) взлом на месте для этого:

 @Bean
@ConditionalOnMyPropertyEnabled
public RetryOperationsInterceptor myInterceptor() {
    return // an instance of an interceptor that actually retries
}

@Bean("myInterceptor")
@ConditionalOnMyPropertyDisabled
public RetryOperationsInterceptor myNeverRetryInterceptor() {
    return RetryInterceptorBuilder.stateless().retryPolicy(new NeverRetryPolicy()).build();
}
 

Поэтому, когда мое условие будет выполнено, получите реальный повторяемый экземпляр. Когда это не так, достаньте мне NeverRetryPolicy повторный вариант.

Проблема, которая меня беспокоит, заключается в том, что я не могу написать правильный тест, чтобы подтвердить наличие определенного компонента в моем контексте на основе этих @ConditionalOnMyPropertyEnabled и @ConditionalOnMyPropertyDisabled .

Это связано с тем, что имя компонента myInterceptor в обоих случаях является артефактом того факта, что @Retryable interceptor в качестве входных данных используется один, а не массив, например.


Теоретически я мог бы создать что-то вроде этого:

 class MetadataAwareRetryOperationsInterceptor extends RetryOperationsInterceptor {

    private final RetryOperationsInterceptor interceptor;

    MetadataAwareRetryOperationsInterceptor(RetryOperationsInterceptor interceptor) {
        this.interceptor = interceptor;
    }

    private Map<String, String> metadata = Collections.emptyMap();

    Map<String, String> getMetadata() {
        return metadata;
    }

    void setMetadata(Map<String, String> metadata) {
        this.metadata = metadata;
    }
}
 

И используйте MetadataAwareRetryOperationsInterceptor разные метаданные для каждого из моих экземпляров и проверяйте их, но это выглядит как большое превышение; особенно если вы думаете, что мне это нужно только для теста.

Может быть, есть более простой способ, который я упускаю?