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:01:02 UTC
[camel] 20/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 da9c01a0510e03a606215e6beedd40e10fbb787b
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Mon Nov 18 08:10:13 2019 +0100
CAMEL-13691: camel-resilience4j - WIP
---
.../resilience4j/ResilienceConstants.java | 23 +++++
.../src/main/resources/application.properties | 11 +--
.../springboot/ResilienceAutoConfiguration.java | 99 ++++++++++++++++++++++
.../src/main/resources/META-INF/spring.factories | 15 +---
4 files changed, 130 insertions(+), 18 deletions(-)
diff --git a/components/camel-resilience4j/src/main/java/org/apache/camel/component/resilience4j/ResilienceConstants.java b/components/camel-resilience4j/src/main/java/org/apache/camel/component/resilience4j/ResilienceConstants.java
new file mode 100644
index 0000000..b8443e5
--- /dev/null
+++ b/components/camel-resilience4j/src/main/java/org/apache/camel/component/resilience4j/ResilienceConstants.java
@@ -0,0 +1,23 @@
+/*
+ * 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.resilience4j;
+
+public interface ResilienceConstants {
+
+ String DEFAULT_RESILIENCE_CONFIGURATION_ID = "resilience4j-configuration";
+
+}
diff --git a/examples/camel-example-resilience4j/client/src/main/resources/application.properties b/examples/camel-example-resilience4j/client/src/main/resources/application.properties
index c3a7ed9..eafb09b 100644
--- a/examples/camel-example-resilience4j/client/src/main/resources/application.properties
+++ b/examples/camel-example-resilience4j/client/src/main/resources/application.properties
@@ -20,11 +20,12 @@ server.port=8080
# configure resilience4j
# when we have more than 5 requests per 10 seconds that 50%+ fails
# then open circuit and call fallback immediately
-// TODO: configure these
-camel.resilience.sliding-window-type=
-camel.hystrix.circuit-breaker-request-volume-threshold=5
-camel.hystrix.circuit-breaker-error-threshold-percentage=50
-camel.hystrix.metrics-rolling-percentile-window-in-milliseconds=10000
+camel.resilience4j.minimum-number-of-calls=5
+camel.resilience4j.sliding-window-size=10
+camel.resilience4j.sliding-window-type=TIME_BASED
+camel.resilience4j.failure-rate-threshold=50
+# stay in open for 10s before switching back to half-open
+camel.resilience4j.wait-duration-in-open-state=10
# resilience4j logging
#logging.level.org.apache.camel.component.resilience=DEBUG
diff --git a/platforms/spring-boot/components-starter/camel-resilience4j-starter/src/main/java/org/apache/camel/component/resilience/springboot/ResilienceAutoConfiguration.java b/platforms/spring-boot/components-starter/camel-resilience4j-starter/src/main/java/org/apache/camel/component/resilience/springboot/ResilienceAutoConfiguration.java
new file mode 100644
index 0000000..c9ecdee
--- /dev/null
+++ b/platforms/spring-boot/components-starter/camel-resilience4j-starter/src/main/java/org/apache/camel/component/resilience/springboot/ResilienceAutoConfiguration.java
@@ -0,0 +1,99 @@
+/*
+ * 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.resilience.springboot;
+
+import java.util.HashMap;
+import java.util.Map;
+import javax.annotation.PostConstruct;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.component.resilience4j.ResilienceConstants;
+import org.apache.camel.model.Resilience4jConfigurationDefinition;
+import org.apache.camel.model.springboot.Resilience4jConfigurationDefinitionCommon;
+import org.apache.camel.model.springboot.Resilience4jConfigurationDefinitionProperties;
+import org.apache.camel.spring.boot.CamelAutoConfiguration;
+import org.apache.camel.support.IntrospectionSupport;
+import org.springframework.beans.factory.BeanCreationException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.config.ConfigurableBeanFactory;
+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;
+
+/**
+ * Resilience auto configuration.
+ */
+@Configuration
+@ConditionalOnProperty(name = "camel.resilience4j.enabled", matchIfMissing = true)
+@ConditionalOnBean(value = CamelAutoConfiguration.class)
+@AutoConfigureAfter(value = CamelAutoConfiguration.class)
+@EnableConfigurationProperties(Resilience4jConfigurationDefinitionProperties.class)
+public class ResilienceAutoConfiguration {
+ @Autowired
+ private ConfigurableBeanFactory beanFactory;
+ @Autowired
+ private CamelContext camelContext;
+ @Autowired
+ private Resilience4jConfigurationDefinitionProperties config;
+
+ @Bean(name = ResilienceConstants.DEFAULT_RESILIENCE_CONFIGURATION_ID)
+ @ConditionalOnClass(CamelContext.class)
+ @ConditionalOnMissingBean(name = ResilienceConstants.DEFAULT_RESILIENCE_CONFIGURATION_ID)
+ public Resilience4jConfigurationDefinition defaultResilienceConfigurationDefinition() throws Exception {
+ Map<String, Object> properties = new HashMap<>();
+
+ IntrospectionSupport.getProperties(config, properties, null, false);
+ Resilience4jConfigurationDefinition definition = new Resilience4jConfigurationDefinition();
+ IntrospectionSupport.setProperties(camelContext, camelContext.getTypeConverter(), definition, properties);
+
+ return definition;
+ }
+
+ @PostConstruct
+ public void postConstruct() {
+ if (beanFactory == null) {
+ return;
+ }
+
+ Map<String, Object> properties = new HashMap<>();
+
+ for (Map.Entry<String, Resilience4jConfigurationDefinitionCommon> entry : config.getConfigurations().entrySet()) {
+
+ // clear the properties map for reuse
+ properties.clear();
+
+ // extract properties
+ IntrospectionSupport.getProperties(entry.getValue(), properties, null, false);
+
+ try {
+ Resilience4jConfigurationDefinition definition = new Resilience4jConfigurationDefinition();
+ IntrospectionSupport.setProperties(camelContext, camelContext.getTypeConverter(), definition, properties);
+
+ // Registry the definition
+ beanFactory.registerSingleton(entry.getKey(), definition);
+
+ } catch (Exception e) {
+ throw new BeanCreationException(entry.getKey(), e);
+ }
+ }
+ }
+}
diff --git a/examples/camel-example-resilience4j/client/src/main/resources/application.properties b/platforms/spring-boot/components-starter/camel-resilience4j-starter/src/main/resources/META-INF/spring.factories
similarity index 66%
copy from examples/camel-example-resilience4j/client/src/main/resources/application.properties
copy to platforms/spring-boot/components-starter/camel-resilience4j-starter/src/main/resources/META-INF/spring.factories
index c3a7ed9..93d1a24 100644
--- a/examples/camel-example-resilience4j/client/src/main/resources/application.properties
+++ b/platforms/spring-boot/components-starter/camel-resilience4j-starter/src/main/resources/META-INF/spring.factories
@@ -14,17 +14,6 @@
## See the License for the specific language governing permissions and
## limitations under the License.
## ---------------------------------------------------------------------------
+org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
+org.apache.camel.component.resilience.springboot.ResilienceAutoConfiguration
-server.port=8080
-
-# configure resilience4j
-# when we have more than 5 requests per 10 seconds that 50%+ fails
-# then open circuit and call fallback immediately
-// TODO: configure these
-camel.resilience.sliding-window-type=
-camel.hystrix.circuit-breaker-request-volume-threshold=5
-camel.hystrix.circuit-breaker-error-threshold-percentage=50
-camel.hystrix.metrics-rolling-percentile-window-in-milliseconds=10000
-
-# resilience4j logging
-#logging.level.org.apache.camel.component.resilience=DEBUG