CAMEL-8113: Optimize type converter registry.
Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/7f5301b7 Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/7f5301b7 Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/7f5301b7 Branch: refs/heads/master Commit: 7f5301b75bc30acfe7c37d12225f385b2a2e9c3b Parents: a707e51 Author: Claus Ibsen <davscl...@apache.org> Authored: Thu Dec 18 17:12:40 2014 +0100 Committer: Claus Ibsen <davscl...@apache.org> Committed: Thu Dec 18 21:27:57 2014 +0100 ---------------------------------------------------------------------- .../apache/camel/component/bean/BeanHolder.java | 7 +++++++ .../camel/component/bean/BeanProcessor.java | 18 +++++++++++++----- .../camel/component/bean/ConstantBeanHolder.java | 12 +++++++++--- .../component/bean/ConstantTypeBeanHolder.java | 4 ++++ .../apache/camel/component/bean/RegistryBean.java | 4 ++++ ...TypeConverterRegistryStatsPerformanceTest.java | 8 ++++++-- 6 files changed, 43 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/7f5301b7/camel-core/src/main/java/org/apache/camel/component/bean/BeanHolder.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/component/bean/BeanHolder.java b/camel-core/src/main/java/org/apache/camel/component/bean/BeanHolder.java index 7f26df3..5cb9dd4 100644 --- a/camel-core/src/main/java/org/apache/camel/component/bean/BeanHolder.java +++ b/camel-core/src/main/java/org/apache/camel/component/bean/BeanHolder.java @@ -41,6 +41,13 @@ public interface BeanHolder { Processor getProcessor(); /** + * Whether a {@link Processor} is supported by this bean holder. + * + * @return <tt>true</tt> if the holder can supporting using a processor, <tt>false</tt> otherwise + */ + boolean supportProcessor(); + + /** * Gets bean info for the bean. */ BeanInfo getBeanInfo(); http://git-wip-us.apache.org/repos/asf/camel/blob/7f5301b7/camel-core/src/main/java/org/apache/camel/component/bean/BeanProcessor.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/component/bean/BeanProcessor.java b/camel-core/src/main/java/org/apache/camel/component/bean/BeanProcessor.java index 055ebfb..bf8ddbe 100644 --- a/camel-core/src/main/java/org/apache/camel/component/bean/BeanProcessor.java +++ b/camel-core/src/main/java/org/apache/camel/component/bean/BeanProcessor.java @@ -37,6 +37,7 @@ import org.slf4j.LoggerFactory; public class BeanProcessor extends ServiceSupport implements AsyncProcessor { private static final Logger LOG = LoggerFactory.getLogger(BeanProcessor.class); + private Processor processor; private boolean multiParameterArray; private String method; private BeanHolder beanHolder; @@ -90,8 +91,11 @@ public class BeanProcessor extends ServiceSupport implements AsyncProcessor { // do we have a custom adapter for this POJO to a Processor // but only do this if allowed if (allowProcessor(explicitMethodName, beanInfo)) { - // so if there is a custom type converter for the bean to processor - Processor processor = exchange.getContext().getTypeConverter().tryConvertTo(Processor.class, exchange, bean); + Processor processor = getProcessor(); + if (processor == null) { + // so if there is a custom type converter for the bean to processor + processor = exchange.getContext().getTypeConverter().convertTo(Processor.class, exchange, bean); + } if (processor != null) { LOG.trace("Using a custom adapter as bean invocation: {}", processor); try { @@ -168,7 +172,7 @@ public class BeanProcessor extends ServiceSupport implements AsyncProcessor { } protected Processor getProcessor() { - return beanHolder.getProcessor(); + return processor; } public Object getBean() { @@ -214,11 +218,15 @@ public class BeanProcessor extends ServiceSupport implements AsyncProcessor { // Implementation methods //------------------------------------------------------------------------- protected void doStart() throws Exception { - ServiceHelper.startService(getProcessor()); + // optimize to only get (create) a processor if really needed + if (beanHolder.supportProcessor() && allowProcessor(method, beanHolder.getBeanInfo())) { + processor = beanHolder.getProcessor(); + ServiceHelper.startService(processor); + } } protected void doStop() throws Exception { - ServiceHelper.stopService(getProcessor()); + ServiceHelper.stopService(processor); } private boolean allowProcessor(String explicitMethodName, BeanInfo info) { http://git-wip-us.apache.org/repos/asf/camel/blob/7f5301b7/camel-core/src/main/java/org/apache/camel/component/bean/ConstantBeanHolder.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/component/bean/ConstantBeanHolder.java b/camel-core/src/main/java/org/apache/camel/component/bean/ConstantBeanHolder.java index 2cac840..d2cbe1c 100644 --- a/camel-core/src/main/java/org/apache/camel/component/bean/ConstantBeanHolder.java +++ b/camel-core/src/main/java/org/apache/camel/component/bean/ConstantBeanHolder.java @@ -29,7 +29,7 @@ import org.apache.camel.util.ObjectHelper; public class ConstantBeanHolder implements BeanHolder { private final Object bean; private final BeanInfo beanInfo; - private final Processor processor; + private Processor processor; public ConstantBeanHolder(Object bean, BeanInfo beanInfo) { ObjectHelper.notNull(bean, "bean"); @@ -37,7 +37,6 @@ public class ConstantBeanHolder implements BeanHolder { this.bean = bean; this.beanInfo = beanInfo; - this.processor = CamelContextHelper.convertTo(beanInfo.getCamelContext(), Processor.class, bean); } public ConstantBeanHolder(Object bean, CamelContext context) { @@ -59,7 +58,14 @@ public class ConstantBeanHolder implements BeanHolder { } public Processor getProcessor() { - return processor; + if (this.processor == null) { + this.processor = CamelContextHelper.convertTo(beanInfo.getCamelContext(), Processor.class, bean); + } + return this.processor; + } + + public boolean supportProcessor() { + return true; } public BeanInfo getBeanInfo() { http://git-wip-us.apache.org/repos/asf/camel/blob/7f5301b7/camel-core/src/main/java/org/apache/camel/component/bean/ConstantTypeBeanHolder.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/component/bean/ConstantTypeBeanHolder.java b/camel-core/src/main/java/org/apache/camel/component/bean/ConstantTypeBeanHolder.java index b0b0694..8c9dc55 100644 --- a/camel-core/src/main/java/org/apache/camel/component/bean/ConstantTypeBeanHolder.java +++ b/camel-core/src/main/java/org/apache/camel/component/bean/ConstantTypeBeanHolder.java @@ -68,6 +68,10 @@ public class ConstantTypeBeanHolder implements BeanTypeHolder { return null; } + public boolean supportProcessor() { + return false; + } + public BeanInfo getBeanInfo() { return beanInfo; } http://git-wip-us.apache.org/repos/asf/camel/blob/7f5301b7/camel-core/src/main/java/org/apache/camel/component/bean/RegistryBean.java ---------------------------------------------------------------------- diff --git a/camel-core/src/main/java/org/apache/camel/component/bean/RegistryBean.java b/camel-core/src/main/java/org/apache/camel/component/bean/RegistryBean.java index 76a2f81..5f645f9 100644 --- a/camel-core/src/main/java/org/apache/camel/component/bean/RegistryBean.java +++ b/camel-core/src/main/java/org/apache/camel/component/bean/RegistryBean.java @@ -93,6 +93,10 @@ public class RegistryBean implements BeanHolder { return null; } + public boolean supportProcessor() { + return false; + } + public BeanInfo getBeanInfo() { if (beanInfo == null) { Object bean = getBean(); http://git-wip-us.apache.org/repos/asf/camel/blob/7f5301b7/camel-core/src/test/java/org/apache/camel/processor/TypeConverterRegistryStatsPerformanceTest.java ---------------------------------------------------------------------- diff --git a/camel-core/src/test/java/org/apache/camel/processor/TypeConverterRegistryStatsPerformanceTest.java b/camel-core/src/test/java/org/apache/camel/processor/TypeConverterRegistryStatsPerformanceTest.java index 077f0f2..ab3d170 100644 --- a/camel-core/src/test/java/org/apache/camel/processor/TypeConverterRegistryStatsPerformanceTest.java +++ b/camel-core/src/test/java/org/apache/camel/processor/TypeConverterRegistryStatsPerformanceTest.java @@ -64,8 +64,8 @@ public class TypeConverterRegistryStatsPerformanceTest extends ContextTestSuppor public void configure() { from("direct:start") .transform().method(TypeConverterRegistryStatsPerformanceTest.class, "transformMe") -// .bean(TypeConverterRegistryStatsPerformanceTest.class, "transformMe") - .to("mock:result"); + .bean(TypeConverterRegistryStatsPerformanceTest.class, "transformMeAlso") + .to("mock:result"); } }; } @@ -73,4 +73,8 @@ public class TypeConverterRegistryStatsPerformanceTest extends ContextTestSuppor public String transformMe(String in) { return "Hello " + in; } + + public String transformMeAlso(String in) { + return "Bye " + in; + } }