Skip to content

Commit 8660abd

Browse files
author
Ryan Baxter
authored
Merge pull request spring-projects#225 from ryanjbaxter/static-retry-template
Create a new RetryTemplate for each request
2 parents 40930de + 5d5a5ed commit 8660abd

File tree

3 files changed

+26
-21
lines changed

3 files changed

+26
-21
lines changed

spring-cloud-commons/src/main/java/org/springframework/cloud/client/loadbalancer/LoadBalancerAutoConfiguration.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,8 @@ public static class RetryInterceptorAutoConfiguration {
126126
public RetryLoadBalancerInterceptor ribbonInterceptor(
127127
LoadBalancerClient loadBalancerClient, LoadBalancerRetryProperties properties,
128128
LoadBalancedRetryPolicyFactory lbRetryPolicyFactory,
129-
LoadBalancerRequestFactory requestFactory, RetryTemplate retryTemplate) {
130-
return new RetryLoadBalancerInterceptor(loadBalancerClient, retryTemplate, properties,
129+
LoadBalancerRequestFactory requestFactory) {
130+
return new RetryLoadBalancerInterceptor(loadBalancerClient, properties,
131131
lbRetryPolicyFactory, requestFactory);
132132
}
133133

spring-cloud-commons/src/main/java/org/springframework/cloud/client/loadbalancer/RetryLoadBalancerInterceptor.java

+17-4
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public class RetryLoadBalancerInterceptor implements ClientHttpRequestIntercepto
4242
private LoadBalancerRetryProperties lbProperties;
4343
private LoadBalancerRequestFactory requestFactory;
4444

45-
45+
@Deprecated
4646
public RetryLoadBalancerInterceptor(LoadBalancerClient loadBalancer, RetryTemplate retryTemplate,
4747
LoadBalancerRetryProperties lbProperties,
4848
LoadBalancedRetryPolicyFactory lbRetryPolicyFactory,
@@ -53,7 +53,18 @@ public RetryLoadBalancerInterceptor(LoadBalancerClient loadBalancer, RetryTempla
5353
this.lbProperties = lbProperties;
5454
this.requestFactory = requestFactory;
5555
}
56-
56+
57+
public RetryLoadBalancerInterceptor(LoadBalancerClient loadBalancer,
58+
LoadBalancerRetryProperties lbProperties,
59+
LoadBalancedRetryPolicyFactory lbRetryPolicyFactory,
60+
LoadBalancerRequestFactory requestFactory) {
61+
this.loadBalancer = loadBalancer;
62+
this.lbRetryPolicyFactory = lbRetryPolicyFactory;
63+
this.lbProperties = lbProperties;
64+
this.requestFactory = requestFactory;
65+
}
66+
67+
@Deprecated
5768
public RetryLoadBalancerInterceptor(LoadBalancerClient loadBalancer, RetryTemplate retryTemplate,
5869
LoadBalancerRetryProperties lbProperties,
5970
LoadBalancedRetryPolicyFactory lbRetryPolicyFactory) {
@@ -70,11 +81,13 @@ public ClientHttpResponse intercept(final HttpRequest request, final byte[] body
7081
Assert.state(serviceName != null, "Request URI does not contain a valid hostname: " + originalUri);
7182
final LoadBalancedRetryPolicy retryPolicy = lbRetryPolicyFactory.create(serviceName,
7283
loadBalancer);
73-
retryTemplate.setRetryPolicy(
84+
RetryTemplate template = this.retryTemplate == null ? new RetryTemplate() : this.retryTemplate;
85+
template.setThrowLastExceptionOnExhausted(true);
86+
template.setRetryPolicy(
7487
!lbProperties.isEnabled() || retryPolicy == null ? new NeverRetryPolicy()
7588
: new InterceptorRetryPolicy(request, retryPolicy, loadBalancer,
7689
serviceName));
77-
return retryTemplate
90+
return template
7891
.execute(new RetryCallback<ClientHttpResponse, IOException>() {
7992
@Override
8093
public ClientHttpResponse doWithRetry(RetryContext context)

spring-cloud-commons/src/test/java/org/springframework/cloud/client/loadbalancer/RetryLoadBalancerInterceptorTest.java

+7-15
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,12 @@
3333
public class RetryLoadBalancerInterceptorTest {
3434

3535
private LoadBalancerClient client;
36-
private RetryTemplate retryTemplate;
3736
private LoadBalancerRetryProperties lbProperties;
3837
private LoadBalancerRequestFactory lbRequestFactory;
3938

4039
@Before
4140
public void setUp() throws Exception {
4241
client = mock(LoadBalancerClient.class);
43-
retryTemplate = spy(new RetryTemplate());
4442
lbProperties = new LoadBalancerRetryProperties();
4543
lbRequestFactory = mock(LoadBalancerRequestFactory.class);
4644

@@ -49,7 +47,6 @@ public void setUp() throws Exception {
4947
@After
5048
public void tearDown() throws Exception {
5149
client = null;
52-
retryTemplate = null;
5350
lbProperties = null;
5451
}
5552

@@ -64,11 +61,10 @@ public void interceptDisableRetry() throws Throwable {
6461
when(client.choose(eq("foo"))).thenReturn(serviceInstance);
6562
when(client.execute(eq("foo"), eq(serviceInstance), any(LoadBalancerRequest.class))).thenThrow(new IOException());
6663
lbProperties.setEnabled(false);
67-
RetryLoadBalancerInterceptor interceptor = new RetryLoadBalancerInterceptor(client, retryTemplate, lbProperties, lbRetryPolicyFactory, lbRequestFactory);
64+
RetryLoadBalancerInterceptor interceptor = new RetryLoadBalancerInterceptor(client, lbProperties, lbRetryPolicyFactory, lbRequestFactory);
6865
byte[] body = new byte[]{};
6966
ClientHttpRequestExecution execution = mock(ClientHttpRequestExecution.class);
7067
interceptor.intercept(request, body, execution);
71-
verify(retryTemplate, times(1)).setRetryPolicy(any(NeverRetryPolicy.class));
7268
verify(lbRequestFactory).createRequest(request, body, execution);
7369
}
7470

@@ -85,7 +81,7 @@ public void interceptInvalidHost() throws Throwable {
8581
when(client.choose(eq("foo_underscore"))).thenReturn(serviceInstance);
8682
when(client.execute(eq("foo_underscore"), eq(serviceInstance), any(LoadBalancerRequest.class))).thenReturn(clientHttpResponse);
8783
lbProperties.setEnabled(true);
88-
RetryLoadBalancerInterceptor interceptor = new RetryLoadBalancerInterceptor(client, retryTemplate, lbProperties, lbRetryPolicyFactory);
84+
RetryLoadBalancerInterceptor interceptor = new RetryLoadBalancerInterceptor(client, lbProperties, lbRetryPolicyFactory, lbRequestFactory);
8985
byte[] body = new byte[]{};
9086
ClientHttpRequestExecution execution = mock(ClientHttpRequestExecution.class);
9187
ClientHttpResponse rsp = interceptor.intercept(request, body, execution);
@@ -102,11 +98,10 @@ public void interceptNeverRetry() throws Throwable {
10298
when(client.choose(eq("foo"))).thenReturn(serviceInstance);
10399
when(client.execute(eq("foo"), eq(serviceInstance), any(LoadBalancerRequest.class))).thenReturn(clientHttpResponse);
104100
lbProperties.setEnabled(true);
105-
RetryLoadBalancerInterceptor interceptor = new RetryLoadBalancerInterceptor(client, retryTemplate, lbProperties, lbRetryPolicyFactory, lbRequestFactory);
101+
RetryLoadBalancerInterceptor interceptor = new RetryLoadBalancerInterceptor(client, lbProperties, lbRetryPolicyFactory, lbRequestFactory);
106102
byte[] body = new byte[]{};
107103
ClientHttpRequestExecution execution = mock(ClientHttpRequestExecution.class);
108104
interceptor.intercept(request, body, execution);
109-
verify(retryTemplate, times(1)).setRetryPolicy(any(NeverRetryPolicy.class));
110105
verify(lbRequestFactory).createRequest(request, body, execution);
111106
}
112107

@@ -123,12 +118,11 @@ public void interceptSuccess() throws Throwable {
123118
when(client.choose(eq("foo"))).thenReturn(serviceInstance);
124119
when(client.execute(eq("foo"), eq(serviceInstance), any(LoadBalancerRequest.class))).thenReturn(clientHttpResponse);
125120
lbProperties.setEnabled(true);
126-
RetryLoadBalancerInterceptor interceptor = new RetryLoadBalancerInterceptor(client, retryTemplate, lbProperties, lbRetryPolicyFactory, lbRequestFactory);
121+
RetryLoadBalancerInterceptor interceptor = new RetryLoadBalancerInterceptor(client, lbProperties, lbRetryPolicyFactory, lbRequestFactory);
127122
byte[] body = new byte[]{};
128123
ClientHttpRequestExecution execution = mock(ClientHttpRequestExecution.class);
129124
ClientHttpResponse rsp = interceptor.intercept(request, body, execution);
130125
assertThat(rsp, is(clientHttpResponse));
131-
verify(retryTemplate, times(1)).setRetryPolicy(eq(interceptorRetryPolicy));
132126
verify(lbRequestFactory).createRequest(request, body, execution);
133127
}
134128

@@ -149,13 +143,12 @@ public void interceptRetryOnStatusCode() throws Throwable {
149143
when(client.execute(eq("foo"), eq(serviceInstance), any(LoadBalancerRequest.class))).
150144
thenReturn(clientHttpResponseNotFound).thenReturn(clientHttpResponseOk);
151145
lbProperties.setEnabled(true);
152-
RetryLoadBalancerInterceptor interceptor = new RetryLoadBalancerInterceptor(client, retryTemplate, lbProperties, lbRetryPolicyFactory, lbRequestFactory);
146+
RetryLoadBalancerInterceptor interceptor = new RetryLoadBalancerInterceptor(client, lbProperties, lbRetryPolicyFactory, lbRequestFactory);
153147
byte[] body = new byte[]{};
154148
ClientHttpRequestExecution execution = mock(ClientHttpRequestExecution.class);
155149
ClientHttpResponse rsp = interceptor.intercept(request, body, execution);
156150
verify(client, times(2)).execute(eq("foo"), eq(serviceInstance), any(LoadBalancerRequest.class));
157151
assertThat(rsp, is(clientHttpResponseOk));
158-
verify(retryTemplate, times(1)).setRetryPolicy(eq(interceptorRetryPolicy));
159152
verify(lbRequestFactory, times(2)).createRequest(request, body, execution);
160153
}
161154

@@ -172,13 +165,12 @@ public void interceptRetry() throws Throwable {
172165
when(client.choose(eq("foo"))).thenReturn(serviceInstance);
173166
when(client.execute(eq("foo"), eq(serviceInstance), any(LoadBalancerRequest.class))).thenThrow(new IOException()).thenReturn(clientHttpResponse);
174167
lbProperties.setEnabled(true);
175-
RetryLoadBalancerInterceptor interceptor = new RetryLoadBalancerInterceptor(client, retryTemplate, lbProperties, lbRetryPolicyFactory, lbRequestFactory);
168+
RetryLoadBalancerInterceptor interceptor = new RetryLoadBalancerInterceptor(client, lbProperties, lbRetryPolicyFactory, lbRequestFactory);
176169
byte[] body = new byte[]{};
177170
ClientHttpRequestExecution execution = mock(ClientHttpRequestExecution.class);
178171
ClientHttpResponse rsp = interceptor.intercept(request, body, execution);
179172
verify(client, times(2)).execute(eq("foo"), eq(serviceInstance), any(LoadBalancerRequest.class));
180173
assertThat(rsp, is(clientHttpResponse));
181-
verify(retryTemplate, times(1)).setRetryPolicy(any(InterceptorRetryPolicy.class));
182174
verify(lbRequestFactory, times(2)).createRequest(request, body, execution);
183175
}
184176

@@ -196,7 +188,7 @@ public void interceptFailedRetry() throws Exception {
196188
when(client.choose(eq("foo"))).thenReturn(serviceInstance);
197189
when(client.execute(eq("foo"), eq(serviceInstance), any(LoadBalancerRequest.class))).thenThrow(new IOException()).thenReturn(clientHttpResponse);
198190
lbProperties.setEnabled(true);
199-
RetryLoadBalancerInterceptor interceptor = new RetryLoadBalancerInterceptor(client, retryTemplate, lbProperties, lbRetryPolicyFactory, lbRequestFactory);
191+
RetryLoadBalancerInterceptor interceptor = new RetryLoadBalancerInterceptor(client, lbProperties, lbRetryPolicyFactory, lbRequestFactory);
200192
byte[] body = new byte[]{};
201193
ClientHttpRequestExecution execution = mock(ClientHttpRequestExecution.class);
202194
ClientHttpResponse rsp = interceptor.intercept(request, body, execution);

0 commit comments

Comments
 (0)