This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch route-collector in repository https://gitbox.apache.org/repos/asf/camel.git
commit 12b90dca63edf48de9f7a94569b889eb814e5ee5 Author: Claus Ibsen <claus.ib...@gmail.com> AuthorDate: Thu Oct 17 21:08:49 2019 +0200 CAMEL-14050: camel-main - Add logic for automatic RouteBuilder class detection ala camel-spring-boot has --- .../org/apache/camel/main/BaseMainSupport.java | 14 +++++++++++++ .../camel/main/MainConfigurationProperties.java | 24 ++++++++++++++++++++++ .../camel-main-configuration-metadata.json | 6 ++++++ .../main/MainRoutesCollectorPackageScanTest.java | 10 +-------- 4 files changed, 45 insertions(+), 9 deletions(-) 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 c3816a5..ee06fdd 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 @@ -28,6 +28,7 @@ import java.util.Locale; import java.util.Map; import java.util.Objects; import java.util.Properties; +import java.util.Set; import java.util.concurrent.CountDownLatch; import java.util.concurrent.atomic.AtomicBoolean; @@ -423,6 +424,19 @@ public abstract class BaseMainSupport extends ServiceSupport { } } } + + if (mainConfigurationProperties.getPackageScanRouteBuilders() != null) { + String[] pkgs = mainConfigurationProperties.getPackageScanRouteBuilders().split(","); + Set<Class<?>> set = camelContext.getExtension(ExtendedCamelContext.class).getPackageScanClassResolver().findImplementations(RoutesBuilder.class, pkgs); + for (Class<?> routeClazz : set) { + Object builder = camelContext.getInjector().newInstance(routeClazz); + if (builder instanceof RouteBuilder) { + getRoutesBuilders().add((RouteBuilder) builder); + } else { + LOG.warn("Class {} is not a RouteBuilder class", routeClazz); + } + } + } } protected void loadConfigurations(CamelContext camelContext) throws Exception { diff --git a/core/camel-main/src/main/java/org/apache/camel/main/MainConfigurationProperties.java b/core/camel-main/src/main/java/org/apache/camel/main/MainConfigurationProperties.java index ffdca5d..28ab76d 100644 --- a/core/camel-main/src/main/java/org/apache/camel/main/MainConfigurationProperties.java +++ b/core/camel-main/src/main/java/org/apache/camel/main/MainConfigurationProperties.java @@ -30,6 +30,7 @@ public class MainConfigurationProperties extends DefaultConfigurationProperties< private boolean autowireComponentPropertiesAllowPrivateSetter = true; private int durationHitExitCode; private boolean hangupInterceptorEnabled = true; + private String packageScanRouteBuilders; // extended configuration private final HystrixConfigurationProperties hystrixConfigurationProperties = new HystrixConfigurationProperties(this); @@ -178,6 +179,19 @@ public class MainConfigurationProperties extends DefaultConfigurationProperties< this.hangupInterceptorEnabled = hangupInterceptorEnabled; } + public String getPackageScanRouteBuilders() { + return packageScanRouteBuilders; + } + + /** + * Sets package names for scanning for {@link org.apache.camel.builder.RouteBuilder} classes as candidates to be included. + * If you are using Spring Boot then its instead recommended to use Spring Boots component scanning and annotate your route builder + * classes with `@Component`. In other words only use this for Camel Main in standalone mode. + */ + public void setPackageScanRouteBuilders(String packageScanRouteBuilders) { + this.packageScanRouteBuilders = packageScanRouteBuilders; + } + public int getDurationHitExitCode() { return durationHitExitCode; } @@ -301,4 +315,14 @@ public class MainConfigurationProperties extends DefaultConfigurationProperties< return this; } + /** + * Sets package names for scanning for {@link org.apache.camel.builder.RouteBuilder} classes as candidates to be included. + * If you are using Spring Boot then its instead recommended to use Spring Boots component scanning and annotate your route builder + * classes with `@Component`. In other words only use this for Camel Main in standalone mode. + */ + public MainConfigurationProperties withPackageScanRouteBuilders(String packageScanRouteBuilders) { + this.packageScanRouteBuilders = packageScanRouteBuilders; + return this; + } + } diff --git a/core/camel-main/src/main/resources/META-INF/camel-main-configuration-metadata.json b/core/camel-main/src/main/resources/META-INF/camel-main-configuration-metadata.json index 67616b3..bd3d045 100644 --- a/core/camel-main/src/main/resources/META-INF/camel-main-configuration-metadata.json +++ b/core/camel-main/src/main/resources/META-INF/camel-main-configuration-metadata.json @@ -230,6 +230,12 @@ "description":"Sets the name of the CamelContext." }, { + "name":"camel.main.package-scan-route-builders", + "type":"java.lang.String", + "sourceType":"org.apache.camel.main.MainConfigurationProperties", + "description":"Sets package names for scanning for org.apache.camel.builder.RouteBuilder classes as candidates to be included. If you are using Spring Boot then its instead recommended to use Spring Boots component scanning and annotate your route builder classes with Component. In other words only use this for Camel Main in standalone mode." + }, + { "name":"camel.main.producer-template-cache-size", "type":"int", "sourceType":"org.apache.camel.main.DefaultConfigurationProperties", diff --git a/core/camel-main/src/test/java/org/apache/camel/main/MainRoutesCollectorPackageScanTest.java b/core/camel-main/src/test/java/org/apache/camel/main/MainRoutesCollectorPackageScanTest.java index 208a5e5..06a4b1d 100644 --- a/core/camel-main/src/test/java/org/apache/camel/main/MainRoutesCollectorPackageScanTest.java +++ b/core/camel-main/src/test/java/org/apache/camel/main/MainRoutesCollectorPackageScanTest.java @@ -16,13 +16,8 @@ */ package org.apache.camel.main; -import java.util.Set; - import org.apache.camel.CamelContext; -import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; -import org.apache.camel.impl.engine.DefaultPackageScanClassResolver; -import org.apache.camel.spi.PackageScanClassResolver; import org.junit.Assert; import org.junit.Test; @@ -31,10 +26,7 @@ public class MainRoutesCollectorPackageScanTest extends Assert { @Test public void testMainRoutesCollector() throws Exception { Main main = new Main(); - - PackageScanClassResolver resolver = new DefaultPackageScanClassResolver(); - Set<Class<?>> set = resolver.findImplementations(RouteBuilder.class, "org.apache.camel.main.scan"); - set.forEach(main::addRouteBuilder); + main.configure().withPackageScanRouteBuilders("org.apache.camel.main.scan"); main.start(); CamelContext camelContext = main.getCamelContext();