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