Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
S
spring-cloud-netflix
Project
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
openSource
spring-cloud-netflix
Commits
bdc5b915
Commit
bdc5b915
authored
Mar 31, 2016
by
Spencer Gibb
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #933 from tkvangorder/master
* pull933: Adding the ability to specify a custom retry handler in the ribbon client configuration.
parents
1cf7ac92
983221a7
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
132 additions
and
3 deletions
+132
-3
RibbonClientConfiguration.java
...ework/cloud/netflix/ribbon/RibbonClientConfiguration.java
+14
-3
RibbonClientPreprocessorOverridesRetryTests.java
...x/ribbon/RibbonClientPreprocessorOverridesRetryTests.java
+118
-0
No files found.
spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClientConfiguration.java
View file @
bdc5b915
...
...
@@ -28,6 +28,8 @@ import org.springframework.context.annotation.Configuration;
import
org.springframework.context.annotation.Lazy
;
import
org.springframework.web.util.UriComponentsBuilder
;
import
com.netflix.client.DefaultLoadBalancerRetryHandler
;
import
com.netflix.client.RetryHandler
;
import
com.netflix.client.config.DefaultClientConfigImpl
;
import
com.netflix.client.config.IClientConfig
;
import
com.netflix.loadbalancer.ConfigurationBasedServerList
;
...
...
@@ -98,15 +100,18 @@ public class RibbonClientConfiguration {
*
* @param config the configuration to use by the underlying Ribbon instance
* @param loadBalancer the load balancer to use by the underlying Ribbon instance
* @param serverIntrospector server introspector to use by the underlying Ribbon instance
* @param retryHandler retry handler to use by the underlying Ribbon instance
* @return a {@link RestClient} instances backed by Ribbon
*/
@Bean
@Lazy
@ConditionalOnMissingBean
public
RestClient
ribbonRestClient
(
IClientConfig
config
,
ILoadBalancer
loadBalancer
,
ServerIntrospector
serverIntrospector
)
{
ServerIntrospector
serverIntrospector
,
RetryHandler
retryHandler
)
{
RestClient
client
=
new
OverrideRestClient
(
config
,
serverIntrospector
);
client
.
setLoadBalancer
(
loadBalancer
);
client
.
setRetryHandler
(
retryHandler
);
Monitors
.
registerObject
(
"Client_"
+
this
.
name
,
client
);
return
client
;
}
...
...
@@ -134,12 +139,18 @@ public class RibbonClientConfiguration {
@Bean
@ConditionalOnMissingBean
public
RibbonLoadBalancerContext
ribbonLoadBalancerContext
(
ILoadBalancer
loadBalancer
,
IClientConfig
config
)
{
return
new
RibbonLoadBalancerContext
(
loadBalancer
,
config
);
ILoadBalancer
loadBalancer
,
IClientConfig
config
,
RetryHandler
retryHandler
)
{
return
new
RibbonLoadBalancerContext
(
loadBalancer
,
config
,
retryHandler
);
}
@Bean
@ConditionalOnMissingBean
public
RetryHandler
retryHandler
(
IClientConfig
config
)
{
return
new
DefaultLoadBalancerRetryHandler
(
config
);
}
@Bean
@ConditionalOnMissingBean
public
ServerIntrospector
serverIntrospector
()
{
return
new
DefaultServerIntrospector
();
}
...
...
spring-cloud-netflix-core/src/test/java/org/springframework/cloud/netflix/ribbon/RibbonClientPreprocessorOverridesRetryTests.java
0 → 100644
View file @
bdc5b915
/*
* Copyright 2013-2016 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package
org
.
springframework
.
cloud
.
netflix
.
ribbon
;
import
java.net.ConnectException
;
import
java.net.SocketException
;
import
java.net.SocketTimeoutException
;
import
java.net.UnknownHostException
;
import
java.util.ArrayList
;
import
java.util.Arrays
;
import
java.util.List
;
import
org.junit.Test
;
import
org.junit.runner.RunWith
;
import
org.springframework.beans.factory.annotation.Autowired
;
import
org.springframework.boot.autoconfigure.PropertyPlaceholderAutoConfiguration
;
import
org.springframework.boot.test.SpringApplicationConfiguration
;
import
org.springframework.cloud.netflix.archaius.ArchaiusAutoConfiguration
;
import
org.springframework.context.annotation.Bean
;
import
org.springframework.context.annotation.Configuration
;
import
org.springframework.context.annotation.Import
;
import
org.springframework.test.annotation.DirtiesContext
;
import
org.springframework.test.context.TestPropertySource
;
import
org.springframework.test.context.junit4.SpringJUnit4ClassRunner
;
import
org.springframework.util.Assert
;
import
com.netflix.client.DefaultLoadBalancerRetryHandler
;
import
com.netflix.client.RetryHandler
;
import
com.netflix.client.config.IClientConfig
;
/**
* @author Tyler Van Gorder
*/
@RunWith
(
SpringJUnit4ClassRunner
.
class
)
@SpringApplicationConfiguration
(
classes
=
RibbonClientPreprocessorOverridesRetryTests
.
TestConfiguration
.
class
)
@TestPropertySource
(
properties
=
{
"customRetry.ribbon.MaxAutoRetries=0"
,
"customRetry.ribbon.MaxAutoRetriesNextServer=1"
,
"customRetry.ribbon.OkToRetryOnAllOperations=true"
})
@DirtiesContext
public
class
RibbonClientPreprocessorOverridesRetryTests
{
@Autowired
private
SpringClientFactory
factory
;
@Test
public
void
customRetryIsConfigured
()
throws
Exception
{
RibbonLoadBalancerContext
context
=
(
RibbonLoadBalancerContext
)
this
.
factory
.
getLoadBalancerContext
(
"customRetry"
);
Assert
.
isInstanceOf
(
RetryRibbonConfiguration
.
CustomRetryHandler
.
class
,
context
.
getRetryHandler
());
Assert
.
isTrue
(
context
.
getRetryHandler
().
getMaxRetriesOnSameServer
()
==
0
);
Assert
.
isTrue
(
context
.
getRetryHandler
().
getMaxRetriesOnNextServer
()
==
1
);
Assert
.
isTrue
(
context
.
getRetryHandler
().
isCircuitTrippingException
(
new
UnknownHostException
(
"Unknown Host"
)));
}
@Configuration
@RibbonClient
(
name
=
"customRetry"
,
configuration
=
RetryRibbonConfiguration
.
class
)
@Import
({
PropertyPlaceholderAutoConfiguration
.
class
,
ArchaiusAutoConfiguration
.
class
,
RibbonAutoConfiguration
.
class
})
protected
static
class
TestConfiguration
{
}
}
@Configuration
class
RetryRibbonConfiguration
{
@Bean
public
RetryHandler
retryHandler
(
IClientConfig
config
)
{
return
new
CustomRetryHandler
(
config
);
}
class
CustomRetryHandler
extends
DefaultLoadBalancerRetryHandler
{
@SuppressWarnings
(
"unchecked"
)
private
List
<
Class
<?
extends
Throwable
>>
retriable
=
new
ArrayList
(){{
add
(
UnknownHostException
.
class
);
add
(
ConnectException
.
class
);
add
(
SocketTimeoutException
.
class
);
}};
@SuppressWarnings
(
"unchecked"
)
private
List
<
Class
<?
extends
Throwable
>>
circuitRelated
=
new
ArrayList
(){{
add
(
UnknownHostException
.
class
);
add
(
SocketException
.
class
);
add
(
SocketTimeoutException
.
class
);
}};
CustomRetryHandler
(
IClientConfig
config
)
{
super
(
config
);
}
@Override
protected
List
<
Class
<?
extends
Throwable
>>
getRetriableExceptions
()
{
return
retriable
;
}
@Override
protected
List
<
Class
<?
extends
Throwable
>>
getCircuitRelatedExceptions
()
{
return
circuitRelated
;
}
}
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment