You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by lb...@apache.org on 2017/03/14 20:19:12 UTC
[3/4] camel git commit: CAMEL-10992: Hystrix - Allow to configure
global configuration
http://git-wip-us.apache.org/repos/asf/camel/blob/b4d0038a/components/camel-hystrix/src/main/java/org/apache/camel/component/hystrix/processor/HystrixProcessorFactory.java
----------------------------------------------------------------------
diff --git a/components/camel-hystrix/src/main/java/org/apache/camel/component/hystrix/processor/HystrixProcessorFactory.java b/components/camel-hystrix/src/main/java/org/apache/camel/component/hystrix/processor/HystrixProcessorFactory.java
index a996d56..909f6da 100644
--- a/components/camel-hystrix/src/main/java/org/apache/camel/component/hystrix/processor/HystrixProcessorFactory.java
+++ b/components/camel-hystrix/src/main/java/org/apache/camel/component/hystrix/processor/HystrixProcessorFactory.java
@@ -16,126 +16,103 @@
*/
package org.apache.camel.component.hystrix.processor;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+
import com.netflix.hystrix.HystrixCommand;
import com.netflix.hystrix.HystrixCommandGroupKey;
import com.netflix.hystrix.HystrixCommandKey;
import com.netflix.hystrix.HystrixCommandProperties;
import com.netflix.hystrix.HystrixThreadPoolKey;
import com.netflix.hystrix.HystrixThreadPoolProperties;
+import org.apache.camel.CamelContext;
import org.apache.camel.Processor;
+import org.apache.camel.impl.TypedProcessorFactory;
import org.apache.camel.model.HystrixConfigurationDefinition;
import org.apache.camel.model.HystrixDefinition;
-import org.apache.camel.model.ProcessorDefinition;
-import org.apache.camel.spi.ProcessorFactory;
import org.apache.camel.spi.RouteContext;
-import org.apache.camel.util.CamelContextHelper;
+import org.apache.camel.util.IntrospectionSupport;
+import org.apache.camel.util.function.Suppliers;
+
+import static org.apache.camel.util.CamelContextHelper.lookup;
+import static org.apache.camel.util.CamelContextHelper.mandatoryLookup;
/**
* To integrate camel-hystrix with the Camel routes using the Hystrix EIP.
*/
-public class HystrixProcessorFactory implements ProcessorFactory {
-
- @Override
- public Processor createChildProcessor(RouteContext routeContext, ProcessorDefinition<?> definition, boolean mandatory) throws Exception {
- // not in use
- return null;
+public class HystrixProcessorFactory extends TypedProcessorFactory<HystrixDefinition> {
+ public HystrixProcessorFactory() {
+ super(HystrixDefinition.class);
}
@Override
- public Processor createProcessor(RouteContext routeContext, ProcessorDefinition<?> definition) throws Exception {
- if (definition instanceof HystrixDefinition) {
- HystrixDefinition cb = (HystrixDefinition) definition;
-
- // create the regular and fallback processors
- Processor processor = cb.createChildProcessor(routeContext, true);
- Processor fallback = null;
- if (cb.getOnFallback() != null) {
- fallback = cb.getOnFallback().createProcessor(routeContext);
- }
-
- HystrixConfigurationDefinition config = cb.getHystrixConfiguration();
- HystrixConfigurationDefinition configRef = null;
- if (cb.getHystrixConfigurationRef() != null) {
- configRef = CamelContextHelper.mandatoryLookup(routeContext.getCamelContext(), cb.getHystrixConfigurationRef(), HystrixConfigurationDefinition.class);
- }
-
- String id = cb.idOrCreate(routeContext.getCamelContext().getNodeIdFactory());
-
- // group and thread pool keys to use they can be configured on configRef and config, so look there first, and if none then use default
- String groupKey = null;
- String threadPoolKey = null;
- if (configRef != null) {
- groupKey = configRef.getGroupKey();
- threadPoolKey = configRef.getThreadPoolKey();
- }
- if (config != null && config.getGroupKey() != null) {
- groupKey = config.getGroupKey();
- threadPoolKey = config.getThreadPoolKey();
- }
- if (groupKey == null) {
- groupKey = HystrixConfigurationDefinition.DEFAULT_GROUP_KEY;
- }
- if (threadPoolKey == null) {
- // by default use the thread pool from the group
- threadPoolKey = groupKey;
- }
-
- // use the node id as the command key
- HystrixCommandKey hcCommandKey = HystrixCommandKey.Factory.asKey(id);
- HystrixCommandKey hcFallbackCommandKey = HystrixCommandKey.Factory.asKey(id + "-fallback");
- // use the configured group key
- HystrixCommandGroupKey hcGroupKey = HystrixCommandGroupKey.Factory.asKey(groupKey);
- HystrixThreadPoolKey tpKey = HystrixThreadPoolKey.Factory.asKey(threadPoolKey);
-
- // create setter using the default options
- HystrixCommand.Setter setter = HystrixCommand.Setter
- .withGroupKey(hcGroupKey)
- .andCommandKey(hcCommandKey)
- .andThreadPoolKey(tpKey);
- HystrixCommandProperties.Setter commandSetter = HystrixCommandProperties.Setter();
- setter.andCommandPropertiesDefaults(commandSetter);
- HystrixThreadPoolProperties.Setter threadPoolSetter = HystrixThreadPoolProperties.Setter();
- setter.andThreadPoolPropertiesDefaults(threadPoolSetter);
+ public Processor doCreateProcessor(RouteContext routeContext, HystrixDefinition definition) throws Exception {
+ // create the regular and fallback processors
+ Processor processor = definition.createChildProcessor(routeContext, true);
+ Processor fallback = null;
+ if (definition.getOnFallback() != null) {
+ fallback = definition.getOnFallback().createProcessor(routeContext);
+ }
+
+ final HystrixConfigurationDefinition config = buildHystrixConfiguration(routeContext.getCamelContext(), definition);
+ final String id = definition.idOrCreate(routeContext.getCamelContext().getNodeIdFactory());
+
+ // group and thread pool keys to use they can be configured on configRef and config, so look there first, and if none then use default
+ String groupKey = config.getGroupKey();
+ String threadPoolKey = config.getThreadPoolKey();
+
+ if (groupKey == null) {
+ groupKey = HystrixConfigurationDefinition.DEFAULT_GROUP_KEY;
+ }
+ if (threadPoolKey == null) {
+ // by default use the thread pool from the group
+ threadPoolKey = groupKey;
+ }
+
+ // use the node id as the command key
+ HystrixCommandKey hcCommandKey = HystrixCommandKey.Factory.asKey(id);
+ HystrixCommandKey hcFallbackCommandKey = HystrixCommandKey.Factory.asKey(id + "-fallback");
+
+ // use the configured group key
+ HystrixCommandGroupKey hcGroupKey = HystrixCommandGroupKey.Factory.asKey(groupKey);
+ HystrixThreadPoolKey tpKey = HystrixThreadPoolKey.Factory.asKey(threadPoolKey);
+
+ // create setter using the default options
+ HystrixCommand.Setter setter = HystrixCommand.Setter.withGroupKey(hcGroupKey)
+ .andCommandKey(hcCommandKey)
+ .andThreadPoolKey(tpKey);
+
+ HystrixCommandProperties.Setter commandSetter = HystrixCommandProperties.Setter();
+ setter.andCommandPropertiesDefaults(commandSetter);
+
+ HystrixThreadPoolProperties.Setter threadPoolSetter = HystrixThreadPoolProperties.Setter();
+ setter.andThreadPoolPropertiesDefaults(threadPoolSetter);
+
+ configureHystrix(commandSetter, threadPoolSetter, config);
+
+ // create setter for fallback via network
+ HystrixCommand.Setter fallbackSetter = null;
+ boolean fallbackViaNetwork = definition.getOnFallback() != null && definition.getOnFallback().isFallbackViaNetwork();
+ if (fallbackViaNetwork) {
+ // use a different thread pool that is for fallback (should never use the same thread pool as the regular command)
+ HystrixThreadPoolKey tpFallbackKey = HystrixThreadPoolKey.Factory.asKey(threadPoolKey + "-fallback");
+
+ fallbackSetter = HystrixCommand.Setter.withGroupKey(hcGroupKey)
+ .andCommandKey(hcFallbackCommandKey)
+ .andThreadPoolKey(tpFallbackKey);
+
+ HystrixCommandProperties.Setter commandFallbackSetter = HystrixCommandProperties.Setter();
+ fallbackSetter.andCommandPropertiesDefaults(commandFallbackSetter);
+
+ HystrixThreadPoolProperties.Setter fallbackThreadPoolSetter = HystrixThreadPoolProperties.Setter();
+ fallbackSetter.andThreadPoolPropertiesDefaults(fallbackThreadPoolSetter);
// at first configure any shared options
- if (configRef != null) {
- configureHystrix(commandSetter, threadPoolSetter, configRef);
- }
- // then any local configured can override
- if (config != null) {
- configureHystrix(commandSetter, threadPoolSetter, config);
- }
-
- // create setter for fallback via network
- HystrixCommand.Setter fallbackSetter = null;
- boolean fallbackViaNetwork = cb.getOnFallback() != null && cb.getOnFallback().isFallbackViaNetwork();
- if (fallbackViaNetwork) {
- // use a different thread pool that is for fallback (should never use the same thread pool as the regular command)
- HystrixThreadPoolKey tpFallbackKey = HystrixThreadPoolKey.Factory.asKey(threadPoolKey + "-fallback");
-
- fallbackSetter = HystrixCommand.Setter
- .withGroupKey(hcGroupKey)
- .andCommandKey(hcFallbackCommandKey)
- .andThreadPoolKey(tpFallbackKey);
- HystrixCommandProperties.Setter commandFallbackSetter = HystrixCommandProperties.Setter();
- fallbackSetter.andCommandPropertiesDefaults(commandFallbackSetter);
- HystrixThreadPoolProperties.Setter fallbackThreadPoolSetter = HystrixThreadPoolProperties.Setter();
- fallbackSetter.andThreadPoolPropertiesDefaults(fallbackThreadPoolSetter);
-
- // at first configure any shared options
- if (configRef != null) {
- configureHystrix(commandFallbackSetter, fallbackThreadPoolSetter, configRef);
- }
- // then any local configured can override
- if (config != null) {
- configureHystrix(commandFallbackSetter, fallbackThreadPoolSetter, config);
- }
- }
-
- return new HystrixProcessor(hcGroupKey, hcCommandKey, hcFallbackCommandKey, setter, fallbackSetter, processor, fallback, fallbackViaNetwork);
- } else {
- return null;
+ configureHystrix(commandFallbackSetter, fallbackThreadPoolSetter, config);
}
+
+ return new HystrixProcessor(hcGroupKey, hcCommandKey, hcFallbackCommandKey, setter, fallbackSetter, processor, fallback, fallbackViaNetwork);
}
private void configureHystrix(HystrixCommandProperties.Setter command, HystrixThreadPoolProperties.Setter threadPool, HystrixConfigurationDefinition config) {
@@ -228,4 +205,47 @@ public class HystrixProcessorFactory implements ProcessorFactory {
threadPool.withAllowMaximumSizeToDivergeFromCoreSize(config.getAllowMaximumSizeToDivergeFromCoreSize());
}
}
+
+ // *******************************
+ // Helpers
+ // *******************************
+
+ HystrixConfigurationDefinition buildHystrixConfiguration(CamelContext camelContext, HystrixDefinition definition) throws Exception {
+ Map<String, Object> properties = new HashMap<>();
+
+ // Extract properties from default configuration, the one configured on
+ // camel context takes the precedence over those in the registry
+ loadProperties(properties, Suppliers.firstNotNull(
+ () -> camelContext.getHystrixConfiguration(null),
+ () -> lookup(camelContext, HystrixConstants.DEFAULT_HYSTRIX_CONFIGURATION_ID, HystrixConfigurationDefinition.class))
+ );
+
+ // Extract properties from referenced configuration, the one configured
+ // on camel context takes the precedence over those in the registry
+ if (definition.getHystrixConfigurationRef() != null) {
+ final String ref = definition.getHystrixConfigurationRef();
+
+ loadProperties(properties, Suppliers.firstNotNull(
+ () -> camelContext.getHystrixConfiguration(ref),
+ () -> mandatoryLookup(camelContext, ref, HystrixConfigurationDefinition.class))
+ );
+ }
+
+ // Extract properties from local configuration
+ loadProperties(properties, Optional.ofNullable(definition.getHystrixConfiguration()));
+
+ // Extract properties from definition
+ IntrospectionSupport.getProperties(definition, properties, null, false);
+
+ HystrixConfigurationDefinition config = new HystrixConfigurationDefinition();
+
+ // Apply properties to a new configuration
+ IntrospectionSupport.setProperties(camelContext, camelContext.getTypeConverter(), config, properties);
+
+ return config;
+ }
+
+ private void loadProperties(Map<String, Object> properties, Optional<?> optional) {
+ optional.ifPresent(bean -> IntrospectionSupport.getProperties(bean, properties, null, false));
+ }
}
http://git-wip-us.apache.org/repos/asf/camel/blob/b4d0038a/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/processor/HystrixHierarchicalConfigTest.java
----------------------------------------------------------------------
diff --git a/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/processor/HystrixHierarchicalConfigTest.java b/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/processor/HystrixHierarchicalConfigTest.java
new file mode 100644
index 0000000..1b09566
--- /dev/null
+++ b/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/processor/HystrixHierarchicalConfigTest.java
@@ -0,0 +1,134 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.camel.component.hystrix.processor;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.apache.camel.impl.SimpleRegistry;
+import org.apache.camel.model.HystrixConfigurationDefinition;
+import org.apache.camel.model.HystrixDefinition;
+import org.junit.Assert;
+import org.junit.Test;
+
+public class HystrixHierarchicalConfigTest {
+
+ @Test
+ public void testRegistryConfiguration() throws Exception {
+ final SimpleRegistry registry = new SimpleRegistry();
+ final CamelContext context = new DefaultCamelContext(registry);
+
+ HystrixConfigurationDefinition def = new HystrixConfigurationDefinition();
+ def.setGroupKey("global-group-key");
+ def.setThreadPoolKey("global-thread-key");
+ def.setCorePoolSize(10);
+
+ HystrixConfigurationDefinition ref = new HystrixConfigurationDefinition();
+ ref.setGroupKey("ref-group-key");
+ ref.setCorePoolSize(5);
+
+ registry.put(HystrixConstants.DEFAULT_HYSTRIX_CONFIGURATION_ID, def);
+ registry.put("ref-hystrix", ref);
+
+ final HystrixProcessorFactory factory = new HystrixProcessorFactory();
+ final HystrixConfigurationDefinition config = factory.buildHystrixConfiguration(
+ context,
+ new HystrixDefinition()
+ .hystrixConfiguration("ref-hystrix")
+ .hystrixConfiguration()
+ .groupKey("local-conf-group-key")
+ .requestLogEnabled(false)
+ .end()
+ );
+
+ Assert.assertEquals("local-conf-group-key", config.getGroupKey());
+ Assert.assertEquals("global-thread-key", config.getThreadPoolKey());
+ Assert.assertEquals(new Integer(5), config.getCorePoolSize());
+ }
+
+ @Test
+ public void testContextConfiguration() throws Exception {
+ final CamelContext context = new DefaultCamelContext();
+
+ HystrixConfigurationDefinition def = new HystrixConfigurationDefinition();
+ def.setGroupKey("global-group-key");
+ def.setThreadPoolKey("global-thread-key");
+ def.setCorePoolSize(10);
+
+ HystrixConfigurationDefinition ref = new HystrixConfigurationDefinition();
+ ref.setGroupKey("ref-group-key");
+ ref.setCorePoolSize(5);
+
+ context.setHystrixConfiguration(def);
+ context.addHystrixConfiguration("ref-hystrix", ref);
+
+ final HystrixProcessorFactory factory = new HystrixProcessorFactory();
+ final HystrixConfigurationDefinition config = factory.buildHystrixConfiguration(
+ context,
+ new HystrixDefinition()
+ .hystrixConfiguration("ref-hystrix")
+ .hystrixConfiguration()
+ .groupKey("local-conf-group-key")
+ .requestLogEnabled(false)
+ .end()
+ );
+
+ Assert.assertEquals("local-conf-group-key", config.getGroupKey());
+ Assert.assertEquals("global-thread-key", config.getThreadPoolKey());
+ Assert.assertEquals(new Integer(5), config.getCorePoolSize());
+ }
+
+ @Test
+ public void testMixedConfiguration() throws Exception {
+ final SimpleRegistry registry = new SimpleRegistry();
+ final CamelContext context = new DefaultCamelContext(registry);
+
+ HystrixConfigurationDefinition def = new HystrixConfigurationDefinition();
+ def.setGroupKey("global-group-key");
+ def.setThreadPoolKey("global-thread-key");
+ def.setCorePoolSize(10);
+
+ HystrixConfigurationDefinition ref = new HystrixConfigurationDefinition();
+ ref.setGroupKey("ref-group-key");
+ ref.setCorePoolSize(5);
+
+ // this should be ignored
+ HystrixConfigurationDefinition defReg = new HystrixConfigurationDefinition();
+ defReg.setGroupKey("global-reg-group-key");
+ defReg.setThreadPoolKey("global-reg-thread-key");
+ defReg.setCorePoolSize(20);
+
+ context.setHystrixConfiguration(def);
+
+ registry.put(HystrixConstants.DEFAULT_HYSTRIX_CONFIGURATION_ID, defReg);
+ registry.put("ref-hystrix", ref);
+
+ final HystrixProcessorFactory factory = new HystrixProcessorFactory();
+ final HystrixConfigurationDefinition config = factory.buildHystrixConfiguration(
+ context,
+ new HystrixDefinition()
+ .hystrixConfiguration("ref-hystrix")
+ .hystrixConfiguration()
+ .groupKey("local-conf-group-key")
+ .requestLogEnabled(false)
+ .end()
+ );
+
+ Assert.assertEquals("local-conf-group-key", config.getGroupKey());
+ Assert.assertEquals("global-thread-key", config.getThreadPoolKey());
+ Assert.assertEquals(new Integer(5), config.getCorePoolSize());
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/b4d0038a/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/processor/HystrixRouteConfigTest.java
----------------------------------------------------------------------
diff --git a/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/processor/HystrixRouteConfigTest.java b/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/processor/HystrixRouteConfigTest.java
index b9bfc1c..e1f4ea4 100644
--- a/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/processor/HystrixRouteConfigTest.java
+++ b/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/processor/HystrixRouteConfigTest.java
@@ -61,6 +61,7 @@ public class HystrixRouteConfigTest extends CamelTestSupport {
assertEquals("test2", config.getGroupKey());
assertEquals(99999, config.getMetricsHealthSnapshotIntervalInMilliseconds().intValue());
}
+
@Override
protected RouteBuilder createRouteBuilder() throws Exception {
http://git-wip-us.apache.org/repos/asf/camel/blob/b4d0038a/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/processor/SpringHystrixRouteConfigMaximumSizeTest.java
----------------------------------------------------------------------
diff --git a/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/processor/SpringHystrixRouteConfigMaximumSizeTest.java b/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/processor/SpringHystrixRouteConfigMaximumSizeTest.java
index 0a88b8f..ba69a73 100644
--- a/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/processor/SpringHystrixRouteConfigMaximumSizeTest.java
+++ b/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/processor/SpringHystrixRouteConfigMaximumSizeTest.java
@@ -20,7 +20,9 @@ import org.apache.camel.test.spring.CamelSpringTestSupport;
import org.junit.Test;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
+import org.springframework.test.annotation.DirtiesContext;
+@DirtiesContext
public class SpringHystrixRouteConfigMaximumSizeTest extends CamelSpringTestSupport {
@Override
http://git-wip-us.apache.org/repos/asf/camel/blob/b4d0038a/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/processor/SpringHystrixRouteConfigRefTest.java
----------------------------------------------------------------------
diff --git a/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/processor/SpringHystrixRouteConfigRefTest.java b/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/processor/SpringHystrixRouteConfigRefTest.java
index dcf9dc0..17e620c 100644
--- a/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/processor/SpringHystrixRouteConfigRefTest.java
+++ b/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/processor/SpringHystrixRouteConfigRefTest.java
@@ -20,7 +20,9 @@ import org.apache.camel.test.spring.CamelSpringTestSupport;
import org.junit.Test;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
+import org.springframework.test.annotation.DirtiesContext;
+@DirtiesContext
public class SpringHystrixRouteConfigRefTest extends CamelSpringTestSupport {
@Override
http://git-wip-us.apache.org/repos/asf/camel/blob/b4d0038a/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/processor/SpringHystrixRouteConfigTest.java
----------------------------------------------------------------------
diff --git a/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/processor/SpringHystrixRouteConfigTest.java b/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/processor/SpringHystrixRouteConfigTest.java
index d0a52b1..4c9574d 100644
--- a/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/processor/SpringHystrixRouteConfigTest.java
+++ b/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/processor/SpringHystrixRouteConfigTest.java
@@ -20,7 +20,9 @@ import org.apache.camel.test.spring.CamelSpringTestSupport;
import org.junit.Test;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
+import org.springframework.test.annotation.DirtiesContext;
+@DirtiesContext
public class SpringHystrixRouteConfigTest extends CamelSpringTestSupport {
@Override
http://git-wip-us.apache.org/repos/asf/camel/blob/b4d0038a/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/processor/SpringHystrixRouteFallbackTest.java
----------------------------------------------------------------------
diff --git a/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/processor/SpringHystrixRouteFallbackTest.java b/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/processor/SpringHystrixRouteFallbackTest.java
index 2857b27..c32606c 100644
--- a/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/processor/SpringHystrixRouteFallbackTest.java
+++ b/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/processor/SpringHystrixRouteFallbackTest.java
@@ -20,7 +20,9 @@ import org.apache.camel.test.spring.CamelSpringTestSupport;
import org.junit.Test;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
+import org.springframework.test.annotation.DirtiesContext;
+@DirtiesContext
public class SpringHystrixRouteFallbackTest extends CamelSpringTestSupport {
@Override
http://git-wip-us.apache.org/repos/asf/camel/blob/b4d0038a/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/processor/SpringHystrixRouteHierarchicalConfigTest.java
----------------------------------------------------------------------
diff --git a/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/processor/SpringHystrixRouteHierarchicalConfigTest.java b/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/processor/SpringHystrixRouteHierarchicalConfigTest.java
new file mode 100644
index 0000000..ae4a5f1
--- /dev/null
+++ b/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/processor/SpringHystrixRouteHierarchicalConfigTest.java
@@ -0,0 +1,68 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.camel.component.hystrix.processor;
+
+import org.apache.camel.model.HystrixConfigurationDefinition;
+import org.apache.camel.model.HystrixDefinition;
+import org.apache.camel.model.RouteDefinition;
+import org.apache.camel.test.spring.CamelSpringTestSupport;
+import org.junit.Assert;
+import org.junit.Test;
+import org.springframework.context.support.AbstractApplicationContext;
+import org.springframework.context.support.ClassPathXmlApplicationContext;
+import org.springframework.test.annotation.DirtiesContext;
+
+@DirtiesContext
+public class SpringHystrixRouteHierarchicalConfigTest extends CamelSpringTestSupport {
+ @Override
+ protected AbstractApplicationContext createApplicationContext() {
+ return new ClassPathXmlApplicationContext("org/apache/camel/component/hystrix/processor/SpringHystrixRouteHierarchicalConfigTest.xml");
+ }
+
+ @Test
+ public void testHystrix() throws Exception {
+ RouteDefinition routeDefinition = context.getRouteDefinition("hystrix-route");
+ HystrixDefinition hystrixDefinition = findHystrixDefinition(routeDefinition);
+
+ Assert.assertNotNull(hystrixDefinition);
+
+ HystrixProcessorFactory factory = new HystrixProcessorFactory();
+ HystrixConfigurationDefinition config = factory.buildHystrixConfiguration(context, hystrixDefinition);
+
+ Assert.assertEquals("local-conf-group-key", config.getGroupKey());
+ Assert.assertEquals("global-thread-key", config.getThreadPoolKey());
+ Assert.assertEquals(new Integer(5), config.getCorePoolSize());
+
+ getMockEndpoint("mock:result").expectedBodiesReceived("Bye World");
+
+ template.sendBody("direct:start", "Hello World");
+
+ assertMockEndpointsSatisfied();
+ }
+
+ // **********************************************
+ // Helper
+ // **********************************************
+
+ private HystrixDefinition findHystrixDefinition(RouteDefinition routeDefinition) throws Exception {
+ return routeDefinition.getOutputs().stream()
+ .filter(HystrixDefinition.class::isInstance)
+ .map(HystrixDefinition.class::cast)
+ .findFirst()
+ .orElseThrow(() -> new IllegalStateException("Unable to find a HystrixDefinition"));
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/b4d0038a/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/processor/SpringHystrixRouteOkTest.java
----------------------------------------------------------------------
diff --git a/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/processor/SpringHystrixRouteOkTest.java b/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/processor/SpringHystrixRouteOkTest.java
index 18622bb..21b50ac 100644
--- a/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/processor/SpringHystrixRouteOkTest.java
+++ b/components/camel-hystrix/src/test/java/org/apache/camel/component/hystrix/processor/SpringHystrixRouteOkTest.java
@@ -20,7 +20,9 @@ import org.apache.camel.test.spring.CamelSpringTestSupport;
import org.junit.Test;
import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
+import org.springframework.test.annotation.DirtiesContext;
+@DirtiesContext
public class SpringHystrixRouteOkTest extends CamelSpringTestSupport {
@Override
http://git-wip-us.apache.org/repos/asf/camel/blob/b4d0038a/components/camel-hystrix/src/test/resources/org/apache/camel/component/hystrix/processor/SpringHystrixRouteHierarchicalConfigTest.xml
----------------------------------------------------------------------
diff --git a/components/camel-hystrix/src/test/resources/org/apache/camel/component/hystrix/processor/SpringHystrixRouteHierarchicalConfigTest.xml b/components/camel-hystrix/src/test/resources/org/apache/camel/component/hystrix/processor/SpringHystrixRouteHierarchicalConfigTest.xml
new file mode 100644
index 0000000..3917248
--- /dev/null
+++ b/components/camel-hystrix/src/test/resources/org/apache/camel/component/hystrix/processor/SpringHystrixRouteHierarchicalConfigTest.xml
@@ -0,0 +1,51 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You 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.
+-->
+<beans xmlns="http://www.springframework.org/schema/beans"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="
+ http://camel.apache.org/schema/spring http://camel.apache.org/schema/spring/camel-spring.xsd
+ http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd ">
+
+ <camelContext xmlns="http://camel.apache.org/schema/spring">
+
+ <defaultHystrixConfiguration id="global" groupKey="global-group-key" threadPoolKey="global-thread-key" corePoolSize="10"/>
+ <hystrixConfiguration id="ref-hystrix" groupKey="ref-group-key" corePoolSize="5"/>
+
+ <route id="hystrix-route">
+ <from uri="direct:start"/>
+ <hystrix hystrixConfigurationRef="ref-hystrix">
+ <hystrixConfiguration groupKey="local-conf-group-key" requestLogEnabled="false"/>
+ <to uri="direct:foo"/>
+ <onFallback>
+ <transform>
+ <constant>Fallback message</constant>
+ </transform>
+ </onFallback>
+ </hystrix>
+ <to uri="mock:result"/>
+ </route>
+
+ <route>
+ <from uri="direct:foo"/>
+ <transform>
+ <constant>Bye World</constant>
+ </transform>
+ </route>
+ </camelContext>
+
+</beans>
\ No newline at end of file
http://git-wip-us.apache.org/repos/asf/camel/blob/b4d0038a/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java
----------------------------------------------------------------------
diff --git a/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java b/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java
index 514985e..70a319e 100644
--- a/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java
+++ b/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java
@@ -171,6 +171,8 @@ public class CamelContextFactoryBean extends AbstractCamelContextFactoryBean<Spr
private ServiceCallConfigurationDefinition defaultServiceCallConfiguration;
@XmlElement(name = "serviceCallConfiguration", type = ServiceCallConfigurationDefinition.class)
private List<ServiceCallConfigurationDefinition> serviceCallConfigurations;
+ @XmlElement(name = "defaultHystrixConfiguration")
+ private HystrixConfigurationDefinition defaultHystrixConfiguration;
@XmlElement(name = "hystrixConfiguration", type = HystrixConfigurationDefinition.class)
private List<HystrixConfigurationDefinition> hystrixConfigurations;
@XmlElement(name = "routeBuilder")
@@ -980,6 +982,15 @@ public class CamelContextFactoryBean extends AbstractCamelContextFactoryBean<Spr
return hystrixConfigurations;
}
+ @Override
+ public HystrixConfigurationDefinition getDefaultHystrixConfiguration() {
+ return defaultHystrixConfiguration;
+ }
+
+ public void setDefaultHystrixConfiguration(HystrixConfigurationDefinition defaultHystrixConfiguration) {
+ this.defaultHystrixConfiguration = defaultHystrixConfiguration;
+ }
+
/**
* hystrix configurations
*/
http://git-wip-us.apache.org/repos/asf/camel/blob/b4d0038a/components/camel-spring/src/main/java/org/apache/camel/spring/handler/CamelNamespaceHandler.java
----------------------------------------------------------------------
diff --git a/components/camel-spring/src/main/java/org/apache/camel/spring/handler/CamelNamespaceHandler.java b/components/camel-spring/src/main/java/org/apache/camel/spring/handler/CamelNamespaceHandler.java
index 072e904..2b89d44 100644
--- a/components/camel-spring/src/main/java/org/apache/camel/spring/handler/CamelNamespaceHandler.java
+++ b/components/camel-spring/src/main/java/org/apache/camel/spring/handler/CamelNamespaceHandler.java
@@ -37,7 +37,6 @@ import org.apache.camel.core.xml.CamelPropertyPlaceholderDefinition;
import org.apache.camel.core.xml.CamelStreamCachingStrategyDefinition;
import org.apache.camel.impl.DefaultCamelContextNameStrategy;
import org.apache.camel.model.FromDefinition;
-import org.apache.camel.model.HystrixConfigurationDefinition;
import org.apache.camel.model.SendDefinition;
import org.apache.camel.spi.CamelContextNameStrategy;
import org.apache.camel.spi.NamespaceAware;
@@ -148,9 +147,8 @@ public class CamelNamespaceHandler extends NamespaceHandlerSupport {
addBeanDefinitionParser("jmxAgent", CamelJMXAgentDefinition.class, false, false);
addBeanDefinitionParser("streamCaching", CamelStreamCachingStrategyDefinition.class, false, false);
addBeanDefinitionParser("propertyPlaceholder", CamelPropertyPlaceholderDefinition.class, false, false);
- addBeanDefinitionParser("hystrixConfiguration", HystrixConfigurationDefinition.class, false, false);
- // errorhandler could be the sub element of camelContext or defined outside camelContext
+ // error handler could be the sub element of camelContext or defined outside camelContext
BeanDefinitionParser errorHandlerParser = new ErrorHandlerDefinitionParser();
registerParser("errorHandler", errorHandlerParser);
parserMap.put("errorHandler", errorHandlerParser);
@@ -405,6 +403,7 @@ public class CamelNamespaceHandler extends NamespaceHandlerSupport {
builder.addPropertyValue("beans", factoryBean.getBeans());
builder.addPropertyValue("defaultServiceCallConfiguration", factoryBean.getDefaultServiceCallConfiguration());
builder.addPropertyValue("serviceCallConfigurations", factoryBean.getServiceCallConfigurations());
+ builder.addPropertyValue("defaultHystrixConfiguration", factoryBean.getDefaultHystrixConfiguration());
builder.addPropertyValue("hystrixConfigurations", factoryBean.getHystrixConfigurations());
// add any depends-on
addDependsOn(factoryBean, builder);
http://git-wip-us.apache.org/repos/asf/camel/blob/b4d0038a/platforms/spring-boot/components-starter/camel-hystrix-starter/src/main/java/org/apache/camel/component/hystrix/springboot/HystrixAutoConfiguration.java
----------------------------------------------------------------------
diff --git a/platforms/spring-boot/components-starter/camel-hystrix-starter/src/main/java/org/apache/camel/component/hystrix/springboot/HystrixAutoConfiguration.java b/platforms/spring-boot/components-starter/camel-hystrix-starter/src/main/java/org/apache/camel/component/hystrix/springboot/HystrixAutoConfiguration.java
new file mode 100644
index 0000000..def622c
--- /dev/null
+++ b/platforms/spring-boot/components-starter/camel-hystrix-starter/src/main/java/org/apache/camel/component/hystrix/springboot/HystrixAutoConfiguration.java
@@ -0,0 +1,59 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.camel.component.hystrix.springboot;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.component.hystrix.processor.HystrixConstants;
+import org.apache.camel.model.HystrixConfigurationDefinition;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.apache.camel.util.IntrospectionSupport;
+import org.springframework.boot.autoconfigure.AutoConfigureAfter;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
+import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+/**
+ * Hystrix auto configuration.
+ */
+@Configuration
+@ConditionalOnProperty(name = "camel.hystrix.enabled", matchIfMissing = true)
+@ConditionalOnBean(value = CamelAutoConfiguration.class)
+@AutoConfigureAfter(value = CamelAutoConfiguration.class)
+@EnableConfigurationProperties(HystrixConfiguration.class)
+public class HystrixAutoConfiguration {
+
+ @Bean(name = HystrixConstants.DEFAULT_HYSTRIX_CONFIGURATION_ID)
+ @ConditionalOnClass(CamelContext.class)
+ @ConditionalOnMissingBean(name = HystrixConstants.DEFAULT_HYSTRIX_CONFIGURATION_ID)
+ HystrixConfigurationDefinition defaultHystrixConfigurationDefinition(CamelContext camelContext, HystrixConfiguration config) throws Exception {
+ Map<String, Object> properties = new HashMap<>();
+
+ IntrospectionSupport.getProperties(config, properties, null, false);
+
+ HystrixConfigurationDefinition definition = new HystrixConfigurationDefinition();
+ IntrospectionSupport.setProperties(camelContext, camelContext.getTypeConverter(), definition, properties);
+
+ return definition;
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/b4d0038a/platforms/spring-boot/components-starter/camel-hystrix-starter/src/main/java/org/apache/camel/component/hystrix/springboot/HystrixConfiguration.java
----------------------------------------------------------------------
diff --git a/platforms/spring-boot/components-starter/camel-hystrix-starter/src/main/java/org/apache/camel/component/hystrix/springboot/HystrixConfiguration.java b/platforms/spring-boot/components-starter/camel-hystrix-starter/src/main/java/org/apache/camel/component/hystrix/springboot/HystrixConfiguration.java
new file mode 100644
index 0000000..063f94a
--- /dev/null
+++ b/platforms/spring-boot/components-starter/camel-hystrix-starter/src/main/java/org/apache/camel/component/hystrix/springboot/HystrixConfiguration.java
@@ -0,0 +1,27 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.camel.component.hystrix.springboot;
+
+import org.apache.camel.model.HystrixConfigurationCommon;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+
+/**
+ * Hystrix component.
+ */
+@ConfigurationProperties(prefix = "camel.hystrix")
+public class HystrixConfiguration extends HystrixConfigurationCommon {
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/b4d0038a/platforms/spring-boot/components-starter/camel-hystrix-starter/src/main/resources/META-INF/spring.factories
----------------------------------------------------------------------
diff --git a/platforms/spring-boot/components-starter/camel-hystrix-starter/src/main/resources/META-INF/spring.factories b/platforms/spring-boot/components-starter/camel-hystrix-starter/src/main/resources/META-INF/spring.factories
index 331a5e4..50c8d3d 100644
--- a/platforms/spring-boot/components-starter/camel-hystrix-starter/src/main/resources/META-INF/spring.factories
+++ b/platforms/spring-boot/components-starter/camel-hystrix-starter/src/main/resources/META-INF/spring.factories
@@ -16,4 +16,5 @@
#
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+org.apache.camel.component.hystrix.springboot.HystrixAutoConfiguration,\
org.apache.camel.component.hystrix.springboot.HystrixMappingAutoConfiguration
http://git-wip-us.apache.org/repos/asf/camel/blob/b4d0038a/platforms/spring-boot/components-starter/camel-hystrix-starter/src/test/java/org/apache/camel/component/hystrix/processor/HystrixHierarchicalConfiguration.java
----------------------------------------------------------------------
diff --git a/platforms/spring-boot/components-starter/camel-hystrix-starter/src/test/java/org/apache/camel/component/hystrix/processor/HystrixHierarchicalConfiguration.java b/platforms/spring-boot/components-starter/camel-hystrix-starter/src/test/java/org/apache/camel/component/hystrix/processor/HystrixHierarchicalConfiguration.java
new file mode 100644
index 0000000..39bbb22
--- /dev/null
+++ b/platforms/spring-boot/components-starter/camel-hystrix-starter/src/test/java/org/apache/camel/component/hystrix/processor/HystrixHierarchicalConfiguration.java
@@ -0,0 +1,54 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.camel.component.hystrix.processor;
+
+import org.apache.camel.builder.RouteBuilder;
+import org.apache.camel.model.HystrixConfigurationDefinition;
+import org.springframework.context.annotation.Bean;
+
+public class HystrixHierarchicalConfiguration {
+ @Bean(name = "ref-hystrix")
+ public HystrixConfigurationDefinition hystrixConfiguration() {
+ return new HystrixConfigurationDefinition()
+ .groupKey("ref-group-key")
+ .corePoolSize(5);
+ }
+
+ @Bean
+ public RouteBuilder routeBuilder() {
+ return new RouteBuilder() {
+ @Override
+ public void configure() throws Exception {
+ from("direct:start")
+ .routeId("hystrix-route")
+ .hystrix()
+ .hystrixConfiguration("ref-hystrix")
+ .hystrixConfiguration()
+ .groupKey("local-conf-group-key")
+ .end()
+ .to("direct:foo")
+ .onFallback()
+ .transform().constant("Fallback message")
+ .end();
+
+ from("direct:foo")
+ .transform().body(b -> "Bye World");
+
+ }
+ };
+ }
+}
http://git-wip-us.apache.org/repos/asf/camel/blob/b4d0038a/platforms/spring-boot/components-starter/camel-hystrix-starter/src/test/java/org/apache/camel/component/hystrix/processor/HystrixHierarchicalConfigurationTest.java
----------------------------------------------------------------------
diff --git a/platforms/spring-boot/components-starter/camel-hystrix-starter/src/test/java/org/apache/camel/component/hystrix/processor/HystrixHierarchicalConfigurationTest.java b/platforms/spring-boot/components-starter/camel-hystrix-starter/src/test/java/org/apache/camel/component/hystrix/processor/HystrixHierarchicalConfigurationTest.java
new file mode 100644
index 0000000..948b6f7
--- /dev/null
+++ b/platforms/spring-boot/components-starter/camel-hystrix-starter/src/test/java/org/apache/camel/component/hystrix/processor/HystrixHierarchicalConfigurationTest.java
@@ -0,0 +1,78 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.camel.component.hystrix.processor;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.model.HystrixConfigurationDefinition;
+import org.apache.camel.model.HystrixDefinition;
+import org.apache.camel.model.RouteDefinition;
+import org.junit.Assert;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.test.context.junit4.SpringRunner;
+
+/**
+ * Testing the Hystrix configuration hierarchy
+ */
+@RunWith(SpringRunner.class)
+@SpringBootApplication
+@DirtiesContext
+@ContextConfiguration(classes = HystrixHierarchicalConfiguration.class)
+@SpringBootTest(properties = {
+ "debug=false",
+ "camel.hystrix.enabled=true",
+ "camel.hystrix.group-key=global-group-key",
+ "camel.hystrix.thread-pool-key=global-thread-key",
+ "camel.hystrix.core-pool-size=10"
+})
+public class HystrixHierarchicalConfigurationTest {
+ @Autowired
+ CamelContext camelContext;
+
+ @Test
+ public void testConfiguration() throws Exception {
+ RouteDefinition routeDefinition = camelContext.getRouteDefinition("hystrix-route");
+ HystrixDefinition hystrixDefinition = findHystrixDefinition(routeDefinition);
+
+ Assert.assertNotNull(hystrixDefinition);
+
+ HystrixProcessorFactory factory = new HystrixProcessorFactory();
+ HystrixConfigurationDefinition config = factory.buildHystrixConfiguration(camelContext, hystrixDefinition);
+
+ Assert.assertEquals("local-conf-group-key", config.getGroupKey());
+ Assert.assertEquals("global-thread-key", config.getThreadPoolKey());
+ Assert.assertEquals(new Integer(5), config.getCorePoolSize());
+ }
+
+ // **********************************************
+ // Helper
+ // **********************************************
+
+ private HystrixDefinition findHystrixDefinition(RouteDefinition routeDefinition) throws Exception {
+ return routeDefinition.getOutputs().stream()
+ .filter(HystrixDefinition.class::isInstance)
+ .map(HystrixDefinition.class::cast)
+ .findFirst()
+ .orElseThrow(() -> new IllegalStateException("Unable to find a HystrixDefinition"));
+ }
+}
+
http://git-wip-us.apache.org/repos/asf/camel/blob/b4d0038a/platforms/spring-boot/components-starter/camel-hystrix-starter/src/test/resources/logback.xml
----------------------------------------------------------------------
diff --git a/platforms/spring-boot/components-starter/camel-hystrix-starter/src/test/resources/logback.xml b/platforms/spring-boot/components-starter/camel-hystrix-starter/src/test/resources/logback.xml
new file mode 100644
index 0000000..bd20d85
--- /dev/null
+++ b/platforms/spring-boot/components-starter/camel-hystrix-starter/src/test/resources/logback.xml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ ~ Licensed to the Apache Software Foundation (ASF) under one or more
+ ~ contributor license agreements. See the NOTICE file distributed with
+ ~ this work for additional information regarding copyright ownership.
+ ~ The ASF licenses this file to You 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.
+ -->
+<configuration>
+
+ <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+ <!-- encoders are assigned the type
+ ch.qos.logback.classic.encoder.PatternLayoutEncoder by default -->
+ <encoder>
+ <pattern>%d{HH:mm:ss.SSS} [%-15.15thread] %-5level %-30.30logger - %msg%n</pattern>
+ </encoder>
+ </appender>
+
+ <appender name="FILE" class="ch.qos.logback.core.FileAppender">
+ <encoder>
+ <pattern>%d{HH:mm:ss.SSS} [%-15.15thread] %-5level %-30.30logger - %msg%n</pattern>
+ </encoder>
+ <file>target/camel-hystrix-starter-test.log</file>
+ </appender>
+
+ <root level="INFO">
+ <appender-ref ref="FILE"/>
+ </root>
+
+</configuration>
\ No newline at end of file