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/01/02 15:17:12 UTC

[camel] 01/02: CAMEL-14349: camel-core - Transformer and Validator registry should be on-demand

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 972bbda5e4c883249933bc1fd5f24af9fb1d800c
Author: Claus Ibsen <cl...@gmail.com>
AuthorDate: Thu Jan 2 16:15:46 2020 +0100

    CAMEL-14349: camel-core - Transformer and Validator registry should be on-demand
---
 .../main/java/org/apache/camel/CamelContext.java   |  4 +--
 .../camel/impl/engine/AbstractCamelContext.java    | 40 +++++++++++++++------
 .../impl/engine/DefaultTransformerRegistry.java    | 10 ++++++
 .../impl/engine/DefaultValidatorRegistry.java      | 12 +++++++
 .../org/apache/camel/builder/RouteBuilder.java     | 30 ++++++++++++++++
 .../apache/camel/builder/TransformerBuilder.java   |  3 ++
 .../org/apache/camel/builder/ValidatorBuilder.java |  3 ++
 .../camel/impl/AbstractModelCamelContext.java      | 26 +++-----------
 .../transformer/CustomTransformeReifier.java       |  5 ++-
 .../transformer/EndpointTransformeReifier.java     |  2 +-
 .../reifier/transformer/TransformerReifier.java    |  4 +--
 .../reifier/validator/CustomValidatorReifier.java  |  5 ++-
 .../validator/EndpointValidatorReifier.java        |  2 +-
 .../validator/PredicateValidatorReifier.java       |  2 +-
 .../camel/reifier/validator/ValidatorReifier.java  |  4 +--
 .../core/xml/AbstractCamelContextFactoryBean.java  | 41 ++++++++++++++++++++++
 .../camel/impl/MultipleLifecycleStrategyTest.java  |  4 +--
 .../management/mbean/ModelCamelContextHelper.java  |  1 +
 .../management/ManagedNonManagedServiceTest.java   |  2 +-
 ...edProducerRouteAddRemoveRegisterAlwaysTest.java |  2 +-
 .../management/ManagedRouteAddRemoveTest.java      |  2 +-
 21 files changed, 151 insertions(+), 53 deletions(-)

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 27537f9..ec962d6 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
@@ -910,7 +910,7 @@ public interface CamelContext extends StatefulService, RuntimeConfiguration {
      * Gets the {@link org.apache.camel.spi.TransformerRegistry}
      * @return the TransformerRegistry
      */
-    TransformerRegistry<? extends ValueHolder<String>> getTransformerRegistry();
+    TransformerRegistry getTransformerRegistry();
 
     /**
      * Resolve a validator given from/to data type.
@@ -924,7 +924,7 @@ public interface CamelContext extends StatefulService, RuntimeConfiguration {
      * Gets the {@link org.apache.camel.spi.ValidatorRegistry}
      * @return the ValidatorRegistry
      */
-    ValidatorRegistry<? extends ValueHolder<String>> getValidatorRegistry();
+    ValidatorRegistry getValidatorRegistry();
 
     /**
      * Sets global options that can be referenced in the camel context
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 a732d95..eddaf50 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
@@ -2524,10 +2524,6 @@ public abstract class AbstractCamelContext extends ServiceSupport implements Ext
         // re-create endpoint registry as the cache size limit may be set after the constructor of this instance was called.
         // and we needed to create endpoints up-front as it may be accessed before this context is started
         endpoints = doAddService(createEndpointRegistry(endpoints));
-        // Initialize declarative transformer registry
-        transformerRegistry = doAddService(createTransformerRegistry());
-        // Initialize declarative validator registry
-        validatorRegistry = doAddService(createValidatorRegistry());
 
         // optimised to not include runtimeEndpointRegistry unless startServices
         // its enabled or JMX statistics is in extended mode
@@ -3983,29 +3979,51 @@ public abstract class AbstractCamelContext extends ServiceSupport implements Ext
 
     @Override
     public Transformer resolveTransformer(String scheme) {
-        return transformerRegistry.resolveTransformer(new TransformerKey(scheme));
+        return getTransformerRegistry().resolveTransformer(new TransformerKey(scheme));
     }
 
     @Override
     public Transformer resolveTransformer(DataType from, DataType to) {
-        return transformerRegistry.resolveTransformer(new TransformerKey(from, to));
+        return getTransformerRegistry().resolveTransformer(new TransformerKey(from, to));
     }
 
     @Override
-    public TransformerRegistry<TransformerKey> getTransformerRegistry() {
+    public TransformerRegistry getTransformerRegistry() {
+        if (transformerRegistry == null) {
+            synchronized (lock) {
+                if (transformerRegistry == null) {
+                    setTransformerRegistry(createTransformerRegistry());
+                }
+            }
+        }
         return transformerRegistry;
     }
 
+    public void setTransformerRegistry(TransformerRegistry transformerRegistry) {
+        this.transformerRegistry = doAddService(transformerRegistry);
+    }
+
     @Override
     public Validator resolveValidator(DataType type) {
-        return validatorRegistry.resolveValidator(new ValidatorKey(type));
+        return getValidatorRegistry().resolveValidator(new ValidatorKey(type));
     }
 
     @Override
-    public ValidatorRegistry<ValidatorKey> getValidatorRegistry() {
+    public ValidatorRegistry getValidatorRegistry() {
+        if (validatorRegistry == null) {
+            synchronized (lock) {
+                if (validatorRegistry == null) {
+                    setValidatorRegistry(createValidatorRegistry());
+                }
+            }
+        }
         return validatorRegistry;
     }
 
+    public void setValidatorRegistry(ValidatorRegistry validatorRegistry) {
+        this.validatorRegistry = doAddService(validatorRegistry);
+    }
+
     @Override
     public void setSSLContextParameters(SSLContextParameters sslContextParameters) {
         this.sslContextParameters = sslContextParameters;
@@ -4200,8 +4218,8 @@ public abstract class AbstractCamelContext extends ServiceSupport implements Ext
 
     protected abstract EndpointRegistry<EndpointKey> createEndpointRegistry(Map<EndpointKey, Endpoint> endpoints);
 
-    protected abstract TransformerRegistry<TransformerKey> createTransformerRegistry() throws Exception;
+    protected abstract TransformerRegistry<TransformerKey> createTransformerRegistry();
 
-    protected abstract ValidatorRegistry<ValidatorKey> createValidatorRegistry() throws Exception;
+    protected abstract ValidatorRegistry<ValidatorKey> createValidatorRegistry();
 
 }
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultTransformerRegistry.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultTransformerRegistry.java
index c4530b1..eb1a12c 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultTransformerRegistry.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultTransformerRegistry.java
@@ -21,10 +21,13 @@ import java.util.concurrent.ConcurrentHashMap;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.impl.transformer.TransformerKey;
+import org.apache.camel.impl.validator.ValidatorKey;
 import org.apache.camel.spi.DataType;
 import org.apache.camel.spi.Transformer;
 import org.apache.camel.spi.TransformerRegistry;
+import org.apache.camel.spi.Validator;
 import org.apache.camel.support.CamelContextHelper;
+import org.apache.camel.support.service.ServiceHelper;
 import org.apache.camel.util.ObjectHelper;
 
 /**
@@ -82,6 +85,13 @@ public class DefaultTransformerRegistry extends AbstractDynamicRegistry<Transfor
     }
 
     @Override
+    public Transformer put(TransformerKey key, Transformer transformer) {
+        // ensure transformer is started before its being used
+        ServiceHelper.startService(transformer);
+        return super.put(key, transformer);
+    }
+
+    @Override
     public boolean isStatic(String scheme) {
         return isStatic(new TransformerKey(scheme));
     }
diff --git a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultValidatorRegistry.java b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultValidatorRegistry.java
index 8e3307c..a13f889 100644
--- a/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultValidatorRegistry.java
+++ b/core/camel-base/src/main/java/org/apache/camel/impl/engine/DefaultValidatorRegistry.java
@@ -16,12 +16,17 @@
  */
 package org.apache.camel.impl.engine;
 
+import java.io.IOException;
+
 import org.apache.camel.CamelContext;
+import org.apache.camel.Service;
 import org.apache.camel.impl.validator.ValidatorKey;
 import org.apache.camel.spi.DataType;
 import org.apache.camel.spi.Validator;
 import org.apache.camel.spi.ValidatorRegistry;
 import org.apache.camel.support.CamelContextHelper;
+import org.apache.camel.support.service.ServiceHelper;
+import org.apache.camel.support.service.ServiceSupport;
 import org.apache.camel.util.ObjectHelper;
 
 /**
@@ -57,4 +62,11 @@ public class DefaultValidatorRegistry extends AbstractDynamicRegistry<ValidatorK
         return "ValidatorRegistry for " + context.getName() + ", capacity: " + maxCacheSize;
     }
 
+    @Override
+    public Validator put(ValidatorKey key, Validator validator) {
+        // ensure validator is started before its being used
+        ServiceHelper.startService(validator);
+        return super.put(key, validator);
+    }
+
 }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/builder/RouteBuilder.java b/core/camel-core-engine/src/main/java/org/apache/camel/builder/RouteBuilder.java
index 90dadea..2d3e5d9 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/builder/RouteBuilder.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/builder/RouteBuilder.java
@@ -29,6 +29,9 @@ import org.apache.camel.ExtendedCamelContext;
 import org.apache.camel.Ordered;
 import org.apache.camel.Route;
 import org.apache.camel.RoutesBuilder;
+import org.apache.camel.ValueHolder;
+import org.apache.camel.impl.transformer.TransformerKey;
+import org.apache.camel.impl.validator.ValidatorKey;
 import org.apache.camel.model.FromDefinition;
 import org.apache.camel.model.InterceptDefinition;
 import org.apache.camel.model.InterceptFromDefinition;
@@ -41,8 +44,15 @@ import org.apache.camel.model.RoutesDefinition;
 import org.apache.camel.model.rest.RestConfigurationDefinition;
 import org.apache.camel.model.rest.RestDefinition;
 import org.apache.camel.model.rest.RestsDefinition;
+import org.apache.camel.model.transformer.TransformerDefinition;
+import org.apache.camel.model.validator.ValidatorDefinition;
+import org.apache.camel.reifier.transformer.TransformerReifier;
+import org.apache.camel.reifier.validator.ValidatorReifier;
+import org.apache.camel.spi.DataType;
 import org.apache.camel.spi.PropertiesComponent;
 import org.apache.camel.spi.RestConfiguration;
+import org.apache.camel.spi.Transformer;
+import org.apache.camel.spi.Validator;
 import org.apache.camel.util.ObjectHelper;
 import org.apache.camel.util.StringHelper;
 import org.apache.camel.util.function.ThrowingConsumer;
@@ -543,6 +553,16 @@ public abstract class RouteBuilder extends BuilderSupport implements RoutesBuild
         for (TransformerBuilder tdb : transformerBuilders) {
             tdb.configure(camelContext);
         }
+
+        // create and register transformers on transformer registry
+        for (TransformerDefinition def : camelContext.getExtension(Model.class).getTransformers()) {
+            Transformer transformer = TransformerReifier.reifier(def).createTransformer(camelContext);
+            camelContext.getTransformerRegistry().put(createTransformerKey(def), transformer);
+        }
+    }
+
+    private static ValueHolder<String> createTransformerKey(TransformerDefinition def) {
+        return ObjectHelper.isNotEmpty(def.getScheme()) ? new TransformerKey(def.getScheme()) : new TransformerKey(new DataType(def.getFromType()), new DataType(def.getToType()));
     }
 
     protected void populateValidators() {
@@ -553,6 +573,16 @@ public abstract class RouteBuilder extends BuilderSupport implements RoutesBuild
         for (ValidatorBuilder vb : validatorBuilders) {
             vb.configure(camelContext);
         }
+
+        // create and register validators on validator registry
+        for (ValidatorDefinition def : camelContext.getExtension(Model.class).getValidators()) {
+            Validator validator = ValidatorReifier.reifier(def).createValidator(camelContext);
+            camelContext.getValidatorRegistry().put(createValidatorKey(def), validator);
+        }
+    }
+
+    private static ValidatorKey createValidatorKey(ValidatorDefinition def) {
+        return new ValidatorKey(new DataType(def.getType()));
     }
 
     public RestsDefinition getRestCollection() {
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/builder/TransformerBuilder.java b/core/camel-core-engine/src/main/java/org/apache/camel/builder/TransformerBuilder.java
index 3996943f..f309911 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/builder/TransformerBuilder.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/builder/TransformerBuilder.java
@@ -185,6 +185,9 @@ public class TransformerBuilder {
             transformer.setToType(to);
         }
 
+        // force init of transformer registry
+        camelContext.getTransformerRegistry();
+
         camelContext.getExtension(Model.class).getTransformers().add(transformer);
     }
 }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/builder/ValidatorBuilder.java b/core/camel-core-engine/src/main/java/org/apache/camel/builder/ValidatorBuilder.java
index 13aa3b8..08d595b 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/builder/ValidatorBuilder.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/builder/ValidatorBuilder.java
@@ -165,6 +165,9 @@ public class ValidatorBuilder {
             throw new IllegalArgumentException("No Validator type was specified");
         }
 
+        // force init of validator registry
+        camelContext.getValidatorRegistry();
+
         validator.setType(type);
         camelContext.getExtension(Model.class).getValidators().add(validator);
     }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/impl/AbstractModelCamelContext.java b/core/camel-core-engine/src/main/java/org/apache/camel/impl/AbstractModelCamelContext.java
index 6a78a7c..b017356 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/impl/AbstractModelCamelContext.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/impl/AbstractModelCamelContext.java
@@ -257,31 +257,13 @@ public abstract class AbstractModelCamelContext extends AbstractCamelContext imp
     }
 
     @Override
-    protected ValidatorRegistry<ValidatorKey> createValidatorRegistry() throws Exception {
-        DefaultValidatorRegistry registry = new DefaultValidatorRegistry(this);
-        for (ValidatorDefinition def : getValidators()) {
-            Validator validator = ValidatorReifier.reifier(def).createValidator(this);
-            registry.put(createKey(def), doAddService(validator));
-        }
-        return registry;
-    }
-
-    private ValidatorKey createKey(ValidatorDefinition def) {
-        return new ValidatorKey(new DataType(def.getType()));
+    protected ValidatorRegistry<ValidatorKey> createValidatorRegistry() {
+        return new DefaultValidatorRegistry(this);
     }
 
     @Override
-    protected TransformerRegistry<TransformerKey> createTransformerRegistry() throws Exception {
-        DefaultTransformerRegistry registry = new DefaultTransformerRegistry(this);
-        for (TransformerDefinition def : getTransformers()) {
-            Transformer transformer = TransformerReifier.reifier(def).createTransformer(this);
-            registry.put(createKey(def), doAddService(transformer));
-        }
-        return registry;
-    }
-
-    private TransformerKey createKey(TransformerDefinition def) {
-        return ObjectHelper.isNotEmpty(def.getScheme()) ? new TransformerKey(def.getScheme()) : new TransformerKey(new DataType(def.getFromType()), new DataType(def.getToType()));
+    protected TransformerRegistry<TransformerKey> createTransformerRegistry() {
+        return new DefaultTransformerRegistry(this);
     }
 
     protected abstract HealthCheckRegistry createHealthCheckRegistry();
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/transformer/CustomTransformeReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/transformer/CustomTransformeReifier.java
index 6cfea73..049f00a 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/transformer/CustomTransformeReifier.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/transformer/CustomTransformeReifier.java
@@ -28,7 +28,7 @@ public class CustomTransformeReifier extends TransformerReifier<CustomTransforme
     }
 
     @Override
-    protected Transformer doCreateTransformer(CamelContext context) throws Exception {
+    protected Transformer doCreateTransformer(CamelContext context) {
         if (definition.getRef() == null && definition.getClassName() == null) {
             throw new IllegalArgumentException("'ref' or 'className' must be specified for customTransformer");
         }
@@ -42,12 +42,11 @@ public class CustomTransformeReifier extends TransformerReifier<CustomTransforme
                 throw new IllegalArgumentException(String.format("Transformer '%s' is already in use. Please check if duplicate transformer exists.", definition.getRef()));
             }
         } else {
-            Class<Transformer> transformerClass = context.getClassResolver().resolveMandatoryClass(definition.getClassName(), Transformer.class);
+            Class<Transformer> transformerClass = context.getClassResolver().resolveClass(definition.getClassName(), Transformer.class);
             if (transformerClass == null) {
                 throw new IllegalArgumentException("Cannot find transformer class: " + definition.getClassName());
             }
             transformer = context.getInjector().newInstance(transformerClass, false);
-
         }
         transformer.setCamelContext(context);
         return transformer.setModel(definition.getScheme()).setFrom(definition.getFromType()).setTo(definition.getToType());
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/transformer/EndpointTransformeReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/transformer/EndpointTransformeReifier.java
index 32b284c..b1afd5f 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/transformer/EndpointTransformeReifier.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/transformer/EndpointTransformeReifier.java
@@ -32,7 +32,7 @@ public class EndpointTransformeReifier extends TransformerReifier<EndpointTransf
     }
 
     @Override
-    protected Transformer doCreateTransformer(CamelContext context) throws Exception {
+    protected Transformer doCreateTransformer(CamelContext context) {
         Endpoint endpoint = definition.getUri() != null ? context.getEndpoint(definition.getUri()) : context.getRegistry().lookupByNameAndType(definition.getRef(), Endpoint.class);
         SendProcessor processor = new SendProcessor(endpoint, ExchangePattern.InOut);
         return new ProcessorTransformer(context).setProcessor(processor).setModel(definition.getScheme()).setFrom(definition.getFromType()).setTo(definition.getToType());
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/transformer/TransformerReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/transformer/TransformerReifier.java
index b4c2b9e..f27b31a 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/transformer/TransformerReifier.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/transformer/TransformerReifier.java
@@ -52,10 +52,10 @@ public abstract class TransformerReifier<T> {
         throw new IllegalStateException("Unsupported definition: " + definition);
     }
 
-    public Transformer createTransformer(CamelContext context) throws Exception {
+    public Transformer createTransformer(CamelContext context) {
         return doCreateTransformer(context);
     }
 
-    protected abstract Transformer doCreateTransformer(CamelContext context) throws Exception;
+    protected abstract Transformer doCreateTransformer(CamelContext context);
 
 }
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/validator/CustomValidatorReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/validator/CustomValidatorReifier.java
index 0d6118a..42e612b 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/validator/CustomValidatorReifier.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/validator/CustomValidatorReifier.java
@@ -28,7 +28,7 @@ public class CustomValidatorReifier extends ValidatorReifier<CustomValidatorDefi
     }
 
     @Override
-    protected Validator doCreateValidator(CamelContext context) throws Exception {
+    protected Validator doCreateValidator(CamelContext context) {
         if (definition.getRef() == null && definition.getClassName() == null) {
             throw new IllegalArgumentException("'ref' or 'type' must be specified for customValidator");
         }
@@ -42,12 +42,11 @@ public class CustomValidatorReifier extends ValidatorReifier<CustomValidatorDefi
                 throw new IllegalArgumentException(String.format("Validator '%s' is already in use. Please check if duplicate validator exists.", definition.getRef()));
             }
         } else {
-            Class<Validator> validatorClass = context.getClassResolver().resolveMandatoryClass(definition.getClassName(), Validator.class);
+            Class<Validator> validatorClass = context.getClassResolver().resolveClass(definition.getClassName(), Validator.class);
             if (validatorClass == null) {
                 throw new IllegalArgumentException("Cannot find validator class: " + definition.getClassName());
             }
             validator = context.getInjector().newInstance(validatorClass, false);
-
         }
         validator.setCamelContext(context);
         return validator.setType(definition.getType());
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/validator/EndpointValidatorReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/validator/EndpointValidatorReifier.java
index c8c4712..b8364df 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/validator/EndpointValidatorReifier.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/validator/EndpointValidatorReifier.java
@@ -32,7 +32,7 @@ public class EndpointValidatorReifier extends ValidatorReifier<EndpointValidator
     }
 
     @Override
-    protected Validator doCreateValidator(CamelContext context) throws Exception {
+    protected Validator doCreateValidator(CamelContext context) {
         Endpoint endpoint = definition.getUri() != null ? context.getEndpoint(definition.getUri()) : context.getRegistry().lookupByNameAndType(definition.getRef(), Endpoint.class);
         SendProcessor processor = new SendProcessor(endpoint, ExchangePattern.InOut);
         return new ProcessorValidator(context).setProcessor(processor).setType(definition.getType());
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/validator/PredicateValidatorReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/validator/PredicateValidatorReifier.java
index 8fc8450..17c097b 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/validator/PredicateValidatorReifier.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/validator/PredicateValidatorReifier.java
@@ -31,7 +31,7 @@ public class PredicateValidatorReifier extends ValidatorReifier<PredicateValidat
     }
 
     @Override
-    protected Validator doCreateValidator(CamelContext context) throws Exception {
+    protected Validator doCreateValidator(CamelContext context) {
         Predicate pred = definition.getExpression().createPredicate(context);
         PredicateValidatingProcessor processor = new PredicateValidatingProcessor(pred);
         return new ProcessorValidator(context).setProcessor(processor).setType(definition.getType());
diff --git a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/validator/ValidatorReifier.java b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/validator/ValidatorReifier.java
index 2de79e1..cc90525 100644
--- a/core/camel-core-engine/src/main/java/org/apache/camel/reifier/validator/ValidatorReifier.java
+++ b/core/camel-core-engine/src/main/java/org/apache/camel/reifier/validator/ValidatorReifier.java
@@ -56,10 +56,10 @@ public abstract class ValidatorReifier<T> {
         throw new IllegalStateException("Unsupported definition: " + definition);
     }
 
-    public Validator createValidator(CamelContext context) throws Exception {
+    public Validator createValidator(CamelContext context) {
         return doCreateValidator(context);
     }
 
-    protected abstract Validator doCreateValidator(CamelContext context) throws Exception;
+    protected abstract Validator doCreateValidator(CamelContext context);
 
 }
diff --git a/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java b/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
index e094c23..314ce92 100644
--- a/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
+++ b/core/camel-core-xml/src/main/java/org/apache/camel/core/xml/AbstractCamelContextFactoryBean.java
@@ -39,6 +39,7 @@ import org.apache.camel.ShutdownRoute;
 import org.apache.camel.ShutdownRunningTask;
 import org.apache.camel.TypeConverterExists;
 import org.apache.camel.TypeConverters;
+import org.apache.camel.ValueHolder;
 import org.apache.camel.builder.ErrorHandlerBuilderRef;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.cloud.ServiceRegistry;
@@ -51,6 +52,8 @@ import org.apache.camel.health.HealthCheckRegistry;
 import org.apache.camel.health.HealthCheckRepository;
 import org.apache.camel.health.HealthCheckService;
 import org.apache.camel.impl.engine.DefaultManagementStrategy;
+import org.apache.camel.impl.transformer.TransformerKey;
+import org.apache.camel.impl.validator.ValidatorKey;
 import org.apache.camel.model.ContextScanDefinition;
 import org.apache.camel.model.FromDefinition;
 import org.apache.camel.model.GlobalOptionsDefinition;
@@ -76,13 +79,18 @@ import org.apache.camel.model.dataformat.DataFormatsDefinition;
 import org.apache.camel.model.rest.RestConfigurationDefinition;
 import org.apache.camel.model.rest.RestContainer;
 import org.apache.camel.model.rest.RestDefinition;
+import org.apache.camel.model.transformer.TransformerDefinition;
 import org.apache.camel.model.transformer.TransformersDefinition;
+import org.apache.camel.model.validator.ValidatorDefinition;
 import org.apache.camel.model.validator.ValidatorsDefinition;
 import org.apache.camel.processor.interceptor.BacklogTracer;
+import org.apache.camel.reifier.transformer.TransformerReifier;
+import org.apache.camel.reifier.validator.ValidatorReifier;
 import org.apache.camel.runtimecatalog.JSonSchemaResolver;
 import org.apache.camel.runtimecatalog.RuntimeCamelCatalog;
 import org.apache.camel.spi.AsyncProcessorAwaitManager;
 import org.apache.camel.spi.ClassResolver;
+import org.apache.camel.spi.DataType;
 import org.apache.camel.spi.Debugger;
 import org.apache.camel.spi.EndpointStrategy;
 import org.apache.camel.spi.EventFactory;
@@ -111,9 +119,11 @@ import org.apache.camel.spi.ShutdownStrategy;
 import org.apache.camel.spi.StreamCachingStrategy;
 import org.apache.camel.spi.ThreadPoolFactory;
 import org.apache.camel.spi.ThreadPoolProfile;
+import org.apache.camel.spi.Transformer;
 import org.apache.camel.spi.TypeConverterRegistry;
 import org.apache.camel.spi.UnitOfWorkFactory;
 import org.apache.camel.spi.UuidGenerator;
+import org.apache.camel.spi.Validator;
 import org.apache.camel.support.CamelContextHelper;
 import org.apache.camel.support.ObjectHelper;
 import org.apache.camel.util.StringHelper;
@@ -427,6 +437,9 @@ public abstract class AbstractCamelContextFactoryBean<T extends ModelCamelContex
             // must init rest refs before we add the rests
             initRestRefs();
 
+            initTransformers();
+            initValidators();
+
             // cannot add rests as routes yet as we need to initialize this specially
             getContext().addRestDefinitions(getRests(), false);
 
@@ -474,6 +487,34 @@ public abstract class AbstractCamelContextFactoryBean<T extends ModelCamelContex
         }
     }
 
+    private void initTransformers() {
+        if (getTransformers() != null) {
+            for (TransformerDefinition def : getTransformers().getTransformers()) {
+                // create and register transformers on transformer registry
+                Transformer transformer = TransformerReifier.reifier(def).createTransformer(getContext());
+                getContext().getTransformerRegistry().put(createTransformerKey(def), transformer);
+            }
+        }
+    }
+
+    private static ValueHolder<String> createTransformerKey(TransformerDefinition def) {
+        return org.apache.camel.util.ObjectHelper.isNotEmpty(def.getScheme()) ? new TransformerKey(def.getScheme()) : new TransformerKey(new DataType(def.getFromType()), new DataType(def.getToType()));
+    }
+
+    private void initValidators() {
+        if (getValidators() != null) {
+            for (ValidatorDefinition def : getValidators().getValidators()) {
+                // create and register validators on validator registry
+                Validator validator = ValidatorReifier.reifier(def).createValidator(getContext());
+                getContext().getValidatorRegistry().put(createValidatorKey(def), validator);
+            }
+        }
+    }
+
+    private static ValidatorKey createValidatorKey(ValidatorDefinition def) {
+        return new ValidatorKey(new DataType(def.getType()));
+    }
+
     /**
      * Do special preparation for some concepts such as interceptors and policies
      * this is needed as JAXB does not build exactly the same model definition as Spring DSL would do
diff --git a/core/camel-core/src/test/java/org/apache/camel/impl/MultipleLifecycleStrategyTest.java b/core/camel-core/src/test/java/org/apache/camel/impl/MultipleLifecycleStrategyTest.java
index 7e503d3..76abf3c 100644
--- a/core/camel-core/src/test/java/org/apache/camel/impl/MultipleLifecycleStrategyTest.java
+++ b/core/camel-core/src/test/java/org/apache/camel/impl/MultipleLifecycleStrategyTest.java
@@ -51,8 +51,8 @@ public class MultipleLifecycleStrategyTest extends TestSupport {
 
         List<String> expectedEvents = Arrays.asList("onContextStart",
             "onServiceAdd", "onServiceAdd", "onServiceAdd", "onServiceAdd", "onServiceAdd", "onServiceAdd", "onServiceAdd",
-            "onServiceAdd", "onServiceAdd", "onServiceAdd", "onServiceAdd", "onServiceAdd", "onServiceAdd", "onServiceAdd",
-            "onServiceAdd", "onServiceAdd", "onServiceAdd", "onComponentAdd", "onEndpointAdd", "onComponentRemove", "onContextStop");
+            "onServiceAdd", "onServiceAdd", "onServiceAdd", "onServiceAdd", "onServiceAdd", "onServiceAdd",
+            "onComponentAdd", "onEndpointAdd", "onComponentRemove", "onContextStop");
         
         assertEquals(expectedEvents, dummy1.getEvents());
         assertEquals(expectedEvents, dummy2.getEvents());
diff --git a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ModelCamelContextHelper.java b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ModelCamelContextHelper.java
index d683c73..70090bf 100644
--- a/core/camel-management/src/main/java/org/apache/camel/management/mbean/ModelCamelContextHelper.java
+++ b/core/camel-management/src/main/java/org/apache/camel/management/mbean/ModelCamelContextHelper.java
@@ -27,6 +27,7 @@ import org.apache.camel.model.RouteDefinition;
 /**
  * A number of helper methods
  */
+@Deprecated
 public final class ModelCamelContextHelper {
 
     /**
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedNonManagedServiceTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedNonManagedServiceTest.java
index 3d81dc5..3a249b5 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedNonManagedServiceTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedNonManagedServiceTest.java
@@ -29,7 +29,7 @@ import org.junit.Test;
 
 public class ManagedNonManagedServiceTest extends ManagementTestSupport {
 
-    private static final int SERVICES = 14;
+    private static final int SERVICES = 12;
 
     @Test
     public void testService() throws Exception {
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedProducerRouteAddRemoveRegisterAlwaysTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedProducerRouteAddRemoveRegisterAlwaysTest.java
index 8429a81..4bb974c 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedProducerRouteAddRemoveRegisterAlwaysTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedProducerRouteAddRemoveRegisterAlwaysTest.java
@@ -28,7 +28,7 @@ import org.junit.Test;
 
 public class ManagedProducerRouteAddRemoveRegisterAlwaysTest extends ManagementTestSupport {
 
-    private int services = 14;
+    private int services = 12;
 
     @Override
     protected CamelContext createCamelContext() throws Exception {
diff --git a/core/camel-management/src/test/java/org/apache/camel/management/ManagedRouteAddRemoveTest.java b/core/camel-management/src/test/java/org/apache/camel/management/ManagedRouteAddRemoveTest.java
index 6ed0d66..339ec5f 100644
--- a/core/camel-management/src/test/java/org/apache/camel/management/ManagedRouteAddRemoveTest.java
+++ b/core/camel-management/src/test/java/org/apache/camel/management/ManagedRouteAddRemoveTest.java
@@ -33,7 +33,7 @@ import org.junit.Test;
  */
 public class ManagedRouteAddRemoveTest extends ManagementTestSupport {
     
-    private static final int SERVICES = 14;
+    private static final int SERVICES = 12;
 
     @Override
     protected RouteBuilder createRouteBuilder() throws Exception {