This is an automated email from the ASF dual-hosted git repository. lburgazzoli pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/master by this push: new b58ec82 core: DefaultRoutesLoader to cache RoutesBuilderLoader locally instead of globally to the registry b58ec82 is described below commit b58ec827833254913a6a511ede8cbb977a6c533c Author: Luca Burgazzoli <lburgazz...@gmail.com> AuthorDate: Thu Mar 4 18:44:26 2021 +0100 core: DefaultRoutesLoader to cache RoutesBuilderLoader locally instead of globally to the registry --- .../camel/impl/engine/DefaultRoutesLoader.java | 63 +++++++++++++++++----- 1 file changed, 49 insertions(+), 14 deletions(-) diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRoutesLoader.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRoutesLoader.java index b7edaae..86c959a 100644 --- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRoutesLoader.java +++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultRoutesLoader.java @@ -19,8 +19,11 @@ package org.apache.camel.impl.engine; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import org.apache.camel.CamelContext; +import org.apache.camel.CamelContextAware; import org.apache.camel.ExtendedCamelContext; import org.apache.camel.RoutesBuilder; import org.apache.camel.spi.FactoryFinder; @@ -28,26 +31,41 @@ import org.apache.camel.spi.Resource; import org.apache.camel.spi.RoutesBuilderLoader; import org.apache.camel.spi.RoutesLoader; import org.apache.camel.support.ResolverHelper; +import org.apache.camel.support.service.ServiceHelper; +import org.apache.camel.support.service.ServiceSupport; import org.apache.camel.util.FileUtil; import org.apache.camel.util.ObjectHelper; /** * Default {@link RoutesLoader}. */ -public class DefaultRoutesLoader implements RoutesLoader { +public class DefaultRoutesLoader extends ServiceSupport implements RoutesLoader { /** * Prefix to use for looking up existing {@link RoutesLoader} from the {@link org.apache.camel.spi.Registry}. */ public static final String ROUTES_LOADER_KEY_PREFIX = "routes-builder-loader-"; + private final Map<String, RoutesBuilderLoader> loaders; + private CamelContext camelContext; public DefaultRoutesLoader() { + this(null); } public DefaultRoutesLoader(CamelContext camelContext) { this.camelContext = camelContext; + this.loaders = new ConcurrentHashMap<>(); + } + + @Override + public void doStop() throws Exception { + super.doStop(); + + ServiceHelper.stopService(loaders.values()); + + loaders.clear(); } @Override @@ -73,7 +91,13 @@ public class DefaultRoutesLoader implements RoutesLoader { "Unable to determine file extension for resource: " + resource.getLocation()); } - answer.add(getRoutesLoader(extension).loadRoutesBuilder(resource)); + RoutesBuilderLoader loader = getRoutesLoader(extension); + if (loader == null) { + throw new IllegalArgumentException( + "Cannot find RoutesBuilderLoader in classpath supporting file extension: " + extension); + } + + answer.add(loader.loadRoutesBuilder(resource)); } return answer; @@ -87,22 +111,33 @@ public class DefaultRoutesLoader implements RoutesLoader { * @throws IllegalArgumentException if no {@link RoutesBuilderLoader} can be found for the given file extension */ private RoutesBuilderLoader getRoutesLoader(String extension) throws Exception { - RoutesBuilderLoader answer = getCamelContext().getRegistry().lookupByNameAndType(ROUTES_LOADER_KEY_PREFIX + extension, + RoutesBuilderLoader answer = getCamelContext().getRegistry().lookupByNameAndType( + ROUTES_LOADER_KEY_PREFIX + extension, RoutesBuilderLoader.class); if (answer == null) { - final ExtendedCamelContext ecc = getCamelContext().adapt(ExtendedCamelContext.class); - final FactoryFinder finder = ecc.getBootstrapFactoryFinder(RoutesBuilderLoader.FACTORY_PATH); + answer = loaders.computeIfAbsent(extension, this::resolveService); + } - answer = ResolverHelper.resolveService(ecc, finder, extension, RoutesBuilderLoader.class).orElse(null); - if (answer == null) { - throw new IllegalArgumentException( - "Cannot find RoutesBuilderLoader in classpath supporting file extension: " + extension); - } - // add as service so its lifecycle is managed - getCamelContext().addService(answer); - // store loader so we can reuse it - getCamelContext().getRegistry().bind(ROUTES_LOADER_KEY_PREFIX + extension, answer); + return answer; + } + + /** + * Looks up a {@link RoutesBuilderLoader} for the given extension with factory finder. + * + * @param extension the file extension for which a loader should be find. + * @return a {@link RoutesBuilderLoader} or null if none found + */ + private RoutesBuilderLoader resolveService(String extension) { + final ExtendedCamelContext ecc = getCamelContext().adapt(ExtendedCamelContext.class); + final FactoryFinder finder = ecc.getBootstrapFactoryFinder(RoutesBuilderLoader.FACTORY_PATH); + + RoutesBuilderLoader answer + = ResolverHelper.resolveService(ecc, finder, extension, RoutesBuilderLoader.class).orElse(null); + + if (answer != null) { + CamelContextAware.trySetCamelContext(answer, getCamelContext()); + ServiceHelper.startService(answer); } return answer;