You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2020/02/16 15:55:26 UTC

[camel] 02/13: camel-core - Optimize to let type converter be eager created to avoid overhead in getTypeConverter method which is used a lot.

This is an automated email from the ASF dual-hosted git repository.

davsclaus pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git

commit 005921c72932a12ca6ca2149aaf7b782e4b5dd5b
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sat Feb 15 19:37:45 2020 +0100

    camel-core - Optimize to let type converter be eager created to avoid overhead in getTypeConverter method which is used a lot.
---
 .../java/org/apache/camel/cdi/CdiCamelContext.java | 11 +++++++++++
 .../org/apache/camel/cdi/CdiCamelExtension.java    | 11 +++++------
 .../camel/component/cxf/CxfEndpointTest.java       | 16 +++++++++++++--
 .../main/java/org/apache/camel/CamelContext.java   |  4 +++-
 .../camel/support/service/ServiceSupport.java      |  5 +++--
 .../camel/impl/engine/AbstractCamelContext.java    | 23 +++++++++++++++++++++-
 .../org/apache/camel/main/BaseMainSupport.java     |  3 +++
 7 files changed, 61 insertions(+), 12 deletions(-)

diff --git a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelContext.java b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelContext.java
index deca9f6..63a39b5 100644
--- a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelContext.java
+++ b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelContext.java
@@ -16,6 +16,7 @@
  */
 package org.apache.camel.cdi;
 
+import org.apache.camel.TypeConverter;
 import org.apache.camel.impl.DefaultCamelContext;
 
 /**
@@ -35,4 +36,14 @@ import org.apache.camel.impl.DefaultCamelContext;
 @Vetoed
 public class CdiCamelContext extends DefaultCamelContext {
 
+    @Override
+    protected boolean eagerCreateTypeConverter() {
+        // camel-cdi is complex so we cant optimize
+        return false;
+    }
+
+    @Override
+    public TypeConverter getTypeConverter() {
+        return getOrCreateTypeConverter();
+    }
 }
diff --git a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelExtension.java b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelExtension.java
index 4b4d7b2..ad64f8d 100644
--- a/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelExtension.java
+++ b/components/camel-cdi/src/main/java/org/apache/camel/cdi/CdiCamelExtension.java
@@ -65,7 +65,6 @@ import org.apache.camel.PropertyInject;
 import org.apache.camel.RoutesBuilder;
 import org.apache.camel.ServiceStatus;
 import org.apache.camel.TypeConverter;
-import org.apache.camel.impl.DefaultCamelContext;
 import org.apache.camel.model.Model;
 import org.apache.camel.model.RouteContainer;
 import org.apache.camel.spi.CamelEvent;
@@ -348,12 +347,12 @@ public class CdiCamelExtension implements Extension {
     }
 
     private SyntheticBean<?> camelContextBean(BeanManager manager, Class<?> beanClass, Annotation... qualifiers) {
-        SyntheticAnnotated annotated = new SyntheticAnnotated(DefaultCamelContext.class,
-            manager.createAnnotatedType(DefaultCamelContext.class).getTypeClosure(), beanClass, qualifiers);
-        return new SyntheticBean<>(manager, annotated, DefaultCamelContext.class,
+        SyntheticAnnotated annotated = new SyntheticAnnotated(CdiCamelContext.class,
+            manager.createAnnotatedType(CdiCamelContext.class).getTypeClosure(), beanClass, qualifiers);
+        return new SyntheticBean<>(manager, annotated, CdiCamelContext.class,
             environment.camelContextInjectionTarget(
-                new SyntheticInjectionTarget<>(DefaultCamelContext::new), annotated, manager, this), bean ->
-            "Default Camel context bean with qualifiers " + bean.getQualifiers());
+                new SyntheticInjectionTarget<>(CdiCamelContext::new), annotated, manager, this), bean ->
+            "CdiCamelContext bean with qualifiers " + bean.getQualifiers());
     }
 
     private void afterDeploymentValidation(@Observes AfterDeploymentValidation adv, BeanManager manager) {
diff --git a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/CxfEndpointTest.java b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/CxfEndpointTest.java
index 9826f89..7863092 100644
--- a/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/CxfEndpointTest.java
+++ b/components/camel-cxf/src/test/java/org/apache/camel/component/cxf/CxfEndpointTest.java
@@ -57,6 +57,8 @@ public class CxfEndpointTest extends Assert {
     @Test
     public void testSettingContinucationTimout() throws Exception {
         CamelContext context = new DefaultCamelContext();
+        context.start();
+
         CxfEndpoint endpoint = context.getEndpoint(routerEndpointURI + "&continuationTimeout=800000",
                 CxfEndpoint.class);
         assertEquals("Get a wrong continucationTimeout value", 800000, endpoint.getContinuationTimeout());
@@ -67,7 +69,11 @@ public class CxfEndpointTest extends Assert {
 
         ClassPathXmlApplicationContext ctx =
                 new ClassPathXmlApplicationContext(new String[]{"org/apache/camel/component/cxf/CxfEndpointBeans.xml"});
-        CxfComponent cxfComponent = new CxfComponent(new SpringCamelContext(ctx));
+
+        SpringCamelContext context = new SpringCamelContext(ctx);
+        context.start();
+
+        CxfComponent cxfComponent = new CxfComponent(context);
         CxfSpringEndpoint endpoint = (CxfSpringEndpoint)cxfComponent.createEndpoint("cxf://bean:serviceEndpoint");
 
         assertEquals("Got the wrong endpoint address", endpoint.getAddress(),
@@ -85,7 +91,11 @@ public class CxfEndpointTest extends Assert {
 
         ExtensionManagerBus newBus = (ExtensionManagerBus) BusFactory.newInstance().createBus();
         newBus.setId("newCXF");
-        CxfComponent cxfComponent = new CxfComponent(new DefaultCamelContext());
+
+        CamelContext context = new DefaultCamelContext();
+        context.start();
+
+        CxfComponent cxfComponent = new CxfComponent(context);
         CxfEndpoint endpoint = (CxfEndpoint)cxfComponent.createEndpoint(routerEndpointURI);
         endpoint.setBus(newBus);
         CamelCxfClientImpl client = (CamelCxfClientImpl)endpoint.createClient();
@@ -104,6 +114,8 @@ public class CxfEndpointTest extends Assert {
         Processor processor = mock(Processor.class);
         registry.bind("myConfigurer", configurer);
         CamelContext camelContext = new DefaultCamelContext(registry);
+        camelContext.start();
+
         CxfComponent cxfComponent = new CxfComponent(camelContext);
         CxfEndpoint endpoint = (CxfEndpoint)cxfComponent.createEndpoint(routerEndpointURI + "&cxfConfigurer=#myConfigurer");
 
diff --git a/core/camel-api/src/main/java/org/apache/camel/CamelContext.java b/core/camel-api/src/main/java/org/apache/camel/CamelContext.java
index eb9dd95..bb122b3 100644
--- a/core/camel-api/src/main/java/org/apache/camel/CamelContext.java
+++ b/core/camel-api/src/main/java/org/apache/camel/CamelContext.java
@@ -673,7 +673,9 @@ public interface CamelContext extends StatefulService, RuntimeConfiguration {
     //-----------------------------------------------------------------------
 
     /**
-     * Returns the type converter used to coerce types from one type to another
+     * Returns the type converter used to coerce types from one type to another.
+     * <p/>
+     * Notice that this {@link CamelContext} should be at least initialized before you can get the type converter.
      *
      * @return the converter
      */
diff --git a/core/camel-api/src/main/java/org/apache/camel/support/service/ServiceSupport.java b/core/camel-api/src/main/java/org/apache/camel/support/service/ServiceSupport.java
index e2f5735..7602c73 100644
--- a/core/camel-api/src/main/java/org/apache/camel/support/service/ServiceSupport.java
+++ b/core/camel-api/src/main/java/org/apache/camel/support/service/ServiceSupport.java
@@ -74,9 +74,10 @@ public abstract class ServiceSupport implements StatefulService {
 
     @Override
     public void init() {
-        if (status <= BUILDED) {
+        // allow to initialize again if failed
+        if (status <= BUILDED || status >= FAILED) {
             synchronized (lock) {
-                if (status <= BUILDED) {
+                if (status <= BUILDED || status >= FAILED) {
                     LOG.trace("Initializing service: {}", this);
                     try {
                         doInit();
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
index d15ad4a..58c1594 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/AbstractCamelContext.java
@@ -338,6 +338,14 @@ public abstract class AbstractCamelContext extends ServiceSupport implements Ext
         }
     }
 
+    /**
+     * Whether to eager create {@link TypeConverter} during initialization of CamelContext.
+     * This is enabled by default to optimize camel-core.
+     */
+    protected boolean eagerCreateTypeConverter() {
+        return true;
+    }
+
     @Override
     public void doInit() throws Exception {
         if (initialization != Initialization.Lazy) {
@@ -346,7 +354,9 @@ public abstract class AbstractCamelContext extends ServiceSupport implements Ext
         }
 
         // setup type converter eager as its highly in use and should not be lazy initialized
-        setTypeConverter(createTypeConverter());
+        if (eagerCreateTypeConverter()) {
+            getOrCreateTypeConverter();
+        }
 
         // setup management first since end users may use it to add event
         // notifiers using the management strategy before the CamelContext has been started
@@ -1705,6 +1715,17 @@ public abstract class AbstractCamelContext extends ServiceSupport implements Ext
         return typeConverter;
     }
 
+    protected TypeConverter getOrCreateTypeConverter() {
+        if (typeConverter == null) {
+            synchronized (lock) {
+                if (typeConverter == null) {
+                    setTypeConverter(createTypeConverter());
+                }
+            }
+        }
+        return typeConverter;
+    }
+
     public void setTypeConverter(TypeConverter typeConverter) {
         this.typeConverter = doAddService(typeConverter);
     }
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 cd5e5b6..3ac7b7b 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
@@ -574,6 +574,9 @@ public abstract class BaseMainSupport extends ServiceSupport {
     }
 
     protected void postProcessCamelContext(CamelContext camelContext) throws Exception {
+        // ensure camel is initialized
+        camelContext.init();
+
         configurePropertiesService(camelContext);
 
         // allow to do configuration before its started