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 f1bd476dafe5a59d30434aedee2f0b3b13d016e0 Author: Claus Ibsen <[email protected]> AuthorDate: Mon Nov 18 07:08:16 2019 +0100 CAMEL-14186: camel-core-starter - Spring Boot auto-configuration is not generated for some models --- .../RestConfigurationDefinitionProperties.java | 10 +- .../Resilience4jConfigurationDefinitionCommon.java | 219 +++++++++++++++++++++ ...ilience4jConfigurationDefinitionProperties.java | 50 +++++ .../packaging/SpringBootAutoConfigurationMojo.java | 45 +++-- 4 files changed, 299 insertions(+), 25 deletions(-) diff --git a/platforms/spring-boot/components-starter/camel-core-starter/src/main/java/org/apache/camel/model/rest/springboot/RestConfigurationDefinitionProperties.java b/platforms/spring-boot/components-starter/camel-core-starter/src/main/java/org/apache/camel/model/rest/springboot/RestConfigurationDefinitionProperties.java index 7cebfff..5111217 100644 --- a/platforms/spring-boot/components-starter/camel-core-starter/src/main/java/org/apache/camel/model/rest/springboot/RestConfigurationDefinitionProperties.java +++ b/platforms/spring-boot/components-starter/camel-core-starter/src/main/java/org/apache/camel/model/rest/springboot/RestConfigurationDefinitionProperties.java @@ -33,11 +33,11 @@ public class RestConfigurationDefinitionProperties { /** * The Camel Rest component to use for the REST transport (consumer), such - * as netty-http, jetty, servlet, undertow. If no component has been explicit configured, - * then Camel will lookup if there is a Camel component that integrates with - * the Rest DSL, or if a org.apache.camel.spi.RestConsumerFactory is - * registered in the registry. If either one is found, then that is being - * used. + * as netty-http, jetty, servlet, undertow. If no component has been + * explicit configured, then Camel will lookup if there is a Camel component + * that integrates with the Rest DSL, or if a + * org.apache.camel.spi.RestConsumerFactory is registered in the registry. + * If either one is found, then that is being used. */ private String component; /** diff --git a/platforms/spring-boot/components-starter/camel-core-starter/src/main/java/org/apache/camel/model/springboot/Resilience4jConfigurationDefinitionCommon.java b/platforms/spring-boot/components-starter/camel-core-starter/src/main/java/org/apache/camel/model/springboot/Resilience4jConfigurationDefinitionCommon.java new file mode 100644 index 0000000..b9ecfda --- /dev/null +++ b/platforms/spring-boot/components-starter/camel-core-starter/src/main/java/org/apache/camel/model/springboot/Resilience4jConfigurationDefinitionCommon.java @@ -0,0 +1,219 @@ +/* + * 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.model.springboot; + +import javax.annotation.Generated; + +/** + * Resilience4j Circuit Breaker EIP configuration + * + * Generated by camel-package-maven-plugin - do not edit this file! + */ +@Generated("org.apache.camel.maven.packaging.SpringBootAutoConfigurationMojo") +public class Resilience4jConfigurationDefinitionCommon { + + /** + * Refers to an existing + * io.github.resilience4j.circuitbreaker.CircuitBreaker instance to lookup + * and use from the registry. When using this, then any other circuit + * breaker options are not in use. + */ + private String circuitBreakerRef; + /** + * Refers to an existing + * io.github.resilience4j.circuitbreaker.CircuitBreakerConfig instance to + * lookup and use from the registry. + */ + private String configRef; + /** + * Configures the failure rate threshold in percentage. If the failure rate + * is equal or greater than the threshold the CircuitBreaker transitions to + * open and starts short-circuiting calls. The threshold must be greater + * than 0 and not greater than 100. Default value is 50 percentage. + */ + private Float failureRateThreshold; + /** + * Configures the number of permitted calls when the CircuitBreaker is half + * open. The size must be greater than 0. Default size is 10. + */ + private Integer permittedNumberOfCallsInHalfOpenState = 10; + /** + * Configures the size of the sliding window which is used to record the + * outcome of calls when the CircuitBreaker is closed. slidingWindowSize + * configures the size of the sliding window. Sliding window can either be + * count-based or time-based. If slidingWindowType is COUNT_BASED, the last + * slidingWindowSize calls are recorded and aggregated. If slidingWindowType + * is TIME_BASED, the calls of the last slidingWindowSize seconds are + * recorded and aggregated. The slidingWindowSize must be greater than 0. + * The minimumNumberOfCalls must be greater than 0. If the slidingWindowType + * is COUNT_BASED, the minimumNumberOfCalls cannot be greater than + * slidingWindowSize. If the slidingWindowType is TIME_BASED, you can pick + * whatever you want. Default slidingWindowSize is 100. + */ + private Integer slidingWindowSize = 100; + /** + * Configures the type of the sliding window which is used to record the + * outcome of calls when the CircuitBreaker is closed. Sliding window can + * either be count-based or time-based. If slidingWindowType is COUNT_BASED, + * the last slidingWindowSize calls are recorded and aggregated. If + * slidingWindowType is TIME_BASED, the calls of the last slidingWindowSize + * seconds are recorded and aggregated. Default slidingWindowType is + * COUNT_BASED. + */ + private String slidingWindowType = "COUNT_BASED"; + /** + * Configures configures the minimum number of calls which are required (per + * sliding window period) before the CircuitBreaker can calculate the error + * rate. For example, if minimumNumberOfCalls is 10, then at least 10 calls + * must be recorded, before the failure rate can be calculated. If only 9 + * calls have been recorded the CircuitBreaker will not transition to open + * even if all 9 calls have failed. Default minimumNumberOfCalls is 100 + */ + private Integer minimumNumberOfCalls = 100; + /** + * Enables writable stack traces. When set to false, Exception.getStackTrace + * returns a zero length array. This may be used to reduce log spam when the + * circuit breaker is open as the cause of the exceptions is already known + * (the circuit breaker is short-circuiting calls). + */ + private Boolean writableStackTraceEnabled = true; + /** + * Configures the wait duration (in seconds) which specifies how long the + * CircuitBreaker should stay open, before it switches to half open. Default + * value is 60 seconds. + */ + private Integer waitDurationInOpenState = 60; + /** + * Enables automatic transition from OPEN to HALF_OPEN state once the + * waitDurationInOpenState has passed. + */ + private Boolean automaticTransitionFromOpenToHalfOpenEnabled = false; + /** + * Configures a threshold in percentage. The CircuitBreaker considers a call + * as slow when the call duration is greater than + * slowCallDurationThreshold(Duration. When the percentage of slow calls is + * equal or greater the threshold, the CircuitBreaker transitions to open + * and starts short-circuiting calls. The threshold must be greater than 0 + * and not greater than 100. Default value is 100 percentage which means + * that all recorded calls must be slower than slowCallDurationThreshold. + */ + private Float slowCallRateThreshold; + /** + * Configures the duration threshold (seconds) above which calls are + * considered as slow and increase the slow calls percentage. Default value + * is 60 seconds. + */ + private Integer slowCallDurationThreshold = 60; + + public String getCircuitBreakerRef() { + return circuitBreakerRef; + } + + public void setCircuitBreakerRef(String circuitBreakerRef) { + this.circuitBreakerRef = circuitBreakerRef; + } + + public String getConfigRef() { + return configRef; + } + + public void setConfigRef(String configRef) { + this.configRef = configRef; + } + + public Float getFailureRateThreshold() { + return failureRateThreshold; + } + + public void setFailureRateThreshold(Float failureRateThreshold) { + this.failureRateThreshold = failureRateThreshold; + } + + public Integer getPermittedNumberOfCallsInHalfOpenState() { + return permittedNumberOfCallsInHalfOpenState; + } + + public void setPermittedNumberOfCallsInHalfOpenState( + Integer permittedNumberOfCallsInHalfOpenState) { + this.permittedNumberOfCallsInHalfOpenState = permittedNumberOfCallsInHalfOpenState; + } + + public Integer getSlidingWindowSize() { + return slidingWindowSize; + } + + public void setSlidingWindowSize(Integer slidingWindowSize) { + this.slidingWindowSize = slidingWindowSize; + } + + public String getSlidingWindowType() { + return slidingWindowType; + } + + public void setSlidingWindowType(String slidingWindowType) { + this.slidingWindowType = slidingWindowType; + } + + public Integer getMinimumNumberOfCalls() { + return minimumNumberOfCalls; + } + + public void setMinimumNumberOfCalls(Integer minimumNumberOfCalls) { + this.minimumNumberOfCalls = minimumNumberOfCalls; + } + + public Boolean getWritableStackTraceEnabled() { + return writableStackTraceEnabled; + } + + public void setWritableStackTraceEnabled(Boolean writableStackTraceEnabled) { + this.writableStackTraceEnabled = writableStackTraceEnabled; + } + + public Integer getWaitDurationInOpenState() { + return waitDurationInOpenState; + } + + public void setWaitDurationInOpenState(Integer waitDurationInOpenState) { + this.waitDurationInOpenState = waitDurationInOpenState; + } + + public Boolean getAutomaticTransitionFromOpenToHalfOpenEnabled() { + return automaticTransitionFromOpenToHalfOpenEnabled; + } + + public void setAutomaticTransitionFromOpenToHalfOpenEnabled( + Boolean automaticTransitionFromOpenToHalfOpenEnabled) { + this.automaticTransitionFromOpenToHalfOpenEnabled = automaticTransitionFromOpenToHalfOpenEnabled; + } + + public Float getSlowCallRateThreshold() { + return slowCallRateThreshold; + } + + public void setSlowCallRateThreshold(Float slowCallRateThreshold) { + this.slowCallRateThreshold = slowCallRateThreshold; + } + + public Integer getSlowCallDurationThreshold() { + return slowCallDurationThreshold; + } + + public void setSlowCallDurationThreshold(Integer slowCallDurationThreshold) { + this.slowCallDurationThreshold = slowCallDurationThreshold; + } +} \ No newline at end of file diff --git a/platforms/spring-boot/components-starter/camel-core-starter/src/main/java/org/apache/camel/model/springboot/Resilience4jConfigurationDefinitionProperties.java b/platforms/spring-boot/components-starter/camel-core-starter/src/main/java/org/apache/camel/model/springboot/Resilience4jConfigurationDefinitionProperties.java new file mode 100644 index 0000000..dcc6b32 --- /dev/null +++ b/platforms/spring-boot/components-starter/camel-core-starter/src/main/java/org/apache/camel/model/springboot/Resilience4jConfigurationDefinitionProperties.java @@ -0,0 +1,50 @@ +/* + * 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.model.springboot; + +import java.util.HashMap; +import java.util.Map; +import javax.annotation.Generated; +import org.springframework.boot.context.properties.ConfigurationProperties; + +@Generated("org.apache.camel.maven.packaging.SpringBootAutoConfigurationMojo") +@ConfigurationProperties(prefix = "camel.resilience4j") +public class Resilience4jConfigurationDefinitionProperties + extends + Resilience4jConfigurationDefinitionCommon { + + /** + * Enable the component + */ + private boolean enabled = true; + /** + * Define additional configuration definitions + */ + private Map<String, Resilience4jConfigurationDefinitionCommon> configurations = new HashMap<>(); + + public Map<String, Resilience4jConfigurationDefinitionCommon> getConfigurations() { + return configurations; + } + + public boolean isEnabled() { + return enabled; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } +} \ No newline at end of file diff --git a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SpringBootAutoConfigurationMojo.java b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SpringBootAutoConfigurationMojo.java index 32d6dce..e7257d8 100644 --- a/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SpringBootAutoConfigurationMojo.java +++ b/tooling/maven/camel-package-maven-plugin/src/main/java/org/apache/camel/maven/packaging/SpringBootAutoConfigurationMojo.java @@ -197,7 +197,7 @@ public class SpringBootAutoConfigurationMojo extends AbstractMojo { } // Spring-boot configuration has been moved on starters - File starterDir = SpringBootHelper.starterDir(baseDir, project.getArtifactId()); + File starterDir = SpringBootHelper.starterDir(baseDir, getStarterArtifactId()); if (!starterDir.exists() || !(new File(starterDir, "pom.xml").exists())) { // If the starter does not exist, no configuration can be created getLog().info("Component auto-configuration will not be created: the starter does not exist"); @@ -209,9 +209,13 @@ public class SpringBootAutoConfigurationMojo extends AbstractMojo { private void executeAll() throws MojoExecutionException, MojoFailureException { Map<File, Supplier<String>> files = PackageHelper.findJsonFiles(buildDir, p -> p.isDirectory() || p.getName().endsWith(".json")).stream() - .collect(Collectors.toMap(Function.identity(), s -> cache(() -> loadJson(s)))); + .collect(Collectors.toMap(Function.identity(), s -> cache(() -> loadJson(s)))); + + // special for camel-core-engine where we generate some special auto-configuration source code + if ("camel-core-engine".equals(project.getArtifactId())) { + executeModels(files); + } - executeModels(files); executeComponent(files); executeDataFormat(files); executeLanguage(files); @@ -250,8 +254,7 @@ public class SpringBootAutoConfigurationMojo extends AbstractMojo { int pos = model.getJavaType().lastIndexOf("."); String pkg = model.getJavaType().substring(0, pos) + ".springboot"; - // Generate properties, auto-configuration happens in - // camel-hystrix-starter + // Generate properties, auto-configuration for camel-core-starter createOtherModelConfigurationSource(pkg, model, "camel.hystrix", true); } @@ -263,8 +266,7 @@ public class SpringBootAutoConfigurationMojo extends AbstractMojo { int pos = model.getJavaType().lastIndexOf("."); String pkg = model.getJavaType().substring(0, pos) + ".springboot"; - // Generate properties, auto-configuration happens in - // camel-resilience4j-starter + // Generate properties, auto-configuration for camel-core-starter createOtherModelConfigurationSource(pkg, model, "camel.resilience4j", true); } @@ -276,8 +278,7 @@ public class SpringBootAutoConfigurationMojo extends AbstractMojo { int pos = model.getJavaType().lastIndexOf("."); String pkg = model.getJavaType().substring(0, pos) + ".springboot"; - // Generate properties, auto-configuration happens in - // camel-consul-starter + // Generate properties, auto-configuration for camel-core-starter createOtherModelConfigurationSource(pkg, model, "camel.cloud.consul.service-discovery", true); } @@ -289,8 +290,7 @@ public class SpringBootAutoConfigurationMojo extends AbstractMojo { int pos = model.getJavaType().lastIndexOf("."); String pkg = model.getJavaType().substring(0, pos) + ".springboot"; - // Generate properties, auto-configuration happens in - // camel-dns-starter + // Generate properties, auto-configuration for camel-core-starter createOtherModelConfigurationSource(pkg, model, "camel.cloud.dns.service-discovery", true); } @@ -302,8 +302,7 @@ public class SpringBootAutoConfigurationMojo extends AbstractMojo { int pos = model.getJavaType().lastIndexOf("."); String pkg = model.getJavaType().substring(0, pos) + ".springboot"; - // Generate properties, auto-configuration happens in - // camel-etcd-starter + // Generate properties, auto-configuration for camel-core-starter createOtherModelConfigurationSource(pkg, model, "camel.cloud.etcd.service-discovery", true); } @@ -328,8 +327,7 @@ public class SpringBootAutoConfigurationMojo extends AbstractMojo { int pos = model.getJavaType().lastIndexOf("."); String pkg = model.getJavaType().substring(0, pos) + ".springboot"; - // Generate properties, auto-configuration happens in - // camel-kubernetes-starter + // Generate properties, auto-configuration for camel-core-starter createOtherModelConfigurationSource(pkg, model, "camel.cloud.ribbon.load-balancer", true); } @@ -341,8 +339,7 @@ public class SpringBootAutoConfigurationMojo extends AbstractMojo { int pos = model.getJavaType().lastIndexOf("."); String pkg = model.getJavaType().substring(0, pos) + ".springboot"; - // Generate properties, auto-configuration happens in - // camel-kubernetes-starter + // Generate properties, auto-configuration for camel-core-starter createRestConfigurationSource(pkg, model, "camel.rest"); createRestModuleAutoConfigurationSource(pkg, model); } @@ -2178,7 +2175,7 @@ public class SpringBootAutoConfigurationMojo extends AbstractMojo { private void writeSourceIfChanged(String source, String fileName) throws MojoFailureException { - File target = new File(SpringBootHelper.starterSrcDir(baseDir, project.getArtifactId()), fileName); + File target = new File(SpringBootHelper.starterSrcDir(baseDir, getStarterArtifactId()), fileName); deleteFileOnMainArtifact(target); @@ -2204,7 +2201,7 @@ public class SpringBootAutoConfigurationMojo extends AbstractMojo { sb.append(lineToAdd); String fileName = "META-INF/spring.factories"; - File target = new File(SpringBootHelper.starterResourceDir(baseDir, project.getArtifactId()), fileName); + File target = new File(SpringBootHelper.starterResourceDir(baseDir, getStarterArtifactId()), fileName); deleteFileOnMainArtifact(target); @@ -2268,12 +2265,20 @@ public class SpringBootAutoConfigurationMojo extends AbstractMojo { } } + private String getStarterArtifactId() { + if ("camel-core-engine".equals(project.getArtifactId())) { + return "camel-core"; + } else { + return project.getArtifactId(); + } + } + private void deleteFileOnMainArtifact(File starterFile) { if (!DELETE_FILES_ON_MAIN_ARTIFACTS) { return; } - String relativePath = SpringBootHelper.starterDir(baseDir, project.getArtifactId()).toPath().relativize(starterFile.toPath()).toString(); + String relativePath = SpringBootHelper.starterDir(baseDir, getStarterArtifactId()).toPath().relativize(starterFile.toPath()).toString(); File mainArtifactFile = new File(baseDir, relativePath); if (mainArtifactFile.exists()) { boolean deleted = mainArtifactFile.delete();
