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 <[email protected]> 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
