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