You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by gn...@apache.org on 2020/03/06 13:51:24 UTC

[camel] 06/07: Add a configuration bit to remove model references at runtime (still experimental)

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

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

commit 2722540129533a859ecabe429f471edca5cd0d2c
Author: Guillaume Nodet <gn...@gmail.com>
AuthorDate: Fri Mar 6 14:20:10 2020 +0100

    Add a configuration bit to remove model references at runtime (still experimental)
---
 .../org/apache/camel/ExtendedCamelContext.java     | 17 ++++++++-
 .../camel/impl/engine/AbstractCamelContext.java    | 27 ++++++++++++---
 .../org/apache/camel/impl/engine/DefaultRoute.java |  5 +--
 .../camel/processor/channel/DefaultChannel.java    |  4 +--
 .../org/apache/camel/impl/DefaultCamelContext.java | 40 +++++++++++++++++++++-
 .../org/apache/camel/reifier/RouteReifier.java     |  2 --
 6 files changed, 80 insertions(+), 15 deletions(-)

diff --git a/core/camel-api/src/main/java/org/apache/camel/ExtendedCamelContext.java b/core/camel-api/src/main/java/org/apache/camel/ExtendedCamelContext.java
index 9326154..2fde5db 100644
--- a/core/camel-api/src/main/java/org/apache/camel/ExtendedCamelContext.java
+++ b/core/camel-api/src/main/java/org/apache/camel/ExtendedCamelContext.java
@@ -519,7 +519,7 @@ public interface ExtendedCamelContext extends CamelContext {
     void setConfigurerResolver(ConfigurerResolver configurerResolver);
 
     /**
-     * Whether its allowed to add new routes after Camel has been started.
+     * Whether it's allowed to add new routes after Camel has been started.
      * This is enabled by default.
      * Setting this to false allows Camel to do some internal optimizations to reduce memory footprint.
      * <p/>
@@ -538,4 +538,19 @@ public interface ExtendedCamelContext extends CamelContext {
      */
     boolean isAllowAddingNewRoutes();
 
+    /**
+     * Camel context can be configured to remove all references to the model definitions
+     * after it has been started.  It can be used in addition to the {@link #setAllowAddingNewRoutes(boolean)}
+     * method to reduce the footprint.
+     *
+     * @see #isAllowAddingNewRoutes()
+     * @param clearModelReferences
+     */
+    @Experimental
+    void setClearModelReferences(boolean clearModelReferences);
+
+    /**
+     * If references to the model are removed when Camel is started or not.
+     */
+    boolean isClearModelReferences();
 }
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 05c367f..ed9bba3 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
@@ -226,6 +226,7 @@ public abstract class AbstractCamelContext extends ServiceSupport
     private Boolean allowUseOriginalMessage = Boolean.FALSE;
     private Boolean caseInsensitiveHeaders = Boolean.TRUE;
     private boolean allowAddingNewRoutes = true;
+    private boolean clearModelReferences = false;
     private Long delay;
     private ErrorHandlerFactory errorHandlerFactory;
     private Map<String, String> globalOptions = new HashMap<>();
@@ -1975,6 +1976,14 @@ public abstract class AbstractCamelContext extends ServiceSupport
         this.allowAddingNewRoutes = allowAddingNewRoutes;
     }
 
+    public boolean isClearModelReferences() {
+        return clearModelReferences;
+    }
+
+    public void setClearModelReferences(boolean clearModelReferences) {
+        this.clearModelReferences = clearModelReferences;
+    }
+
     @Override
     public Registry getRegistry() {
         if (registry == null) {
@@ -2527,6 +2536,16 @@ public abstract class AbstractCamelContext extends ServiceSupport
                 }
             }
 
+            if (!isAllowAddingNewRoutes()) {
+                LOG.info("Adding new routes after CamelContext has started is not allowed");
+                disallowAddingNewRoutes();
+            }
+
+            if (isClearModelReferences()) {
+                LOG.info("Clearing model references");
+                clearModelReferences();
+            }
+
             if (LOG.isInfoEnabled()) {
                 // count how many routes are actually started
                 int started = 0;
@@ -2537,11 +2556,6 @@ public abstract class AbstractCamelContext extends ServiceSupport
                     }
                 }
 
-                if (!isAllowAddingNewRoutes()) {
-                    LOG.info("Adding new routes after CamelContext has started is not allowed");
-                    disallowAddingNewRoutes();
-                }
-
                 final Collection<Route> controlledRoutes = getRouteController().getControlledRoutes();
                 if (controlledRoutes.isEmpty()) {
                     LOG.info("Total {} routes, of which {} are started", getRoutes().size(), started);
@@ -2577,6 +2591,9 @@ public abstract class AbstractCamelContext extends ServiceSupport
         ReifierStrategy.clearReifiers();
     }
 
+    protected void clearModelReferences() {
+    }
+
     @Override
     public void stop() {
         try (MDCHelper mdcHelper = new MDCHelper()) {
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultRoute.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultRoute.java
index f7348e4..24c6076 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultRoute.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultRoute.java
@@ -641,10 +641,7 @@ public class DefaultRoute extends ServiceSupport implements Route {
         return consumer instanceof Suspendable && consumer instanceof SuspendableService;
     }
 
-    public void initialized() {
-    }
-
-    public void cleanRouteReference() {
+    public void clearModelReferences() {
         route = null;
     }
 }
diff --git a/core/camel-base/src/main/java/org/apache/camel/processor/channel/DefaultChannel.java b/core/camel-base/src/main/java/org/apache/camel/processor/channel/DefaultChannel.java
index 9fdc506..8dc622c 100644
--- a/core/camel-base/src/main/java/org/apache/camel/processor/channel/DefaultChannel.java
+++ b/core/camel-base/src/main/java/org/apache/camel/processor/channel/DefaultChannel.java
@@ -125,8 +125,8 @@ public class DefaultChannel extends CamelInternalProcessor implements Channel {
         return definition;
     }
 
-    public void setDefinition(NamedNode definition) {
-        this.definition = definition;
+    public void clearModelReferences() {
+        this.definition = null;
     }
 
     @Override
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultCamelContext.java b/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
index da6b96b..88ccd82 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/impl/DefaultCamelContext.java
@@ -16,13 +16,20 @@
  */
 package org.apache.camel.impl;
 
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 import java.util.function.Function;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.Navigate;
+import org.apache.camel.Processor;
+import org.apache.camel.Route;
 import org.apache.camel.health.HealthCheckRegistry;
+import org.apache.camel.impl.engine.DefaultRoute;
 import org.apache.camel.impl.engine.RouteService;
 import org.apache.camel.impl.engine.SimpleCamelContext;
 import org.apache.camel.model.DataFormatDefinition;
@@ -36,6 +43,7 @@ import org.apache.camel.model.cloud.ServiceCallConfigurationDefinition;
 import org.apache.camel.model.rest.RestDefinition;
 import org.apache.camel.model.transformer.TransformerDefinition;
 import org.apache.camel.model.validator.ValidatorDefinition;
+import org.apache.camel.processor.channel.DefaultChannel;
 import org.apache.camel.reifier.dataformat.DataFormatReifier;
 import org.apache.camel.spi.BeanRepository;
 import org.apache.camel.spi.DataFormat;
@@ -53,7 +61,7 @@ public class DefaultCamelContext extends SimpleCamelContext implements ModelCame
 
     private static final Logger LOG = LoggerFactory.getLogger(DefaultCamelContext.class);
 
-    private final Model model = new DefaultModel(this);
+    private Model model = new DefaultModel(this);
 
     /**
      * Creates the {@link ModelCamelContext} using
@@ -319,4 +327,34 @@ public class DefaultCamelContext extends SimpleCamelContext implements ModelCame
         return new DefaultExecutorServiceManager(this);
     }
 
+    @Override
+    protected void clearModelReferences() {
+        model = (Model) Proxy.newProxyInstance(getClass().getClassLoader(), new Class[]{ Model.class }, new InvocationHandler() {
+            @Override
+            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
+                throw new UnsupportedOperationException("Model invocations are not supported at runtime");
+            }
+        });
+        for (Route route : getRoutes()) {
+            clearModelReferences(route);
+        }
+    }
+
+    private void clearModelReferences(Route r) {
+        if (r instanceof DefaultRoute) {
+            ((DefaultRoute) r).clearModelReferences();
+        }
+        clearModelReferences(r.navigate());
+    }
+
+    private void clearModelReferences(Navigate<Processor> nav) {
+        for (Processor processor : nav.next()) {
+            if (processor instanceof DefaultChannel) {
+                ((DefaultChannel) processor).clearModelReferences();
+            }
+            if (processor instanceof Navigate) {
+                clearModelReferences((Navigate<Processor>) processor);
+            }
+        }
+    }
 }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/RouteReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/RouteReifier.java
index 19220e4..43f18f9 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/RouteReifier.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/RouteReifier.java
@@ -489,8 +489,6 @@ public class RouteReifier extends ProcessorReifier<RouteDefinition> {
             }
         }
 
-        route.initialized();
-
         return route;
     }