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"); + } + } + +}