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