This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch CAMEL-13691 in repository https://gitbox.apache.org/repos/asf/camel.git
commit 4bcef5892702d129803554b438ecf2bccd5a52cf Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Sat Nov 16 12:59:25 2019 +0100 CAMEL-13691: camel-resilience4j - WIP --- .../camel/blueprint/CamelContextFactoryBean.java | 23 +++++++++++++++ .../camel/spring/CamelContextFactoryBean.java | 31 +++++++++++++++++++- .../camel/impl/AbstractModelCamelContext.java | 21 ++++++++++++++ .../java/org/apache/camel/impl/DefaultModel.java | 30 ++++++++++++++++++++ .../main/java/org/apache/camel/model/Model.java | 33 ++++++++++++++++++++++ .../core/xml/AbstractCamelContextFactoryBean.java | 13 +++++++++ .../org/apache/camel/main/BaseMainSupport.java | 30 ++++++++++++++++++-- 7 files changed, 178 insertions(+), 3 deletions(-) diff --git a/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java b/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java index cc3092c..2d40c00 100644 --- a/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java +++ b/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java @@ -55,6 +55,7 @@ import org.apache.camel.model.InterceptSendToEndpointDefinition; import org.apache.camel.model.OnCompletionDefinition; import org.apache.camel.model.OnExceptionDefinition; import org.apache.camel.model.PackageScanDefinition; +import org.apache.camel.model.Resilience4jConfigurationDefinition; import org.apache.camel.model.RestContextRefDefinition; import org.apache.camel.model.RouteBuilderDefinition; import org.apache.camel.model.RouteContextRefDefinition; @@ -169,6 +170,10 @@ public class CamelContextFactoryBean extends AbstractCamelContextFactoryBean<Blu private HystrixConfigurationDefinition defaultHystrixConfiguration; @XmlElement(name = "hystrixConfiguration", type = HystrixConfigurationDefinition.class) private List<HystrixConfigurationDefinition> hystrixConfigurations; + @XmlElement(name = "defaultResilience4jConfiguration") + private Resilience4jConfigurationDefinition defaultResilience4jConfiguration; + @XmlElement(name = "resilience4jConfiguration", type = Resilience4jConfigurationDefinition.class) + private List<Resilience4jConfigurationDefinition> resilience4jConfigurations; @XmlElement(name = "routeBuilder") private List<RouteBuilderDefinition> builderRefs = new ArrayList<>(); @XmlElement(name = "routeContextRef") @@ -755,6 +760,24 @@ public class CamelContextFactoryBean extends AbstractCamelContextFactoryBean<Blu } @Override + public Resilience4jConfigurationDefinition getDefaultResilience4jConfiguration() { + return defaultResilience4jConfiguration; + } + + public void setDefaultResilience4jConfiguration(Resilience4jConfigurationDefinition defaultResilience4jConfiguration) { + this.defaultResilience4jConfiguration = defaultResilience4jConfiguration; + } + + @Override + public List<Resilience4jConfigurationDefinition> getResilience4jConfigurations() { + return resilience4jConfigurations; + } + + public void setResilience4jConfigurations(List<Resilience4jConfigurationDefinition> resilience4jConfigurations) { + this.resilience4jConfigurations = resilience4jConfigurations; + } + + @Override public List<RouteBuilderDefinition> getBuilderRefs() { return builderRefs; } 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 c60d541..cdcf877 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 @@ -53,6 +53,7 @@ import org.apache.camel.model.InterceptSendToEndpointDefinition; import org.apache.camel.model.OnCompletionDefinition; import org.apache.camel.model.OnExceptionDefinition; import org.apache.camel.model.PackageScanDefinition; +import org.apache.camel.model.Resilience4jConfigurationDefinition; import org.apache.camel.model.RestContextRefDefinition; import org.apache.camel.model.RouteBuilderDefinition; import org.apache.camel.model.RouteContextRefDefinition; @@ -181,6 +182,10 @@ public class CamelContextFactoryBean extends AbstractCamelContextFactoryBean<Spr private HystrixConfigurationDefinition defaultHystrixConfiguration; @XmlElement(name = "hystrixConfiguration", type = HystrixConfigurationDefinition.class) private List<HystrixConfigurationDefinition> hystrixConfigurations; + @XmlElement(name = "defaultResilience4jConfiguration") + private Resilience4jConfigurationDefinition defaultResilience4jConfiguration; + @XmlElement(name = "resilience4jConfiguration", type = Resilience4jConfigurationDefinition.class) + private List<Resilience4jConfigurationDefinition> resilience4jConfigurations; @XmlElement(name = "routeBuilder") private List<RouteBuilderDefinition> builderRefs = new ArrayList<>(); @XmlElement(name = "routeContextRef") @@ -1138,12 +1143,36 @@ public class CamelContextFactoryBean extends AbstractCamelContextFactoryBean<Spr } /** - * Hystrix EIP configurations + * Hystrix Circuit Breaker EIP configurations */ public void setHystrixConfigurations(List<HystrixConfigurationDefinition> hystrixConfigurations) { this.hystrixConfigurations = hystrixConfigurations; } + @Override + public Resilience4jConfigurationDefinition getDefaultResilience4jConfiguration() { + return defaultResilience4jConfiguration; + } + + /** + * Resilience4j EIP default configuration + */ + public void setDefaultResilience4jConfiguration(Resilience4jConfigurationDefinition defaultResilience4jConfiguration) { + this.defaultResilience4jConfiguration = defaultResilience4jConfiguration; + } + + @Override + public List<Resilience4jConfigurationDefinition> getResilience4jConfigurations() { + return resilience4jConfigurations; + } + + /** + * Resilience4j Circuit Breaker EIP configurations + */ + public void setResilience4jConfigurations(List<Resilience4jConfigurationDefinition> resilience4jConfigurations) { + this.resilience4jConfigurations = resilience4jConfigurations; + } + /** * Configuration of error handlers that triggers on exceptions thrown. */ diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/impl/AbstractModelCamelContext.java b/core/camel-core-engine/src/main/java/org/apache/camel/impl/AbstractModelCamelContext.java index 148f9f0..6a78a7c 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/impl/AbstractModelCamelContext.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/impl/AbstractModelCamelContext.java @@ -37,6 +37,7 @@ import org.apache.camel.model.HystrixConfigurationDefinition; import org.apache.camel.model.Model; import org.apache.camel.model.ModelCamelContext; import org.apache.camel.model.ProcessorDefinition; +import org.apache.camel.model.Resilience4jConfigurationDefinition; import org.apache.camel.model.RouteDefinition; import org.apache.camel.model.cloud.ServiceCallConfigurationDefinition; import org.apache.camel.model.rest.RestDefinition; @@ -186,6 +187,26 @@ public abstract class AbstractModelCamelContext extends AbstractCamelContext imp } @Override + public Resilience4jConfigurationDefinition getResilience4jConfiguration(String id) { + return model.getResilience4jConfiguration(id); + } + + @Override + public void setResilience4jConfiguration(Resilience4jConfigurationDefinition configuration) { + model.setResilience4jConfiguration(configuration); + } + + @Override + public void setResilience4jConfigurations(List<Resilience4jConfigurationDefinition> configurations) { + model.setResilience4jConfigurations(configurations); + } + + @Override + public void addResilience4jConfiguration(String id, Resilience4jConfigurationDefinition configuration) { + model.addResilience4jConfiguration(id, configuration); + } + + @Override public List<ValidatorDefinition> getValidators() { return model.getValidators(); } diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultModel.java b/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultModel.java index 33820bc..f4463d9 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultModel.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultModel.java @@ -37,6 +37,7 @@ import org.apache.camel.model.HystrixConfigurationDefinition; import org.apache.camel.model.Model; import org.apache.camel.model.ProcessorDefinition; import org.apache.camel.model.ProcessorDefinitionHelper; +import org.apache.camel.model.Resilience4jConfigurationDefinition; import org.apache.camel.model.RouteDefinition; import org.apache.camel.model.RouteDefinitionHelper; import org.apache.camel.model.RouteFilters; @@ -58,6 +59,7 @@ public class DefaultModel implements Model { private List<ValidatorDefinition> validators = new ArrayList<>(); private Map<String, ServiceCallConfigurationDefinition> serviceCallConfigurations = new ConcurrentHashMap<>(); private Map<String, HystrixConfigurationDefinition> hystrixConfigurations = new ConcurrentHashMap<>(); + private Map<String, Resilience4jConfigurationDefinition> resilience4jConfigurations = new ConcurrentHashMap<>(); private Function<RouteDefinition, Boolean> routeFilter; public DefaultModel(CamelContext camelContext) { @@ -205,6 +207,34 @@ public class DefaultModel implements Model { } @Override + public Resilience4jConfigurationDefinition getResilience4jConfiguration(String id) { + if (id == null) { + id = ""; + } + + return resilience4jConfigurations.get(id); + } + + @Override + public void setResilience4jConfiguration(Resilience4jConfigurationDefinition configuration) { + resilience4jConfigurations.put("", configuration); + } + + @Override + public void setResilience4jConfigurations(List<Resilience4jConfigurationDefinition> configurations) { + if (configurations != null) { + for (Resilience4jConfigurationDefinition configuration : configurations) { + resilience4jConfigurations.put(configuration.getId(), configuration); + } + } + } + + @Override + public void addResilience4jConfiguration(String id, Resilience4jConfigurationDefinition configuration) { + resilience4jConfigurations.put(id, configuration); + } + + @Override public DataFormatDefinition resolveDataFormatDefinition(String name) { // lookup type and create the data format from it DataFormatDefinition type = lookup(camelContext, name, DataFormatDefinition.class); diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/model/Model.java b/core/camel-core-engine/src/main/java/org/apache/camel/model/Model.java index a6aa802..c8bdac7 100644 --- a/core/camel-core-engine/src/main/java/org/apache/camel/model/Model.java +++ b/core/camel-core-engine/src/main/java/org/apache/camel/model/Model.java @@ -201,6 +201,39 @@ public interface Model { void addHystrixConfiguration(String id, HystrixConfigurationDefinition configuration); /** + * Gets the Resilience4j configuration by the given name. If no name is given the + * default configuration is returned, see <tt>setResilience4jConfiguration</tt> + * + * @param id id of the configuration, or <tt>null</tt> to return the default + * configuration + * @return the configuration, or <tt>null</tt> if no configuration has been + * registered + */ + Resilience4jConfigurationDefinition getResilience4jConfiguration(String id); + + /** + * Sets the default Resilience4j configuration + * + * @param configuration the configuration + */ + void setResilience4jConfiguration(Resilience4jConfigurationDefinition configuration); + + /** + * Sets the Resilience4j configurations + * + * @param configurations the configuration list + */ + void setResilience4jConfigurations(List<Resilience4jConfigurationDefinition> configurations); + + /** + * Adds the Resilience4j configuration + * + * @param id name of the configuration + * @param configuration the configuration + */ + void addResilience4jConfiguration(String id, Resilience4jConfigurationDefinition configuration); + + /** * Gets the validators that can be referenced in the routes. * * @return the validators available diff --git a/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java b/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java index 9590014..abb2c29 100644 --- a/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java +++ b/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java @@ -62,6 +62,7 @@ import org.apache.camel.model.ModelCamelContext; import org.apache.camel.model.OnCompletionDefinition; import org.apache.camel.model.OnExceptionDefinition; import org.apache.camel.model.PackageScanDefinition; +import org.apache.camel.model.Resilience4jConfigurationDefinition; import org.apache.camel.model.RestContextRefDefinition; import org.apache.camel.model.RouteBuilderDefinition; import org.apache.camel.model.RouteContainer; @@ -824,6 +825,10 @@ public abstract class AbstractCamelContextFactoryBean<T extends ModelCamelContex public abstract List<HystrixConfigurationDefinition> getHystrixConfigurations(); + public abstract Resilience4jConfigurationDefinition getDefaultResilience4jConfiguration(); + + public abstract List<Resilience4jConfigurationDefinition> getResilience4jConfigurations(); + // Implementation methods // ------------------------------------------------------------------------- @@ -928,6 +933,14 @@ public abstract class AbstractCamelContextFactoryBean<T extends ModelCamelContex context.addHystrixConfiguration(bean.getId(), bean); } } + if (getDefaultResilience4jConfiguration() != null) { + context.setResilience4jConfiguration(getDefaultResilience4jConfiguration()); + } + if (getResilience4jConfigurations() != null) { + for (Resilience4jConfigurationDefinition bean : getResilience4jConfigurations()) { + context.addResilience4jConfiguration(bean.getId(), bean); + } + } } protected void initThreadPoolProfiles(T context) throws Exception { diff --git a/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java b/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java index dd64a90..542ed8c 100644 --- a/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java +++ b/core/camel-main/src/main/java/org/apache/camel/main/BaseMainSupport.java @@ -43,6 +43,7 @@ import org.apache.camel.builder.RouteBuilder; import org.apache.camel.model.HystrixConfigurationDefinition; import org.apache.camel.model.Model; import org.apache.camel.model.ModelCamelContext; +import org.apache.camel.model.Resilience4jConfigurationDefinition; import org.apache.camel.model.RouteDefinition; import org.apache.camel.spi.CamelBeanPostProcessor; import org.apache.camel.spi.DataFormat; @@ -658,6 +659,7 @@ public abstract class BaseMainSupport extends ServiceSupport { Map<String, Object> contextProperties = new LinkedHashMap<>(); Map<String, Object> hystrixProperties = new LinkedHashMap<>(); + Map<String, Object> resilience4jProperties = new LinkedHashMap<>(); Map<String, Object> restProperties = new LinkedHashMap<>(); for (String key : prop.stringPropertyNames()) { if (key.startsWith("camel.context.")) { @@ -672,6 +674,12 @@ public abstract class BaseMainSupport extends ServiceSupport { String option = key.substring(14); validateOptionAndValue(key, option, value); hystrixProperties.put(optionKey(option), value); + } else if (key.startsWith("camel.resilience4j.")) { + // grab the value + String value = prop.getProperty(key); + String option = key.substring(19); + validateOptionAndValue(key, option, value); + resilience4jProperties.put(optionKey(option), value); } else if (key.startsWith("camel.rest.")) { // grab the value String value = prop.getProperty(key); @@ -686,14 +694,25 @@ public abstract class BaseMainSupport extends ServiceSupport { mainConfigurationProperties.isAutoConfigurationFailFast(), true, autoConfiguredProperties); } if (!hystrixProperties.isEmpty()) { - LOG.debug("Auto-configuring Hystrix EIP from loaded properties: {}", hystrixProperties.size()); + LOG.debug("Auto-configuring Hystrix Circuit Breaker EIP from loaded properties: {}", hystrixProperties.size()); ModelCamelContext model = camelContext.adapt(ModelCamelContext.class); HystrixConfigurationDefinition hystrix = model.getHystrixConfiguration(null); if (hystrix == null) { hystrix = new HystrixConfigurationDefinition(); model.setHystrixConfiguration(hystrix); } - setPropertiesOnTarget(camelContext, hystrix, hystrixProperties, null, "camel.hsytrix.", + setPropertiesOnTarget(camelContext, hystrix, hystrixProperties, null, "camel.hystrix.", + mainConfigurationProperties.isAutoConfigurationFailFast(), true, autoConfiguredProperties); + } + if (!resilience4jProperties.isEmpty()) { + LOG.debug("Auto-configuring Resilience4j Circuit Breaker EIP from loaded properties: {}", resilience4jProperties.size()); + ModelCamelContext model = camelContext.adapt(ModelCamelContext.class); + Resilience4jConfigurationDefinition resilience4j = model.getResilience4jConfiguration(null); + if (resilience4j == null) { + resilience4j = new Resilience4jConfigurationDefinition(); + model.setResilience4jConfiguration(resilience4j); + } + setPropertiesOnTarget(camelContext, resilience4j, hystrixProperties, null, "camel.resilience4j.", mainConfigurationProperties.isAutoConfigurationFailFast(), true, autoConfiguredProperties); } if (!restProperties.isEmpty()) { @@ -721,6 +740,13 @@ public abstract class BaseMainSupport extends ServiceSupport { LOG.warn("Property not auto-configured: camel.hystrix.{}={} on bean: {}", k, v, hystrix); }); } + if (!resilience4jProperties.isEmpty()) { + ModelCamelContext model = camelContext.adapt(ModelCamelContext.class); + Resilience4jConfigurationDefinition resilience4j = model.getResilience4jConfiguration(null); + resilience4jProperties.forEach((k, v) -> { + LOG.warn("Property not auto-configured: camel.resilience4j.{}={} on bean: {}", k, v, resilience4j); + }); + } if (!restProperties.isEmpty()) { ModelCamelContext model = camelContext.adapt(ModelCamelContext.class); RestConfiguration rest = model.getRestConfiguration();