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();

Reply via email to