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;
}