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 <claus.ib...@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}. *