From 0d468b3930ddcd350834688ef79cb75277a3e966 Mon Sep 17 00:00:00 2001 From: Spencer Gibb Date: Mon, 8 Jun 2015 14:55:22 -0600 Subject: [PATCH] attempt ordering of RibbonClients.defaultConfiguration's ref gh-383 --- .../RibbonClientConfigurationRegistrar.java | 9 +++++---- .../ribbon/RibbonClientSpecification.java | 6 ++++++ .../cloud/netflix/ribbon/RibbonClients.java | 1 + .../netflix/ribbon/SpringClientFactory.java | 18 ++++++++++++++++-- 4 files changed, 28 insertions(+), 6 deletions(-) diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClientConfigurationRegistrar.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClientConfigurationRegistrar.java index bb481a77..5bf2f5a7 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClientConfigurationRegistrar.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClientConfigurationRegistrar.java @@ -39,7 +39,7 @@ public class RibbonClientConfigurationRegistrar implements ImportBeanDefinitionR AnnotationAttributes[] clients = (AnnotationAttributes[]) attrs.get("value"); for (AnnotationAttributes client : clients) { registerClientConfiguration(registry, getClientName(client), - client.get("configuration")); + client.get("configuration"), 0); } } if (attrs != null && attrs.containsKey("defaultConfiguration")) { @@ -50,13 +50,13 @@ public class RibbonClientConfigurationRegistrar implements ImportBeanDefinitionR name = "default." + metadata.getClassName(); } registerClientConfiguration(registry, name, - attrs.get("defaultConfiguration")); + attrs.get("defaultConfiguration"), attrs.get("defaultConfigurationOrder")); } Map client = metadata.getAnnotationAttributes( RibbonClient.class.getName(), true); String name = getClientName(client); if (name != null) { - registerClientConfiguration(registry, name, client.get("configuration")); + registerClientConfiguration(registry, name, client.get("configuration"), 0); } } @@ -76,11 +76,12 @@ public class RibbonClientConfigurationRegistrar implements ImportBeanDefinitionR } private void registerClientConfiguration(BeanDefinitionRegistry registry, - Object name, Object configuration) { + Object name, Object configuration, Object order) { BeanDefinitionBuilder builder = BeanDefinitionBuilder .genericBeanDefinition(RibbonClientSpecification.class); builder.addConstructorArgValue(name); builder.addConstructorArgValue(configuration); + builder.addConstructorArgValue(order); registry.registerBeanDefinition(name + ".RibbonClientSpecification", builder.getBeanDefinition()); } diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClientSpecification.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClientSpecification.java index 7c492a5c..395fbaba 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClientSpecification.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClientSpecification.java @@ -30,4 +30,10 @@ public class RibbonClientSpecification { private Class[] configuration; + private int order; + + public Integer order() { + return order; + } + } diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClients.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClients.java index f623eab0..f4a8d8bd 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClients.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/RibbonClients.java @@ -42,4 +42,5 @@ public @interface RibbonClients { Class[] defaultConfiguration() default {}; + int defaultConfigurationOrder() default 0; } diff --git a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/SpringClientFactory.java b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/SpringClientFactory.java index 1c1b5f8a..0b229735 100644 --- a/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/SpringClientFactory.java +++ b/spring-cloud-netflix-core/src/main/java/org/springframework/cloud/netflix/ribbon/SpringClientFactory.java @@ -16,11 +16,14 @@ package org.springframework.cloud.netflix.ribbon; +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; +import java.util.Comparator; import java.util.List; import java.util.Map; import java.util.Map.Entry; +import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import org.springframework.beans.BeanUtils; @@ -125,8 +128,19 @@ public class SpringClientFactory implements DisposableBean, ApplicationContextAw context.register(configuration); } } - for (Entry entry : this.configurations - .entrySet()) { + + List> entries = new ArrayList<>(this.configurations + .entrySet()); + + Collections.sort(entries, new Comparator>() { + @Override + public int compare(Entry o1, Entry o2) { + return o1.getValue().order().compareTo(o2.getValue().order()); + } + }); + + + for (Entry entry : entries) { if (entry.getKey().startsWith("default.")) { for (Class configuration : entry.getValue().getConfiguration()) { context.register(configuration);