From 79096fbf8d58c8f595bf546ccfd8705f5fa034fb Mon Sep 17 00:00:00 2001 From: Spencer Gibb Date: Fri, 19 May 2017 14:54:42 -0600 Subject: [PATCH 1/4] Update SNAPSHOT to 1.2.2.RELEASE --- README.adoc | 2 +- docs/pom.xml | 2 +- pom.xml | 4 ++-- spring-cloud-commons-dependencies/pom.xml | 4 ++-- spring-cloud-commons/pom.xml | 2 +- spring-cloud-context/pom.xml | 2 +- spring-cloud-starter/pom.xml | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/README.adoc b/README.adoc index 604b808f..f9b4983f 100644 --- a/README.adoc +++ b/README.adoc @@ -151,4 +151,4 @@ added after the original pull request but before a merge. other target branch in the main project). * When writing a commit message please follow http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html[these conventions], if you are fixing an existing issue please add `Fixes gh-XXXX` at the end of the commit - message (where XXXX is the issue number). + message (where XXXX is the issue number). \ No newline at end of file diff --git a/docs/pom.xml b/docs/pom.xml index 97c27e3a..69a57011 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-commons-parent - 1.2.2.BUILD-SNAPSHOT + 1.2.2.RELEASE pom Spring Cloud Commons Docs diff --git a/pom.xml b/pom.xml index c6e33da7..a2345abf 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.springframework.cloud spring-cloud-commons-parent - 1.2.2.BUILD-SNAPSHOT + 1.2.2.RELEASE pom Spring Cloud Commons Parent Spring Cloud Commons Parent @@ -11,7 +11,7 @@ org.springframework.cloud spring-cloud-build - 1.3.3.BUILD-SNAPSHOT + 1.3.2.RELEASE diff --git a/spring-cloud-commons-dependencies/pom.xml b/spring-cloud-commons-dependencies/pom.xml index 48927011..55cde1a6 100644 --- a/spring-cloud-commons-dependencies/pom.xml +++ b/spring-cloud-commons-dependencies/pom.xml @@ -5,11 +5,11 @@ spring-cloud-dependencies-parent org.springframework.cloud - 1.3.3.BUILD-SNAPSHOT + 1.3.2.RELEASE spring-cloud-commons-dependencies - 1.2.2.BUILD-SNAPSHOT + 1.2.2.RELEASE pom spring-cloud-commons-dependencies Spring Cloud Commons Dependencies diff --git a/spring-cloud-commons/pom.xml b/spring-cloud-commons/pom.xml index c58c96ce..ece096e6 100644 --- a/spring-cloud-commons/pom.xml +++ b/spring-cloud-commons/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-commons-parent - 1.2.2.BUILD-SNAPSHOT + 1.2.2.RELEASE .. spring-cloud-commons diff --git a/spring-cloud-context/pom.xml b/spring-cloud-context/pom.xml index 54e834ac..0eee582a 100644 --- a/spring-cloud-context/pom.xml +++ b/spring-cloud-context/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-commons-parent - 1.2.2.BUILD-SNAPSHOT + 1.2.2.RELEASE .. spring-cloud-context diff --git a/spring-cloud-starter/pom.xml b/spring-cloud-starter/pom.xml index 488e0906..6db2ec0d 100644 --- a/spring-cloud-starter/pom.xml +++ b/spring-cloud-starter/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-commons-parent - 1.2.2.BUILD-SNAPSHOT + 1.2.2.RELEASE spring-cloud-starter spring-cloud-starter From 6cfaea4bb72643f32097421e90133381315c04f2 Mon Sep 17 00:00:00 2001 From: Spencer Gibb Date: Fri, 19 May 2017 14:57:35 -0600 Subject: [PATCH 2/4] Going back to snapshots --- README.adoc | 2 +- docs/pom.xml | 2 +- pom.xml | 4 ++-- spring-cloud-commons-dependencies/pom.xml | 4 ++-- spring-cloud-commons/pom.xml | 2 +- spring-cloud-context/pom.xml | 2 +- spring-cloud-starter/pom.xml | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/README.adoc b/README.adoc index f9b4983f..604b808f 100644 --- a/README.adoc +++ b/README.adoc @@ -151,4 +151,4 @@ added after the original pull request but before a merge. other target branch in the main project). * When writing a commit message please follow http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html[these conventions], if you are fixing an existing issue please add `Fixes gh-XXXX` at the end of the commit - message (where XXXX is the issue number). \ No newline at end of file + message (where XXXX is the issue number). diff --git a/docs/pom.xml b/docs/pom.xml index 69a57011..97c27e3a 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-commons-parent - 1.2.2.RELEASE + 1.2.2.BUILD-SNAPSHOT pom Spring Cloud Commons Docs diff --git a/pom.xml b/pom.xml index a2345abf..c6e33da7 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.springframework.cloud spring-cloud-commons-parent - 1.2.2.RELEASE + 1.2.2.BUILD-SNAPSHOT pom Spring Cloud Commons Parent Spring Cloud Commons Parent @@ -11,7 +11,7 @@ org.springframework.cloud spring-cloud-build - 1.3.2.RELEASE + 1.3.3.BUILD-SNAPSHOT diff --git a/spring-cloud-commons-dependencies/pom.xml b/spring-cloud-commons-dependencies/pom.xml index 55cde1a6..48927011 100644 --- a/spring-cloud-commons-dependencies/pom.xml +++ b/spring-cloud-commons-dependencies/pom.xml @@ -5,11 +5,11 @@ spring-cloud-dependencies-parent org.springframework.cloud - 1.3.2.RELEASE + 1.3.3.BUILD-SNAPSHOT spring-cloud-commons-dependencies - 1.2.2.RELEASE + 1.2.2.BUILD-SNAPSHOT pom spring-cloud-commons-dependencies Spring Cloud Commons Dependencies diff --git a/spring-cloud-commons/pom.xml b/spring-cloud-commons/pom.xml index ece096e6..c58c96ce 100644 --- a/spring-cloud-commons/pom.xml +++ b/spring-cloud-commons/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-commons-parent - 1.2.2.RELEASE + 1.2.2.BUILD-SNAPSHOT .. spring-cloud-commons diff --git a/spring-cloud-context/pom.xml b/spring-cloud-context/pom.xml index 0eee582a..54e834ac 100644 --- a/spring-cloud-context/pom.xml +++ b/spring-cloud-context/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-commons-parent - 1.2.2.RELEASE + 1.2.2.BUILD-SNAPSHOT .. spring-cloud-context diff --git a/spring-cloud-starter/pom.xml b/spring-cloud-starter/pom.xml index 6db2ec0d..488e0906 100644 --- a/spring-cloud-starter/pom.xml +++ b/spring-cloud-starter/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-commons-parent - 1.2.2.RELEASE + 1.2.2.BUILD-SNAPSHOT spring-cloud-starter spring-cloud-starter From 0c041591d1c1f02be584c68408fa843035f7087c Mon Sep 17 00:00:00 2001 From: Spencer Gibb Date: Fri, 19 May 2017 14:59:52 -0600 Subject: [PATCH 3/4] Bump to version 1.2.3.BUILD-SNAPSHOT --- docs/pom.xml | 2 +- pom.xml | 2 +- spring-cloud-commons-dependencies/pom.xml | 2 +- spring-cloud-commons/pom.xml | 2 +- spring-cloud-context/pom.xml | 2 +- spring-cloud-starter/pom.xml | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/pom.xml b/docs/pom.xml index 97c27e3a..8884557e 100644 --- a/docs/pom.xml +++ b/docs/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-commons-parent - 1.2.2.BUILD-SNAPSHOT + 1.2.3.BUILD-SNAPSHOT pom Spring Cloud Commons Docs diff --git a/pom.xml b/pom.xml index c6e33da7..b0f3d5e1 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ 4.0.0 org.springframework.cloud spring-cloud-commons-parent - 1.2.2.BUILD-SNAPSHOT + 1.2.3.BUILD-SNAPSHOT pom Spring Cloud Commons Parent Spring Cloud Commons Parent diff --git a/spring-cloud-commons-dependencies/pom.xml b/spring-cloud-commons-dependencies/pom.xml index 48927011..d02ee3ca 100644 --- a/spring-cloud-commons-dependencies/pom.xml +++ b/spring-cloud-commons-dependencies/pom.xml @@ -9,7 +9,7 @@ spring-cloud-commons-dependencies - 1.2.2.BUILD-SNAPSHOT + 1.2.3.BUILD-SNAPSHOT pom spring-cloud-commons-dependencies Spring Cloud Commons Dependencies diff --git a/spring-cloud-commons/pom.xml b/spring-cloud-commons/pom.xml index c58c96ce..7b120d36 100644 --- a/spring-cloud-commons/pom.xml +++ b/spring-cloud-commons/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-commons-parent - 1.2.2.BUILD-SNAPSHOT + 1.2.3.BUILD-SNAPSHOT .. spring-cloud-commons diff --git a/spring-cloud-context/pom.xml b/spring-cloud-context/pom.xml index 54e834ac..aad2dc1c 100644 --- a/spring-cloud-context/pom.xml +++ b/spring-cloud-context/pom.xml @@ -6,7 +6,7 @@ org.springframework.cloud spring-cloud-commons-parent - 1.2.2.BUILD-SNAPSHOT + 1.2.3.BUILD-SNAPSHOT .. spring-cloud-context diff --git a/spring-cloud-starter/pom.xml b/spring-cloud-starter/pom.xml index 488e0906..ad11a0f1 100644 --- a/spring-cloud-starter/pom.xml +++ b/spring-cloud-starter/pom.xml @@ -5,7 +5,7 @@ org.springframework.cloud spring-cloud-commons-parent - 1.2.2.BUILD-SNAPSHOT + 1.2.3.BUILD-SNAPSHOT spring-cloud-starter spring-cloud-starter From 87c319ae8ed25a619ffe602f58a356f7bdc8af54 Mon Sep 17 00:00:00 2001 From: Ryan Baxter Date: Wed, 31 May 2017 13:36:56 -0400 Subject: [PATCH 4/4] Retry requests on specified status codes. Also makes it easier to provide your own interceptor. Fixes #215. --- .../LoadBalancerAutoConfiguration.java | 11 +++++--- .../RetryLoadBalancerInterceptor.java | 8 ++++-- .../RetryableStatusCodeException.java | 16 +++++++++++ .../RetryLoadBalancerInterceptorTest.java | 27 +++++++++++++++++++ 4 files changed, 57 insertions(+), 5 deletions(-) create mode 100644 spring-cloud-commons/src/main/java/org/springframework/cloud/client/loadbalancer/RetryableStatusCodeException.java diff --git a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/loadbalancer/LoadBalancerAutoConfiguration.java b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/loadbalancer/LoadBalancerAutoConfiguration.java index 3a892aaf..02257ac0 100644 --- a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/loadbalancer/LoadBalancerAutoConfiguration.java +++ b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/loadbalancer/LoadBalancerAutoConfiguration.java @@ -103,7 +103,7 @@ public class LoadBalancerAutoConfiguration { @Configuration @ConditionalOnClass(RetryTemplate.class) - static class RetryAutoConfiguration { + public static class RetryAutoConfiguration { @Bean public RetryTemplate retryTemplate() { RetryTemplate template = new RetryTemplate(); @@ -116,13 +116,18 @@ public class LoadBalancerAutoConfiguration { public LoadBalancedRetryPolicyFactory loadBalancedRetryPolicyFactory() { return new LoadBalancedRetryPolicyFactory.NeverRetryFactory(); } + } + @Configuration + @ConditionalOnClass(RetryTemplate.class) + public static class RetryInterceptorAutoConfiguration { @Bean + @ConditionalOnMissingBean public RetryLoadBalancerInterceptor ribbonInterceptor( LoadBalancerClient loadBalancerClient, LoadBalancerRetryProperties properties, LoadBalancedRetryPolicyFactory lbRetryPolicyFactory, - LoadBalancerRequestFactory requestFactory) { - return new RetryLoadBalancerInterceptor(loadBalancerClient, retryTemplate(), properties, + LoadBalancerRequestFactory requestFactory, RetryTemplate retryTemplate) { + return new RetryLoadBalancerInterceptor(loadBalancerClient, retryTemplate, properties, lbRetryPolicyFactory, requestFactory); } diff --git a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/loadbalancer/RetryLoadBalancerInterceptor.java b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/loadbalancer/RetryLoadBalancerInterceptor.java index 2696dc7f..d632b471 100644 --- a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/loadbalancer/RetryLoadBalancerInterceptor.java +++ b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/loadbalancer/RetryLoadBalancerInterceptor.java @@ -68,7 +68,7 @@ public class RetryLoadBalancerInterceptor implements ClientHttpRequestIntercepto final URI originalUri = request.getURI(); final String serviceName = originalUri.getHost(); Assert.state(serviceName != null, "Request URI does not contain a valid hostname: " + originalUri); - LoadBalancedRetryPolicy retryPolicy = lbRetryPolicyFactory.create(serviceName, + final LoadBalancedRetryPolicy retryPolicy = lbRetryPolicyFactory.create(serviceName, loadBalancer); retryTemplate.setRetryPolicy( !lbProperties.isEnabled() || retryPolicy == null ? new NeverRetryPolicy() @@ -87,9 +87,13 @@ public class RetryLoadBalancerInterceptor implements ClientHttpRequestIntercepto if (serviceInstance == null) { serviceInstance = loadBalancer.choose(serviceName); } - return RetryLoadBalancerInterceptor.this.loadBalancer.execute( + ClientHttpResponse response = RetryLoadBalancerInterceptor.this.loadBalancer.execute( serviceName, serviceInstance, requestFactory.createRequest(request, body, execution)); + if(retryPolicy != null && retryPolicy.retryableStatusCode(response.getRawStatusCode())) { + throw new RetryableStatusCodeException(serviceName, response.getRawStatusCode()); + } + return response; } }); } diff --git a/spring-cloud-commons/src/main/java/org/springframework/cloud/client/loadbalancer/RetryableStatusCodeException.java b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/loadbalancer/RetryableStatusCodeException.java new file mode 100644 index 00000000..d5d4b2db --- /dev/null +++ b/spring-cloud-commons/src/main/java/org/springframework/cloud/client/loadbalancer/RetryableStatusCodeException.java @@ -0,0 +1,16 @@ +package org.springframework.cloud.client.loadbalancer; + +import java.io.IOException; + +/** + * Exception to be thrown when the status code is deemed to be retryable. + * @author Ryan Baxter + */ +public class RetryableStatusCodeException extends IOException { + + private static final String MESSAGE = "Service %s returned a status code of %d"; + + public RetryableStatusCodeException(String serviceId, int statusCode) { + super(String.format(MESSAGE, serviceId, statusCode)); + } +} diff --git a/spring-cloud-commons/src/test/java/org/springframework/cloud/client/loadbalancer/RetryLoadBalancerInterceptorTest.java b/spring-cloud-commons/src/test/java/org/springframework/cloud/client/loadbalancer/RetryLoadBalancerInterceptorTest.java index 351fa65a..aaeaa768 100644 --- a/spring-cloud-commons/src/test/java/org/springframework/cloud/client/loadbalancer/RetryLoadBalancerInterceptorTest.java +++ b/spring-cloud-commons/src/test/java/org/springframework/cloud/client/loadbalancer/RetryLoadBalancerInterceptorTest.java @@ -132,6 +132,33 @@ public class RetryLoadBalancerInterceptorTest { verify(lbRequestFactory).createRequest(request, body, execution); } + @Test + public void interceptRetryOnStatusCode() throws Throwable { + HttpRequest request = mock(HttpRequest.class); + when(request.getURI()).thenReturn(new URI("http://foo")); + ClientHttpResponse clientHttpResponseNotFound = new MockClientHttpResponse(new byte[]{}, HttpStatus.NOT_FOUND); + ClientHttpResponse clientHttpResponseOk = new MockClientHttpResponse(new byte[]{}, HttpStatus.OK); + LoadBalancedRetryPolicy policy = mock(LoadBalancedRetryPolicy.class); + when(policy.retryableStatusCode(eq(HttpStatus.NOT_FOUND.value()))).thenReturn(true); + when(policy.canRetryNextServer(any(LoadBalancedRetryContext.class))).thenReturn(true); + InterceptorRetryPolicy interceptorRetryPolicy = new InterceptorRetryPolicy(request, policy, client,"foo"); + LoadBalancedRetryPolicyFactory lbRetryPolicyFactory = mock(LoadBalancedRetryPolicyFactory.class); + when(lbRetryPolicyFactory.create(eq("foo"), any(ServiceInstanceChooser.class))).thenReturn(policy); + ServiceInstance serviceInstance = mock(ServiceInstance.class); + when(client.choose(eq("foo"))).thenReturn(serviceInstance); + when(client.execute(eq("foo"), eq(serviceInstance), any(LoadBalancerRequest.class))). + thenReturn(clientHttpResponseNotFound).thenReturn(clientHttpResponseOk); + lbProperties.setEnabled(true); + RetryLoadBalancerInterceptor interceptor = new RetryLoadBalancerInterceptor(client, retryTemplate, lbProperties, lbRetryPolicyFactory, lbRequestFactory); + byte[] body = new byte[]{}; + ClientHttpRequestExecution execution = mock(ClientHttpRequestExecution.class); + ClientHttpResponse rsp = interceptor.intercept(request, body, execution); + verify(client, times(2)).execute(eq("foo"), eq(serviceInstance), any(LoadBalancerRequest.class)); + assertThat(rsp, is(clientHttpResponseOk)); + verify(retryTemplate, times(1)).setRetryPolicy(eq(interceptorRetryPolicy)); + verify(lbRequestFactory, times(2)).createRequest(request, body, execution); + } + @Test public void interceptRetry() throws Throwable { HttpRequest request = mock(HttpRequest.class);