You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2019/11/18 09:00:46 UTC

[camel] 04/23: CAMEL-13691: camel-resilience4j - WIP

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 <cl...@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();