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 2021/03/14 10:56:42 UTC

[camel] 05/05: CAMEL-16353: camel-core - Force eager classloading in build phase

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 8c2939c45f67cc84c36e8ec2973eadda95477155
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Sun Mar 14 11:44:50 2021 +0100

    CAMEL-16353: camel-core - Force eager classloading in build phase
---
 .../java/org/apache/camel/spi/UnitOfWorkFactory.java    |  5 +++++
 .../impl/engine/DefaultExchangeFactoryManager.java      | 17 +++++++++++++++++
 .../org/apache/camel/impl/engine/DefaultUnitOfWork.java |  4 ++++
 .../camel/impl/engine/DefaultUnitOfWorkFactory.java     |  6 ++++++
 .../apache/camel/impl/engine/PooledExchangeFactory.java |  1 +
 .../java/org/apache/camel/support/ExchangeHelper.java   |  5 +++++
 .../java/org/apache/camel/support/UnitOfWorkHelper.java |  4 ++++
 7 files changed, 42 insertions(+)

diff --git a/core/camel-api/src/main/java/org/apache/camel/spi/UnitOfWorkFactory.java b/core/camel-api/src/main/java/org/apache/camel/spi/UnitOfWorkFactory.java
index e3b5715..ab76ae1 100644
--- a/core/camel-api/src/main/java/org/apache/camel/spi/UnitOfWorkFactory.java
+++ b/core/camel-api/src/main/java/org/apache/camel/spi/UnitOfWorkFactory.java
@@ -19,6 +19,7 @@ package org.apache.camel.spi;
 import org.apache.camel.AfterPropertiesConfigured;
 import org.apache.camel.CamelContext;
 import org.apache.camel.Exchange;
+import org.slf4j.Logger;
 
 /**
  * Factory to create {@link org.apache.camel.spi.UnitOfWork}.
@@ -37,4 +38,8 @@ public interface UnitOfWorkFactory extends AfterPropertiesConfigured {
     default void afterPropertiesConfigured(CamelContext camelContext) {
         // noop
     }
+
+    default void warmup(Logger log) {
+        // noop
+    }
 }
diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultExchangeFactoryManager.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultExchangeFactoryManager.java
index eb3aa1e..1568966 100644
--- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultExchangeFactoryManager.java
+++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultExchangeFactoryManager.java
@@ -24,12 +24,19 @@ import java.util.concurrent.ConcurrentHashMap;
 import org.apache.camel.CamelContext;
 import org.apache.camel.CamelContextAware;
 import org.apache.camel.Consumer;
+import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.spi.ExchangeFactory;
 import org.apache.camel.spi.ExchangeFactoryManager;
+import org.apache.camel.support.ExchangeHelper;
+import org.apache.camel.support.UnitOfWorkHelper;
 import org.apache.camel.support.service.ServiceSupport;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 public class DefaultExchangeFactoryManager extends ServiceSupport implements ExchangeFactoryManager, CamelContextAware {
 
+    private static final Logger LOG = LoggerFactory.getLogger(DefaultExchangeFactoryManager.class);
+
     private final Map<Consumer, ExchangeFactory> factories = new ConcurrentHashMap<>();
     private final UtilizationStatistics statistics = new UtilizationStatistics();
     private CamelContext camelContext;
@@ -166,6 +173,16 @@ public class DefaultExchangeFactoryManager extends ServiceSupport implements Exc
     }
 
     @Override
+    protected void doBuild() throws Exception {
+        super.doBuild();
+        // force to create and load the class during build time so the JVM does not
+        // load the class on first exchange to be created
+        ExchangeHelper.warmup(LOG);
+        UnitOfWorkHelper.warmup(LOG);
+        camelContext.adapt(ExtendedCamelContext.class).getUnitOfWorkFactory().warmup(LOG);
+    }
+
+    @Override
     protected void doShutdown() throws Exception {
         factories.clear();
     }
diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultUnitOfWork.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultUnitOfWork.java
index c80c515..f8f143a 100644
--- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultUnitOfWork.java
+++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultUnitOfWork.java
@@ -84,6 +84,10 @@ public class DefaultUnitOfWork implements UnitOfWork {
         doOnPrepare(exchange);
     }
 
+    static void warmup(Logger log) {
+        log.trace("Warming up DefaultUnitOfWork");
+    }
+
     UnitOfWork newInstance(Exchange exchange) {
         return new DefaultUnitOfWork(exchange, inflightRepository, allowUseOriginalMessage, useBreadcrumb);
     }
diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultUnitOfWorkFactory.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultUnitOfWorkFactory.java
index dd91419..78a36eb 100644
--- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultUnitOfWorkFactory.java
+++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/DefaultUnitOfWorkFactory.java
@@ -21,6 +21,7 @@ import org.apache.camel.Exchange;
 import org.apache.camel.spi.InflightRepository;
 import org.apache.camel.spi.UnitOfWork;
 import org.apache.camel.spi.UnitOfWorkFactory;
+import org.slf4j.Logger;
 
 /**
  * Default {@link org.apache.camel.spi.UnitOfWorkFactory}
@@ -34,6 +35,11 @@ public class DefaultUnitOfWorkFactory implements UnitOfWorkFactory {
     private boolean useBreadcrumb;
 
     @Override
+    public void warmup(Logger log) {
+        DefaultUnitOfWork.warmup(log);
+    }
+
+    @Override
     public UnitOfWork createUnitOfWork(Exchange exchange) {
         UnitOfWork answer;
         if (usedMDCLogging) {
diff --git a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/PooledExchangeFactory.java b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/PooledExchangeFactory.java
index 4eb0a7b..44e9190 100644
--- a/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/PooledExchangeFactory.java
+++ b/core/camel-base-engine/src/main/java/org/apache/camel/impl/engine/PooledExchangeFactory.java
@@ -48,6 +48,7 @@ public final class PooledExchangeFactory extends PrototypeExchangeFactory {
         // load the class on first exchange to be created
         DefaultPooledExchange dummy = new DefaultPooledExchange(camelContext);
         LOG.trace("Warming up PooledExchangeFactory loaded class: {}", dummy.getClass().getName());
+
     }
 
     @Override
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/ExchangeHelper.java b/core/camel-support/src/main/java/org/apache/camel/support/ExchangeHelper.java
index 42d8408..7006e7e 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/ExchangeHelper.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/ExchangeHelper.java
@@ -56,6 +56,7 @@ import org.apache.camel.util.IOHelper;
 import org.apache.camel.util.ObjectHelper;
 import org.apache.camel.util.Scanner;
 import org.apache.camel.util.StringHelper;
+import org.slf4j.Logger;
 
 /**
  * Some helper methods for working with {@link Exchange} objects
@@ -68,6 +69,10 @@ public final class ExchangeHelper {
     private ExchangeHelper() {
     }
 
+    public static void warmup(Logger log) {
+        log.trace("Warming up ExchangeHelper");
+    }
+
     /**
      * Extracts the Exchange.BINDING of the given type or null if not present
      *
diff --git a/core/camel-support/src/main/java/org/apache/camel/support/UnitOfWorkHelper.java b/core/camel-support/src/main/java/org/apache/camel/support/UnitOfWorkHelper.java
index 38bca85..4d99365 100644
--- a/core/camel-support/src/main/java/org/apache/camel/support/UnitOfWorkHelper.java
+++ b/core/camel-support/src/main/java/org/apache/camel/support/UnitOfWorkHelper.java
@@ -38,6 +38,10 @@ public final class UnitOfWorkHelper {
     private UnitOfWorkHelper() {
     }
 
+    public static void warmup(Logger log) {
+        log.trace("Warming up UnitOfWorkHelper");
+    }
+
     /**
      * Done and stop the {@link UnitOfWork}.
      *