#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
разные метаданные для каждого из моих экземпляров и проверяйте их, но это выглядит как большое превышение; особенно если вы думаете, что мне это нужно только для теста.
Может быть, есть более простой способ, который я упускаю?