Optimise - Allow to turn off loading type converters from classpath scanning.


Project: http://git-wip-us.apache.org/repos/asf/camel/repo
Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/4084c03d
Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/4084c03d
Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/4084c03d

Branch: refs/heads/master
Commit: 4084c03d17b1f67e4f88935b97fff13c6504cbbf
Parents: 67a60e1
Author: Claus Ibsen <davscl...@apache.org>
Authored: Wed Jun 21 18:30:00 2017 +0200
Committer: Claus Ibsen <davscl...@apache.org>
Committed: Thu Jun 22 10:27:34 2017 +0200

----------------------------------------------------------------------
 .../java/org/apache/camel/CamelContext.java     |  20 +++
 .../apache/camel/impl/DefaultCamelContext.java  |  11 +-
 .../impl/converter/DefaultTypeConverter.java    |  23 +++-
 .../org/apache/camel/ContextTestSupport.java    |   9 ++
 .../apache/camel/converter/ConverterTest.java   |   2 +-
 .../camel/converter/FallbackPromoteTest.java    |   5 +
 .../InstanceFallbackConverterTest.java          |   5 +
 .../org/apache/camel/converter/JaxpTest.java    |   2 +-
 .../converter/StaticFallbackConverterTest.java  |   5 +
 .../camel/converter/StringSourceTest.java       |   2 +-
 .../camel/converter/TypeConverterAwareTest.java |   5 +
 .../blueprint/CamelContextFactoryBean.java      |  11 ++
 .../xml/AbstractCamelContextFactoryBean.java    |   6 +
 .../AbstractCamelContextFactoryBeanTest.java    |   2 +-
 .../spring/boot/CamelAutoConfiguration.java     |   1 +
 .../boot/CamelConfigurationProperties.java      |  17 +++
 .../camel/spring/CamelContextFactoryBean.java   |  22 +++-
 tests/camel-jmh/pom.xml                         |   5 +
 .../camel/itest/jmh/LoadTypeConvertersTest.java | 123 +++++++++++++++++++
 19 files changed, 265 insertions(+), 11 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/camel/blob/4084c03d/camel-core/src/main/java/org/apache/camel/CamelContext.java
----------------------------------------------------------------------
diff --git a/camel-core/src/main/java/org/apache/camel/CamelContext.java 
b/camel-core/src/main/java/org/apache/camel/CamelContext.java
index ed5081d..6568121 100644
--- a/camel-core/src/main/java/org/apache/camel/CamelContext.java
+++ b/camel-core/src/main/java/org/apache/camel/CamelContext.java
@@ -1714,6 +1714,26 @@ public interface CamelContext extends 
SuspendableService, RuntimeConfiguration {
     void setLazyLoadTypeConverters(Boolean lazyLoadTypeConverters);
 
     /**
+     * Sets whether to load custom type converters by scanning classpath.
+     * This can be turned off if you are only using Camel components
+     * that does not provide type converters which is needed at runtime.
+     * In such situations setting this option to false, can speedup starting
+     * Camel.
+     */
+    Boolean isLoadTypeConverters();
+
+    /**
+     * Sets whether to load custom type converters by scanning classpath.
+     * This can be turned off if you are only using Camel components
+     * that does not provide type converters which is needed at runtime.
+     * In such situations setting this option to false, can speedup starting
+     * Camel.
+     *
+     * @param loadTypeConverters whether to load custom type converters.
+     */
+    void setLoadTypeConverters(Boolean loadTypeConverters);
+
+    /**
      * Whether or not type converter statistics is enabled.
      * <p/>
      * By default the type converter utilization statistics is disabled.

http://git-wip-us.apache.org/repos/asf/camel/blob/4084c03d/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java 
b/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
index 44419e4..4cb46f4 100644
--- a/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
+++ b/camel-core/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
@@ -252,6 +252,7 @@ public class DefaultCamelContext extends ServiceSupport 
implements ModelCamelCon
     private Boolean handleFault = Boolean.FALSE;
     private Boolean disableJMX = Boolean.FALSE;
     private Boolean lazyLoadTypeConverters = Boolean.FALSE;
+    private Boolean loadTypeConverters = Boolean.TRUE;
     private Boolean typeConverterStatisticsEnabled = Boolean.FALSE;
     private Boolean useMDCLogging = Boolean.FALSE;
     private Boolean useDataType = Boolean.FALSE;
@@ -3952,7 +3953,7 @@ public class DefaultCamelContext extends ServiceSupport 
implements ModelCamelCon
         if (isLazyLoadTypeConverters()) {
             answer = new LazyLoadingTypeConverter(packageScanClassResolver, 
getInjector(), getDefaultFactoryFinder());
         } else {
-            answer = new DefaultTypeConverter(packageScanClassResolver, 
getInjector(), getDefaultFactoryFinder());
+            answer = new DefaultTypeConverter(packageScanClassResolver, 
getInjector(), getDefaultFactoryFinder(), isLoadTypeConverters());
         }
         answer.setCamelContext(this);
         setTypeConverterRegistry(answer);
@@ -4236,6 +4237,14 @@ public class DefaultCamelContext extends ServiceSupport 
implements ModelCamelCon
         this.lazyLoadTypeConverters = lazyLoadTypeConverters;
     }
 
+    public Boolean isLoadTypeConverters() {
+        return loadTypeConverters != null && loadTypeConverters;
+    }
+
+    public void setLoadTypeConverters(Boolean loadTypeConverters) {
+        this.loadTypeConverters = loadTypeConverters;
+    }
+
     public Boolean isTypeConverterStatisticsEnabled() {
         return typeConverterStatisticsEnabled != null && 
typeConverterStatisticsEnabled;
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/4084c03d/camel-core/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java
 
b/camel-core/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java
index 5b75c2d..b486f92 100644
--- 
a/camel-core/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java
+++ 
b/camel-core/src/main/java/org/apache/camel/impl/converter/DefaultTypeConverter.java
@@ -30,8 +30,12 @@ import org.apache.camel.spi.PackageScanClassResolver;
  */
 public class DefaultTypeConverter extends BaseTypeConverterRegistry {
 
-    public DefaultTypeConverter(PackageScanClassResolver resolver, Injector 
injector, FactoryFinder factoryFinder) {
+    private final boolean loadTypeConverters;
+
+    public DefaultTypeConverter(PackageScanClassResolver resolver, Injector 
injector,
+                                FactoryFinder factoryFinder, boolean 
loadTypeConverters) {
         super(resolver, injector, factoryFinder);
+        this.loadTypeConverters = loadTypeConverters;
     }
 
     @Override
@@ -48,12 +52,21 @@ public class DefaultTypeConverter extends 
BaseTypeConverterRegistry {
     @Override
     protected void doStart() throws Exception {
         super.doStart();
-        // load type converters up front
+        // core type converters is always loaded which does not use any 
classpath scanning
+        // and therefore is fast
+
         loadCoreTypeConverters();
-        loadTypeConverters();
+        if (loadTypeConverters) {
+            int core = typeMappings.size();
+            // load type converters up front
+            loadTypeConverters();
+            int additional = typeMappings.size() - core;
 
-        // report how many type converters we have loaded
-        log.info("Loaded {} type converters", typeMappings.size());
+            if (additional > 0) {
+                // report how many type converters we have loaded
+                log.info("Type converters loaded (core: {}, classpath: {})", 
core, additional);
+            }
+        }
     }
 
 }

http://git-wip-us.apache.org/repos/asf/camel/blob/4084c03d/camel-core/src/test/java/org/apache/camel/ContextTestSupport.java
----------------------------------------------------------------------
diff --git a/camel-core/src/test/java/org/apache/camel/ContextTestSupport.java 
b/camel-core/src/test/java/org/apache/camel/ContextTestSupport.java
index 6e256bd..e4544ce 100644
--- a/camel-core/src/test/java/org/apache/camel/ContextTestSupport.java
+++ b/camel-core/src/test/java/org/apache/camel/ContextTestSupport.java
@@ -154,6 +154,14 @@ public abstract class ContextTestSupport extends 
TestSupport {
         return false;
     }
 
+    /**
+     * Whether to load additional type converters by scanning the classpath.
+     * This should only be enabled for tests that uses custom type converters.
+     */
+    protected boolean isLoadTypeConverters() {
+        return false;
+    }
+
     protected void stopCamelContext() throws Exception {
         if (camelContextService != null) {
             camelContextService.stop();
@@ -183,6 +191,7 @@ public abstract class ContextTestSupport extends 
TestSupport {
     protected CamelContext createCamelContext() throws Exception {
         CamelContext context = new DefaultCamelContext(createRegistry());
         context.setLazyLoadTypeConverters(isLazyLoadingTypeConverter());
+        context.setLoadTypeConverters(isLoadTypeConverters());
         return context;
     }
 

http://git-wip-us.apache.org/repos/asf/camel/blob/4084c03d/camel-core/src/test/java/org/apache/camel/converter/ConverterTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/converter/ConverterTest.java 
b/camel-core/src/test/java/org/apache/camel/converter/ConverterTest.java
index 9a294cb..0f2fab5 100644
--- a/camel-core/src/test/java/org/apache/camel/converter/ConverterTest.java
+++ b/camel-core/src/test/java/org/apache/camel/converter/ConverterTest.java
@@ -52,7 +52,7 @@ public class ConverterTest extends TestCase {
     private static final Logger LOG = 
LoggerFactory.getLogger(ConverterTest.class);
 
     protected TypeConverter converter = new DefaultTypeConverter(new 
DefaultPackageScanClassResolver(),
-            new ReflectionInjector(), new 
DefaultFactoryFinderResolver().resolveDefaultFactoryFinder(new 
DefaultClassResolver()));
+            new ReflectionInjector(), new 
DefaultFactoryFinderResolver().resolveDefaultFactoryFinder(new 
DefaultClassResolver()), true);
 
     public static class IntegerPropertyEditor extends PropertyEditorSupport {
         public void setAsText(String text) throws IllegalArgumentException {

http://git-wip-us.apache.org/repos/asf/camel/blob/4084c03d/camel-core/src/test/java/org/apache/camel/converter/FallbackPromoteTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/converter/FallbackPromoteTest.java 
b/camel-core/src/test/java/org/apache/camel/converter/FallbackPromoteTest.java
index 2002c47..a6f9e6d 100644
--- 
a/camel-core/src/test/java/org/apache/camel/converter/FallbackPromoteTest.java
+++ 
b/camel-core/src/test/java/org/apache/camel/converter/FallbackPromoteTest.java
@@ -24,6 +24,11 @@ import org.apache.camel.TypeConverter;
  */
 public class FallbackPromoteTest extends ContextTestSupport {
 
+    @Override
+    protected boolean isLoadTypeConverters() {
+        return true;
+    }
+
     public void testFallbackPromote() throws Exception {
         MyCoolBean cool = new MyCoolBean();
         cool.setCool("Camel rocks");

http://git-wip-us.apache.org/repos/asf/camel/blob/4084c03d/camel-core/src/test/java/org/apache/camel/converter/InstanceFallbackConverterTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/converter/InstanceFallbackConverterTest.java
 
b/camel-core/src/test/java/org/apache/camel/converter/InstanceFallbackConverterTest.java
index 1bcaddd..e1558d9 100644
--- 
a/camel-core/src/test/java/org/apache/camel/converter/InstanceFallbackConverterTest.java
+++ 
b/camel-core/src/test/java/org/apache/camel/converter/InstanceFallbackConverterTest.java
@@ -31,6 +31,11 @@ import org.apache.camel.impl.DefaultExchange;
  */
 public class InstanceFallbackConverterTest extends ContextTestSupport {
 
+    @Override
+    protected boolean isLoadTypeConverters() {
+        return true;
+    }
+
     public void testInstanceFallbackConverter() throws Exception {
         Exchange exchange = new DefaultExchange(context);
         Currency cur = Currency.getInstance(Locale.US);

http://git-wip-us.apache.org/repos/asf/camel/blob/4084c03d/camel-core/src/test/java/org/apache/camel/converter/JaxpTest.java
----------------------------------------------------------------------
diff --git a/camel-core/src/test/java/org/apache/camel/converter/JaxpTest.java 
b/camel-core/src/test/java/org/apache/camel/converter/JaxpTest.java
index 0638b39..3bcc01b 100644
--- a/camel-core/src/test/java/org/apache/camel/converter/JaxpTest.java
+++ b/camel-core/src/test/java/org/apache/camel/converter/JaxpTest.java
@@ -42,7 +42,7 @@ import org.slf4j.LoggerFactory;
 public class JaxpTest extends TestCase {
     private static final Logger LOG = LoggerFactory.getLogger(JaxpTest.class);
     protected TypeConverter converter = new DefaultTypeConverter(new 
DefaultPackageScanClassResolver(),
-            new ReflectionInjector(), new 
DefaultFactoryFinderResolver().resolveDefaultFactoryFinder(new 
DefaultClassResolver()));
+            new ReflectionInjector(), new 
DefaultFactoryFinderResolver().resolveDefaultFactoryFinder(new 
DefaultClassResolver()), false);
 
     @Override
     protected void setUp() throws Exception {

http://git-wip-us.apache.org/repos/asf/camel/blob/4084c03d/camel-core/src/test/java/org/apache/camel/converter/StaticFallbackConverterTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/converter/StaticFallbackConverterTest.java
 
b/camel-core/src/test/java/org/apache/camel/converter/StaticFallbackConverterTest.java
index 6c80f12..178a4ca 100644
--- 
a/camel-core/src/test/java/org/apache/camel/converter/StaticFallbackConverterTest.java
+++ 
b/camel-core/src/test/java/org/apache/camel/converter/StaticFallbackConverterTest.java
@@ -30,6 +30,11 @@ import org.apache.camel.impl.DefaultExchange;
  */
 public class StaticFallbackConverterTest extends ContextTestSupport {
 
+    @Override
+    protected boolean isLoadTypeConverters() {
+        return true;
+    }
+
     public void testStaticFallbackConverter() throws Exception {
         Exchange exchange = new DefaultExchange(context);
         TimeZone tz = TimeZone.getDefault();

http://git-wip-us.apache.org/repos/asf/camel/blob/4084c03d/camel-core/src/test/java/org/apache/camel/converter/StringSourceTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/converter/StringSourceTest.java 
b/camel-core/src/test/java/org/apache/camel/converter/StringSourceTest.java
index 1e310ea..00badb5 100644
--- a/camel-core/src/test/java/org/apache/camel/converter/StringSourceTest.java
+++ b/camel-core/src/test/java/org/apache/camel/converter/StringSourceTest.java
@@ -37,7 +37,7 @@ import org.apache.camel.util.ServiceHelper;
  */
 public class StringSourceTest extends TestCase {
     protected TypeConverter converter = new DefaultTypeConverter(new 
DefaultPackageScanClassResolver(),
-            new ReflectionInjector(), new 
DefaultFactoryFinderResolver().resolveDefaultFactoryFinder(new 
DefaultClassResolver()));
+            new ReflectionInjector(), new 
DefaultFactoryFinderResolver().resolveDefaultFactoryFinder(new 
DefaultClassResolver()), false);
     protected String expectedBody = "<hello>world!</hello>";
 
     @Override

http://git-wip-us.apache.org/repos/asf/camel/blob/4084c03d/camel-core/src/test/java/org/apache/camel/converter/TypeConverterAwareTest.java
----------------------------------------------------------------------
diff --git 
a/camel-core/src/test/java/org/apache/camel/converter/TypeConverterAwareTest.java
 
b/camel-core/src/test/java/org/apache/camel/converter/TypeConverterAwareTest.java
index 51ec1cc..fa029b4 100644
--- 
a/camel-core/src/test/java/org/apache/camel/converter/TypeConverterAwareTest.java
+++ 
b/camel-core/src/test/java/org/apache/camel/converter/TypeConverterAwareTest.java
@@ -23,6 +23,11 @@ import org.apache.camel.ContextTestSupport;
  */
 public class TypeConverterAwareTest extends ContextTestSupport {
 
+    @Override
+    protected boolean isLoadTypeConverters() {
+        return true;
+    }
+
     public void testPurchaseOrderConverter() throws Exception {
         byte[] data = "##START##AKC4433   179       3##END##".getBytes();
         PurchaseOrder order = 
context.getTypeConverter().convertTo(PurchaseOrder.class, data);

http://git-wip-us.apache.org/repos/asf/camel/blob/4084c03d/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java
----------------------------------------------------------------------
diff --git 
a/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java
 
b/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java
index 3b870c5..4655717 100644
--- 
a/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java
+++ 
b/components/camel-blueprint/src/main/java/org/apache/camel/blueprint/CamelContextFactoryBean.java
@@ -130,6 +130,8 @@ public class CamelContextFactoryBean extends 
AbstractCamelContextFactoryBean<Blu
     @Deprecated
     private Boolean lazyLoadTypeConverters;
     @XmlAttribute
+    private Boolean loadTypeConverters;
+    @XmlAttribute
     private Boolean typeConverterStatisticsEnabled;
     @XmlAttribute
     private TypeConverterExists typeConverterExists;
@@ -444,6 +446,15 @@ public class CamelContextFactoryBean extends 
AbstractCamelContextFactoryBean<Blu
         this.lazyLoadTypeConverters = lazyLoadTypeConverters;
     }
 
+    @Override
+    public Boolean getLoadTypeConverters() {
+        return loadTypeConverters;
+    }
+
+    public void setLoadTypeConverters(Boolean loadTypeConverters) {
+        this.loadTypeConverters = loadTypeConverters;
+    }
+
     public Boolean getTypeConverterStatisticsEnabled() {
         return typeConverterStatisticsEnabled;
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/4084c03d/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
----------------------------------------------------------------------
diff --git 
a/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
 
b/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
index fe24c55..a9d0f98 100644
--- 
a/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
+++ 
b/components/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
@@ -433,6 +433,9 @@ public abstract class AbstractCamelContextFactoryBean<T 
extends ModelCamelContex
     
     @SuppressWarnings("deprecation")
     protected void initLazyLoadTypeConverters() {
+        if (getLoadTypeConverters() != null) {
+            getContext().setLoadTypeConverters(getLoadTypeConverters());
+        }
         if (getLazyLoadTypeConverters() != null) {
             
getContext().setLazyLoadTypeConverters(getLazyLoadTypeConverters());
         } else if (System.getProperty(LAZY_LOAD_TYPE_CONVERTERS) != null) {
@@ -715,6 +718,7 @@ public abstract class AbstractCamelContextFactoryBean<T 
extends ModelCamelContex
 
     @Deprecated
     public abstract PropertiesDefinition getProperties();
+
     public abstract GlobalOptionsDefinition getGlobalOptions();
 
     public abstract String[] getPackages();
@@ -765,6 +769,8 @@ public abstract class AbstractCamelContextFactoryBean<T 
extends ModelCamelContex
     @Deprecated
     public abstract Boolean getLazyLoadTypeConverters();
 
+    public abstract Boolean getLoadTypeConverters();
+
     public abstract Boolean getTypeConverterStatisticsEnabled();
 
     public abstract LoggingLevel getTypeConverterExistsLoggingLevel();

http://git-wip-us.apache.org/repos/asf/camel/blob/4084c03d/components/camel-core-xml/src/test/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBeanTest.java
----------------------------------------------------------------------
diff --git 
a/components/camel-core-xml/src/test/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBeanTest.java
 
b/components/camel-core-xml/src/test/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBeanTest.java
index c374773..bcccfca 100644
--- 
a/components/camel-core-xml/src/test/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBeanTest.java
+++ 
b/components/camel-core-xml/src/test/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBeanTest.java
@@ -60,7 +60,7 @@ public class AbstractCamelContextFactoryBeanTest {
 
     TypeConverter typeConverter = new DefaultTypeConverter(new 
DefaultPackageScanClassResolver(),
         new ReflectionInjector(),
-        new DefaultFactoryFinder(new DefaultClassResolver(), 
"META-INF/services/org/apache/camel/"));
+        new DefaultFactoryFinder(new DefaultClassResolver(), 
"META-INF/services/org/apache/camel/"), false);
 
     // properties that should return value that can be converted to boolean
     Set<String> valuesThatReturnBoolean = new 
HashSet<>(asList("{{getStreamCache}}", "{{getTrace}}",

http://git-wip-us.apache.org/repos/asf/camel/blob/4084c03d/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/CamelAutoConfiguration.java
----------------------------------------------------------------------
diff --git 
a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/CamelAutoConfiguration.java
 
b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/CamelAutoConfiguration.java
index e3588df..e232c12 100644
--- 
a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/CamelAutoConfiguration.java
+++ 
b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/CamelAutoConfiguration.java
@@ -158,6 +158,7 @@ public class CamelAutoConfiguration {
         camelContext.setUseBreadcrumb(config.isUseBreadcrumb());
         camelContext.setUseDataType(config.isUseDataType());
         camelContext.setUseMDCLogging(config.isUseMDCLogging());
+        camelContext.setLoadTypeConverters(config.isLoadTypeConverters());
 
         if (camelContext.getManagementStrategy().getManagementAgent() != null) 
{
             
camelContext.getManagementStrategy().getManagementAgent().setEndpointRuntimeStatisticsEnabled(config.isEndpointRuntimeStatisticsEnabled());

http://git-wip-us.apache.org/repos/asf/camel/blob/4084c03d/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/CamelConfigurationProperties.java
----------------------------------------------------------------------
diff --git 
a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/CamelConfigurationProperties.java
 
b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/CamelConfigurationProperties.java
index 9e87e35..aff7785 100644
--- 
a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/CamelConfigurationProperties.java
+++ 
b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/CamelConfigurationProperties.java
@@ -87,6 +87,15 @@ public class CamelConfigurationProperties {
     private boolean typeConversion = true;
 
     /**
+     * Sets whether to load custom type converters by scanning classpath.
+     * This can be turned off if you are only using Camel components
+     * that does not provide type converters which is needed at runtime.
+     * In such situations setting this option to false, can speedup starting
+     * Camel.
+     */
+    private boolean loadTypeConverters = true;
+
+    /**
      * Directory to scan for adding additional XML routes.
      * You can turn this off by setting the value to false.
      */
@@ -492,6 +501,14 @@ public class CamelConfigurationProperties {
         this.typeConversion = typeConversion;
     }
 
+    public boolean isLoadTypeConverters() {
+        return loadTypeConverters;
+    }
+
+    public void setLoadTypeConverters(boolean loadTypeConverters) {
+        this.loadTypeConverters = loadTypeConverters;
+    }
+
     public String getXmlRoutes() {
         return xmlRoutes;
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/4084c03d/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java
----------------------------------------------------------------------
diff --git 
a/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java
 
b/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java
index fd47daf..331563a 100644
--- 
a/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java
+++ 
b/components/camel-spring/src/main/java/org/apache/camel/spring/CamelContextFactoryBean.java
@@ -143,8 +143,10 @@ public class CamelContextFactoryBean extends 
AbstractCamelContextFactoryBean<Spr
     @XmlAttribute @Metadata(defaultValue = "CompleteCurrentTaskOnly")
     private ShutdownRunningTask shutdownRunningTask;
     @XmlAttribute
-    @Deprecated
+    @Deprecated  @Metadata(defaultValue = "false")
     private Boolean lazyLoadTypeConverters;
+    @XmlAttribute @Metadata(defaultValue = "true")
+    private Boolean loadTypeConverters;
     @XmlAttribute
     private Boolean typeConverterStatisticsEnabled;
     @XmlAttribute @Metadata(defaultValue = "Override")
@@ -881,6 +883,24 @@ public class CamelContextFactoryBean extends 
AbstractCamelContextFactoryBean<Spr
         this.lazyLoadTypeConverters = lazyLoadTypeConverters;
     }
 
+    @Override
+    public Boolean getLoadTypeConverters() {
+        return loadTypeConverters;
+    }
+
+    /**
+     * Sets whether to load custom type converters by scanning classpath.
+     * This can be turned off if you are only using Camel components
+     * that does not provide type converters which is needed at runtime.
+     * In such situations setting this option to false, can speedup starting
+     * Camel.
+     *
+     * @param loadTypeConverters whether to load custom type converters.
+     */
+    public void setLoadTypeConverters(Boolean loadTypeConverters) {
+        this.loadTypeConverters = loadTypeConverters;
+    }
+
     public Boolean getTypeConverterStatisticsEnabled() {
         return typeConverterStatisticsEnabled;
     }

http://git-wip-us.apache.org/repos/asf/camel/blob/4084c03d/tests/camel-jmh/pom.xml
----------------------------------------------------------------------
diff --git a/tests/camel-jmh/pom.xml b/tests/camel-jmh/pom.xml
index c4d6833..c1514cc 100644
--- a/tests/camel-jmh/pom.xml
+++ b/tests/camel-jmh/pom.xml
@@ -57,6 +57,11 @@
       <artifactId>camel-headersmap</artifactId>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.apache.camel</groupId>
+      <artifactId>camel-netty4</artifactId>
+      <scope>test</scope>
+    </dependency>
 
     <dependency>
       <groupId>junit</groupId>

http://git-wip-us.apache.org/repos/asf/camel/blob/4084c03d/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/LoadTypeConvertersTest.java
----------------------------------------------------------------------
diff --git 
a/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/LoadTypeConvertersTest.java
 
b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/LoadTypeConvertersTest.java
new file mode 100644
index 0000000..0ee698b
--- /dev/null
+++ 
b/tests/camel-jmh/src/test/java/org/apache/camel/itest/jmh/LoadTypeConvertersTest.java
@@ -0,0 +1,123 @@
+/**
+ * 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.itest.jmh;
+
+import java.util.concurrent.TimeUnit;
+
+import org.apache.camel.CamelContext;
+import org.apache.camel.impl.DefaultCamelContext;
+import org.junit.Test;
+import org.openjdk.jmh.annotations.Benchmark;
+import org.openjdk.jmh.annotations.Level;
+import org.openjdk.jmh.annotations.Measurement;
+import org.openjdk.jmh.annotations.Mode;
+import org.openjdk.jmh.annotations.Scope;
+import org.openjdk.jmh.annotations.Setup;
+import org.openjdk.jmh.annotations.State;
+import org.openjdk.jmh.annotations.TearDown;
+import org.openjdk.jmh.infra.Blackhole;
+import org.openjdk.jmh.runner.Runner;
+import org.openjdk.jmh.runner.options.Options;
+import org.openjdk.jmh.runner.options.OptionsBuilder;
+import org.openjdk.jmh.runner.options.TimeValue;
+
+/**
+ * Tests start/stop {@link org.apache.camel.CamelContext}
+ */
+public class LoadTypeConvertersTest {
+
+    @Test
+    public void launchBenchmark() throws Exception {
+        Options opt = new OptionsBuilder()
+            // Specify which benchmarks to run.
+            // You can be more specific if you'd like to run only one 
benchmark per test.
+            .include(this.getClass().getName() + ".*")
+            // Set the following options as needed
+            .mode(Mode.All)
+            .timeUnit(TimeUnit.MICROSECONDS)
+            .warmupTime(TimeValue.seconds(1))
+            .warmupIterations(2)
+            .measurementTime(TimeValue.seconds(1))
+            .measurementIterations(2)
+            .threads(2)
+            .forks(1)
+            .shouldFailOnError(true)
+            .shouldDoGC(true)
+            .build();
+
+        new Runner(opt).run();
+    }
+
+    // The JMH samples are the best documentation for how to use it
+    // 
http://hg.openjdk.java.net/code-tools/jmh/file/tip/jmh-samples/src/main/java/org/openjdk/jmh/samples/
+    @State(Scope.Thread)
+    public static class BenchmarkState {
+        CamelContext camel;
+
+        @Setup(Level.Trial)
+        public void initialize() {
+            camel = new DefaultCamelContext();
+        }
+
+        @TearDown(Level.Trial)
+        public void close() {
+            try {
+                camel.stop();
+            } catch (Exception e) {
+                // ignore
+            }
+        }
+    }
+
+    @Benchmark
+    @Measurement(batchSize = 1000)
+    public void load(BenchmarkState state, Blackhole bh) {
+        int size = 0;
+        try {
+            state.camel.start();
+
+            size = state.camel.getTypeConverterRegistry().size();
+            bh.consume(size);
+        } catch (Exception e) {
+            // ignore
+        }
+
+        if (size < 200) {
+            throw new IllegalArgumentException("Should have 200+ type 
converters loaded");
+        }
+    }
+
+    @Benchmark
+    @Measurement(batchSize = 1000)
+    public void notLoad(BenchmarkState state, Blackhole bh) {
+        int size = 0;
+        try {
+            state.camel.setLoadTypeConverters(false);
+            state.camel.start();
+
+            size = state.camel.getTypeConverterRegistry().size();
+            bh.consume(size);
+        } catch (Exception e) {
+            // ignore
+        }
+
+        if (size > 200) {
+            throw new IllegalArgumentException("Should not load additional 
type converters from classpath");
+        }
+    }
+
+}

Reply via email to