One RetryTemplate be route.

If not, it causes an IllegalArgumentException
This commit is contained in:
sgibb
2023-08-03 15:49:44 -04:00
parent 4cffb2d4d2
commit a8dc202edf
2 changed files with 18 additions and 16 deletions

View File

@@ -53,23 +53,21 @@ public abstract class RetryFilterFunctions {
RetryConfig config = new RetryConfig();
configConsumer.accept(config);
RetryTemplateBuilder retryTemplateBuilder = RetryTemplate.builder();
return (request, next) -> {
CompositeRetryPolicy compositeRetryPolicy = new CompositeRetryPolicy();
Map<Class<? extends Throwable>, Boolean> retryableExceptions = new HashMap<>();
config.getExceptions().forEach(exception -> retryableExceptions.put(exception, true));
SimpleRetryPolicy simpleRetryPolicy = new SimpleRetryPolicy(config.getRetries(), retryableExceptions);
compositeRetryPolicy.setPolicies(
Arrays.asList(simpleRetryPolicy, new HttpStatusRetryPolicy(config)).toArray(new RetryPolicy[0]));
RetryTemplate retryTemplate = retryTemplateBuilder.customPolicy(compositeRetryPolicy).build();
return retryTemplate.execute(context -> {
ServerResponse serverResponse = next.handle(request);
CompositeRetryPolicy compositeRetryPolicy = new CompositeRetryPolicy();
Map<Class<? extends Throwable>, Boolean> retryableExceptions = new HashMap<>();
config.getExceptions().forEach(exception -> retryableExceptions.put(exception, true));
SimpleRetryPolicy simpleRetryPolicy = new SimpleRetryPolicy(config.getRetries(), retryableExceptions);
compositeRetryPolicy.setPolicies(
Arrays.asList(simpleRetryPolicy, new HttpStatusRetryPolicy(config)).toArray(new RetryPolicy[0]));
RetryTemplate retryTemplate = retryTemplateBuilder.customPolicy(compositeRetryPolicy).build();
return (request, next) -> retryTemplate.execute(context -> {
ServerResponse serverResponse = next.handle(request);
if (isRetryableStatusCode(serverResponse.statusCode(), config)) {
throw new HttpServerErrorException(serverResponse.statusCode());
}
return serverResponse;
});
};
if (isRetryableStatusCode(serverResponse.statusCode(), config)) {
throw new HttpServerErrorException(serverResponse.statusCode());
}
return serverResponse;
});
}
private static boolean isRetryableStatusCode(HttpStatusCode httpStatus, RetryConfig config) {

View File

@@ -270,6 +270,10 @@ public class ServerMvcIntegrationTests {
@Test
public void retryWorks() {
restClient.get().uri("/retry?key=get").exchange().expectStatus().isOk().expectBody(String.class).isEqualTo("3");
// test for: java.lang.IllegalArgumentException: You have already selected another
// retry policy
restClient.get().uri("/retry?key=get2").exchange().expectStatus().isOk().expectBody(String.class)
.isEqualTo("3");
}
@Test