You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by ja...@apache.org on 2020/11/05 15:01:38 UTC

[camel-quarkus] 01/02: Upgrade to Camel 3.7.0

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

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

commit 704b03f59eb9683ad1b1b3af7279248e2f2e5cee
Author: James Netherton <ja...@gmail.com>
AuthorDate: Mon Oct 19 07:16:38 2020 +0100

    Upgrade to Camel 3.7.0
---
 .../pages/reference/extensions/kubernetes.adoc     |   1 +
 .../ROOT/pages/reference/extensions/leveldb.adoc   |  12 ++-
 .../partials/reference/components/atlasmap.adoc    |   1 +
 .../components/kubernetes-custom-resources.adoc    |  13 +++
 .../partials/reference/dataformats/json-jsonb.adoc |   1 +
 .../ROOT/partials/reference/languages/joor.adoc    |   1 +
 .../partials/reference/others/leveldb-legacy.adoc  |   1 +
 .../quarkus/core/deployment/CamelProcessor.java    |   8 ++
 extensions-core/core/runtime/pom.xml               |  16 +--
 .../org/apache/camel/quarkus/core/BaseModel.java   |  31 ++++--
 .../camel/quarkus/core/FastCamelContext.java       | 117 +++++++++++++++------
 .../org/apache/camel/quarkus/core/FastModel.java   |   1 -
 .../camel/quarkus/core/FastTypeConverter.java      |   2 +-
 extensions/json-validator/runtime/pom.xml          |   4 +
 .../leveldb/runtime/src/main/doc/limitations.adoc  |  12 ++-
 .../component/leveldb/ObjectCodecSubstitute.java   |  64 -----------
 .../QuarkusLevelDBAggregationRepository.java       |  71 +++++++++++++
 .../MicroprofileFaultToleranceProcessor.java       |   8 ++
 .../component/qute/QuteComponentConfigurer.java    |   9 ++
 .../component/qute/QuteEndpointConfigurer.java     |   9 ++
 .../component/qute/QuteEndpointUriFactory.java     |   4 +-
 .../component/foundation/it/mock/MockResource.java |   4 +-
 .../component/leveldb/it/LeveldbRouteBuilder.java  |  10 +-
 .../quarkus/component/leveldb/it/LeveldbIT.java    |   4 -
 .../quarkus/component/leveldb/it/LeveldbTest.java  |  14 +--
 .../camel/quarkus/component/saga/it/SagaRoute.java |   2 +-
 pom.xml                                            |   3 +-
 poms/bom/pom.xml                                   |  10 ++
 28 files changed, 285 insertions(+), 148 deletions(-)

diff --git a/docs/modules/ROOT/pages/reference/extensions/kubernetes.adoc b/docs/modules/ROOT/pages/reference/extensions/kubernetes.adoc
index 03778ed..05cfc34 100644
--- a/docs/modules/ROOT/pages/reference/extensions/kubernetes.adoc
+++ b/docs/modules/ROOT/pages/reference/extensions/kubernetes.adoc
@@ -18,6 +18,7 @@ Perform operations against Kubernetes API
 == What's inside
 
 * xref:latest@components::kubernetes-config-maps-component.adoc[Kubernetes ConfigMap component], URI syntax: `kubernetes-config-maps:masterUrl`
+* xref:latest@components::kubernetes-custom-resources-component.adoc[Kubernetes Custom Resources component], URI syntax: `kubernetes-custom-resources:masterUrl`
 * xref:latest@components::kubernetes-deployments-component.adoc[Kubernetes Deployments component], URI syntax: `kubernetes-deployments:masterUrl`
 * xref:latest@components::kubernetes-hpa-component.adoc[Kubernetes HPA component], URI syntax: `kubernetes-hpa:masterUrl`
 * xref:latest@components::kubernetes-job-component.adoc[Kubernetes Job component], URI syntax: `kubernetes-job:masterUrl`
diff --git a/docs/modules/ROOT/pages/reference/extensions/leveldb.adoc b/docs/modules/ROOT/pages/reference/extensions/leveldb.adoc
index fda4ef0..190fc8d 100644
--- a/docs/modules/ROOT/pages/reference/extensions/leveldb.adoc
+++ b/docs/modules/ROOT/pages/reference/extensions/leveldb.adoc
@@ -38,8 +38,14 @@ In native mode the extension uses a port of LevelDB written in Java (https://git
 which is within 10% of the performance of the C++ original. Please upvote https://github.com/apache/camel-quarkus/issues/1911[this issue]
 if you do not like the present state.
 
-This extension does not support binary payloads in native mode since object serialization is https://github.com/oracle/graal/issues/460[not supported] on GraalVM. To work around this limitation, the extension instead uses Jackson serializaton / deserialization.
+Serialization is https://github.com/oracle/graal/issues/460[not supported] on GraalVM. Extension has to use serializationization based
+on Jackson. Aggregation repository in native has to be constructed in one of the following ways:
+
+* Use class `QuarkusLevelDBAggregationRepository` instead of `LevelDBAggregationRepository`.
+* Configure jackson serializer on `LevelDBAggregationRepository` by calling `repo.setSerializer(new JacksonLevelDBSerializer());`
+
+Jackson serializer has limitation towards binary content. If payload object contains binary data (does not concern payloads which are completely binary), Jackson serialization and deserialization won't work correctly.
+To avoid this, define your own jackson serializer/deserealizer via `Module` and provide it to the aggragation repository
+(you can use for example the constructor of `QuarkusLevelDBAggregationRepository`).
 
-The problem will be solved when the camel-leveldb component is refactored to use Jackson and custom
-serializers (see https://issues.apache.org/jira/browse/CAMEL-15679[issue])
 
diff --git a/docs/modules/ROOT/partials/reference/components/atlasmap.adoc b/docs/modules/ROOT/partials/reference/components/atlasmap.adoc
new file mode 100644
index 0000000..a509c1d
--- /dev/null
+++ b/docs/modules/ROOT/partials/reference/components/atlasmap.adoc
@@ -0,0 +1 @@
+// Empty partial for a Camel bit unsupported by Camel Quarkus to avoid warnings when this file is included from a Camel page
diff --git a/docs/modules/ROOT/partials/reference/components/kubernetes-custom-resources.adoc b/docs/modules/ROOT/partials/reference/components/kubernetes-custom-resources.adoc
new file mode 100644
index 0000000..07f368a
--- /dev/null
+++ b/docs/modules/ROOT/partials/reference/components/kubernetes-custom-resources.adoc
@@ -0,0 +1,13 @@
+// Do not edit directly!
+// This file was generated by camel-quarkus-maven-plugin:update-extension-doc-page
+:cq-artifact-id: camel-quarkus-kubernetes
+:cq-artifact-id-base: kubernetes
+:cq-native-supported: true
+:cq-status: Stable
+:cq-deprecated: false
+:cq-jvm-since: 1.0.0
+:cq-native-since: 1.0.0
+:cq-camel-part-name: kubernetes-custom-resources
+:cq-camel-part-title: Kubernetes Custom Resources
+:cq-camel-part-description: Perform operations on Kubernetes Custom Resources and get notified on Deployment changes.
+:cq-extension-page-title: Kubernetes
diff --git a/docs/modules/ROOT/partials/reference/dataformats/json-jsonb.adoc b/docs/modules/ROOT/partials/reference/dataformats/json-jsonb.adoc
new file mode 100644
index 0000000..a509c1d
--- /dev/null
+++ b/docs/modules/ROOT/partials/reference/dataformats/json-jsonb.adoc
@@ -0,0 +1 @@
+// Empty partial for a Camel bit unsupported by Camel Quarkus to avoid warnings when this file is included from a Camel page
diff --git a/docs/modules/ROOT/partials/reference/languages/joor.adoc b/docs/modules/ROOT/partials/reference/languages/joor.adoc
new file mode 100644
index 0000000..a509c1d
--- /dev/null
+++ b/docs/modules/ROOT/partials/reference/languages/joor.adoc
@@ -0,0 +1 @@
+// Empty partial for a Camel bit unsupported by Camel Quarkus to avoid warnings when this file is included from a Camel page
diff --git a/docs/modules/ROOT/partials/reference/others/leveldb-legacy.adoc b/docs/modules/ROOT/partials/reference/others/leveldb-legacy.adoc
new file mode 100644
index 0000000..a509c1d
--- /dev/null
+++ b/docs/modules/ROOT/partials/reference/others/leveldb-legacy.adoc
@@ -0,0 +1 @@
+// Empty partial for a Camel bit unsupported by Camel Quarkus to avoid warnings when this file is included from a Camel page
diff --git a/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelProcessor.java b/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelProcessor.java
index 4b542c9..7efea5e 100644
--- a/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelProcessor.java
+++ b/extensions-core/core/deployment/src/main/java/org/apache/camel/quarkus/core/deployment/CamelProcessor.java
@@ -40,6 +40,7 @@ import io.quarkus.deployment.annotations.Overridable;
 import io.quarkus.deployment.annotations.Record;
 import io.quarkus.deployment.builditem.ApplicationArchivesBuildItem;
 import io.quarkus.deployment.builditem.CombinedIndexBuildItem;
+import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBuildItem;
 import io.quarkus.deployment.recording.RecorderContext;
 import io.quarkus.runtime.RuntimeValue;
 import org.apache.camel.impl.converter.BaseTypeConverterRegistry;
@@ -346,4 +347,11 @@ class CamelProcessor {
                 .map(CamelRoutesBuilderClassBuildItem::new)
                 .collect(Collectors.toList());
     }
+
+    @BuildStep
+    NativeImageResourceBuildItem initResources() {
+        return new NativeImageResourceBuildItem(
+                "META-INF/services/org/apache/camel/bean-processor-factory",
+                "META-INF/services/org/apache/camel/rest-registry-factory");
+    }
 }
diff --git a/extensions-core/core/runtime/pom.xml b/extensions-core/core/runtime/pom.xml
index 0f2a2c8..9688e0c 100644
--- a/extensions-core/core/runtime/pom.xml
+++ b/extensions-core/core/runtime/pom.xml
@@ -66,27 +66,31 @@
 
         <dependency>
             <groupId>org.apache.camel</groupId>
-            <artifactId>camel-core-engine</artifactId>
+            <artifactId>camel-base</artifactId>
         </dependency>
         <dependency>
             <groupId>org.apache.camel</groupId>
-            <artifactId>camel-base</artifactId>
+            <artifactId>camel-componentdsl</artifactId>
         </dependency>
         <dependency>
             <groupId>org.apache.camel</groupId>
-            <artifactId>camel-core-languages</artifactId>
+            <artifactId>camel-core-catalog</artifactId>
         </dependency>
         <dependency>
             <groupId>org.apache.camel</groupId>
-            <artifactId>camel-endpointdsl</artifactId>
+            <artifactId>camel-core-engine</artifactId>
         </dependency>
         <dependency>
             <groupId>org.apache.camel</groupId>
-            <artifactId>camel-componentdsl</artifactId>
+            <artifactId>camel-core-languages</artifactId>
         </dependency>
         <dependency>
             <groupId>org.apache.camel</groupId>
-            <artifactId>camel-core-catalog</artifactId>
+            <artifactId>camel-core-processor</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.camel</groupId>
+            <artifactId>camel-endpointdsl</artifactId>
         </dependency>
         <dependency>
             <groupId>org.apache.camel</groupId>
diff --git a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/BaseModel.java b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/BaseModel.java
index 8ee50e0..df3c89a 100644
--- a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/BaseModel.java
+++ b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/BaseModel.java
@@ -29,6 +29,7 @@ import java.util.function.Function;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.ExtendedCamelContext;
+import org.apache.camel.impl.DefaultModelReifierFactory;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.model.FaultToleranceConfigurationDefinition;
 import org.apache.camel.model.HystrixConfigurationDefinition;
@@ -46,6 +47,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.spi.ModelReifierFactory;
 import org.apache.camel.spi.NodeIdFactory;
 import org.apache.camel.util.AntPathMatcher;
 
@@ -53,6 +55,7 @@ public abstract class BaseModel implements Model {
 
     private final CamelContext camelContext;
 
+    private ModelReifierFactory modelReifierFactory = new DefaultModelReifierFactory();
     private final List<RouteDefinition> routeDefinitions = new ArrayList<>();
     private final List<RouteTemplateDefinition> routeTemplateDefinitions = new ArrayList<>();
     private final List<RestDefinition> restDefinitions = new ArrayList<>();
@@ -201,10 +204,11 @@ public abstract class BaseModel implements Model {
             throw new IllegalArgumentException("Cannot find RouteTemplate with id " + routeTemplateId);
         }
 
-        StringJoiner templatesBuilder = new StringJoiner(", ");
         final Map<String, Object> prop = new HashMap<>();
         // include default values first from the template (and validate that we have inputs for all required parameters)
         if (target.getTemplateParameters() != null) {
+            StringJoiner templatesBuilder = new StringJoiner(", ");
+
             for (RouteTemplateParameterDefinition temp : target.getTemplateParameters()) {
                 if (temp.getDefaultValue() != null) {
                     prop.put(temp.getName(), temp.getDefaultValue());
@@ -215,18 +219,19 @@ public abstract class BaseModel implements Model {
                     }
                 }
             }
+            if (templatesBuilder.length() > 0) {
+                throw new IllegalArgumentException(
+                        "Route template " + routeTemplateId + " the following mandatory parameters must be provided: "
+                                + templatesBuilder.toString());
+            }
         }
-        if (templatesBuilder.length() > 0) {
-            throw new IllegalArgumentException(
-                    "Route template " + routeTemplateId + " the following mandatory parameters must be provided: "
-                            + templatesBuilder.toString());
-        }
+
         // then override with user parameters
         if (parameters != null) {
             prop.putAll(parameters);
         }
 
-        RouteTemplateDefinition.Converter converter = RouteTemplateDefinition::asRouteDefinition;
+        RouteTemplateDefinition.Converter converter = RouteTemplateDefinition.Converter.DEFAULT_CONVERTER;
 
         for (Map.Entry<String, RouteTemplateDefinition.Converter> entry : routeTemplateConverters.entrySet()) {
             final String key = entry.getKey();
@@ -244,7 +249,7 @@ public abstract class BaseModel implements Model {
             }
         }
 
-        RouteDefinition def = converter.apply(target);
+        RouteDefinition def = converter.apply(target, prop);
         if (routeId != null) {
             def.setId(routeId);
         }
@@ -476,6 +481,16 @@ public abstract class BaseModel implements Model {
         return modelLifecycleStrategies;
     }
 
+    @Override
+    public ModelReifierFactory getModelReifierFactory() {
+        return modelReifierFactory;
+    }
+
+    @Override
+    public void setModelReifierFactory(ModelReifierFactory modelReifierFactory) {
+        this.modelReifierFactory = modelReifierFactory;
+    }
+
     /**
      * Should we start newly added routes?
      */
diff --git a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastCamelContext.java b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastCamelContext.java
index 4ca613e..fd96350 100644
--- a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastCamelContext.java
+++ b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastCamelContext.java
@@ -22,10 +22,8 @@ import java.util.Collection;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
-import java.util.concurrent.ExecutorService;
 import java.util.function.Function;
 
-import org.apache.camel.AsyncProcessor;
 import org.apache.camel.CatalogCamelContext;
 import org.apache.camel.Component;
 import org.apache.camel.Endpoint;
@@ -36,12 +34,12 @@ import org.apache.camel.Processor;
 import org.apache.camel.Route;
 import org.apache.camel.TypeConverter;
 import org.apache.camel.ValueHolder;
+import org.apache.camel.builder.AdviceWith;
 import org.apache.camel.builder.AdviceWithRouteBuilder;
 import org.apache.camel.catalog.RuntimeCamelCatalog;
 import org.apache.camel.catalog.impl.DefaultRuntimeCamelCatalog;
 import org.apache.camel.component.microprofile.config.CamelMicroProfilePropertiesSource;
 import org.apache.camel.health.HealthCheckRegistry;
-import org.apache.camel.impl.DefaultExecutorServiceManager;
 import org.apache.camel.impl.engine.AbstractCamelContext;
 import org.apache.camel.impl.engine.BaseServiceResolver;
 import org.apache.camel.impl.engine.DefaultAsyncProcessorAwaitManager;
@@ -54,17 +52,19 @@ import org.apache.camel.impl.engine.DefaultComponentResolver;
 import org.apache.camel.impl.engine.DefaultConfigurerResolver;
 import org.apache.camel.impl.engine.DefaultDataFormatResolver;
 import org.apache.camel.impl.engine.DefaultEndpointRegistry;
+import org.apache.camel.impl.engine.DefaultExecutorServiceManager;
 import org.apache.camel.impl.engine.DefaultHeadersMapFactory;
 import org.apache.camel.impl.engine.DefaultInflightRepository;
 import org.apache.camel.impl.engine.DefaultInjector;
+import org.apache.camel.impl.engine.DefaultInterceptEndpointFactory;
 import org.apache.camel.impl.engine.DefaultLanguageResolver;
 import org.apache.camel.impl.engine.DefaultMessageHistoryFactory;
 import org.apache.camel.impl.engine.DefaultNodeIdFactory;
 import org.apache.camel.impl.engine.DefaultPackageScanClassResolver;
 import org.apache.camel.impl.engine.DefaultPackageScanResourceResolver;
-import org.apache.camel.impl.engine.DefaultProcessorFactory;
 import org.apache.camel.impl.engine.DefaultReactiveExecutor;
 import org.apache.camel.impl.engine.DefaultRouteController;
+import org.apache.camel.impl.engine.DefaultRouteFactory;
 import org.apache.camel.impl.engine.DefaultStreamCachingStrategy;
 import org.apache.camel.impl.engine.DefaultTracer;
 import org.apache.camel.impl.engine.DefaultTransformerRegistry;
@@ -73,8 +73,8 @@ import org.apache.camel.impl.engine.DefaultUriFactoryResolver;
 import org.apache.camel.impl.engine.DefaultValidatorRegistry;
 import org.apache.camel.impl.engine.EndpointKey;
 import org.apache.camel.impl.engine.RouteService;
-import org.apache.camel.impl.transformer.TransformerKey;
-import org.apache.camel.impl.validator.ValidatorKey;
+import org.apache.camel.impl.engine.TransformerKey;
+import org.apache.camel.impl.engine.ValidatorKey;
 import org.apache.camel.model.DataFormatDefinition;
 import org.apache.camel.model.FaultToleranceConfigurationDefinition;
 import org.apache.camel.model.HystrixConfigurationDefinition;
@@ -91,12 +91,16 @@ import org.apache.camel.model.language.ExpressionDefinition;
 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.MulticastProcessor;
+import org.apache.camel.processor.DefaultAnnotationBasedProcessorFactory;
+import org.apache.camel.processor.DefaultDeferServiceFactory;
+import org.apache.camel.processor.DefaultInternalProcessorFactory;
+import org.apache.camel.processor.DefaultProcessorFactory;
 import org.apache.camel.reifier.RouteReifier;
 import org.apache.camel.reifier.errorhandler.ErrorHandlerReifier;
 import org.apache.camel.reifier.language.ExpressionReifier;
 import org.apache.camel.reifier.transformer.TransformerReifier;
 import org.apache.camel.reifier.validator.ValidatorReifier;
+import org.apache.camel.spi.AnnotationBasedProcessorFactory;
 import org.apache.camel.spi.AsyncProcessorAwaitManager;
 import org.apache.camel.spi.BeanIntrospection;
 import org.apache.camel.spi.BeanProcessorFactory;
@@ -110,17 +114,21 @@ import org.apache.camel.spi.ConfigurerResolver;
 import org.apache.camel.spi.DataFormat;
 import org.apache.camel.spi.DataFormatResolver;
 import org.apache.camel.spi.DataType;
+import org.apache.camel.spi.DeferServiceFactory;
 import org.apache.camel.spi.EndpointRegistry;
 import org.apache.camel.spi.ExecutorServiceManager;
 import org.apache.camel.spi.FactoryFinderResolver;
 import org.apache.camel.spi.HeadersMapFactory;
 import org.apache.camel.spi.InflightRepository;
 import org.apache.camel.spi.Injector;
+import org.apache.camel.spi.InterceptEndpointFactory;
+import org.apache.camel.spi.InternalProcessorFactory;
 import org.apache.camel.spi.Language;
 import org.apache.camel.spi.LanguageResolver;
 import org.apache.camel.spi.ManagementNameStrategy;
 import org.apache.camel.spi.MessageHistoryFactory;
 import org.apache.camel.spi.ModelJAXBContextFactory;
+import org.apache.camel.spi.ModelReifierFactory;
 import org.apache.camel.spi.ModelToXMLDumper;
 import org.apache.camel.spi.NodeIdFactory;
 import org.apache.camel.spi.PackageScanClassResolver;
@@ -132,6 +140,7 @@ import org.apache.camel.spi.Registry;
 import org.apache.camel.spi.RestBindingJaxbDataFormatFactory;
 import org.apache.camel.spi.RestRegistryFactory;
 import org.apache.camel.spi.RouteController;
+import org.apache.camel.spi.RouteFactory;
 import org.apache.camel.spi.ShutdownStrategy;
 import org.apache.camel.spi.StreamCachingStrategy;
 import org.apache.camel.spi.Tracer;
@@ -150,7 +159,7 @@ import org.apache.camel.util.IOHelper;
 import org.apache.camel.util.ObjectHelper;
 
 public class FastCamelContext extends AbstractCamelContext implements CatalogCamelContext, ModelCamelContext {
-    private final Model model;
+    private Model model;
     private final String version;
     private final XMLRoutesDefinitionLoader xmlLoader;
     private final ModelToXMLDumper modelDumper;
@@ -275,6 +284,21 @@ public class FastCamelContext extends AbstractCamelContext implements CatalogCam
     }
 
     @Override
+    protected InternalProcessorFactory createInternalProcessorFactory() {
+        return new DefaultInternalProcessorFactory();
+    }
+
+    @Override
+    protected InterceptEndpointFactory createInterceptEndpointFactory() {
+        return new DefaultInterceptEndpointFactory();
+    }
+
+    @Override
+    protected RouteFactory createRouteFactory() {
+        return new DefaultRouteFactory();
+    }
+
+    @Override
     protected MessageHistoryFactory createMessageHistoryFactory() {
         return new DefaultMessageHistoryFactory();
     }
@@ -320,18 +344,30 @@ public class FastCamelContext extends AbstractCamelContext implements CatalogCam
 
     @Override
     protected BeanProxyFactory createBeanProxyFactory() {
-        return new BaseServiceResolver<>(BeanProxyFactory.FACTORY, BeanProxyFactory.class)
-                .resolve(getCamelContextReference())
-                .orElseThrow(() -> new IllegalArgumentException("Cannot find BeanProxyFactory on classpath. "
-                        + "Add camel-bean to classpath."));
+        return new BaseServiceResolver<>(BeanProxyFactory.FACTORY, BeanProxyFactory.class,
+                getBootstrapFactoryFinder())
+                        .resolve(getCamelContextReference())
+                        .orElseThrow(() -> new IllegalArgumentException("Cannot find BeanProxyFactory on classpath. "
+                                + "Add camel-bean to classpath."));
+    }
+
+    @Override
+    protected AnnotationBasedProcessorFactory createAnnotationBasedProcessorFactory() {
+        return new DefaultAnnotationBasedProcessorFactory();
+    }
+
+    @Override
+    protected DeferServiceFactory createDeferServiceFactory() {
+        return new DefaultDeferServiceFactory();
     }
 
     @Override
     protected BeanProcessorFactory createBeanProcessorFactory() {
-        return new BaseServiceResolver<>(BeanProcessorFactory.FACTORY, BeanProcessorFactory.class)
-                .resolve(getCamelContextReference())
-                .orElseThrow(() -> new IllegalArgumentException("Cannot find BeanProcessorFactory on classpath. "
-                        + "Add camel-bean to classpath."));
+        return new BaseServiceResolver<>(BeanProcessorFactory.FACTORY, BeanProcessorFactory.class,
+                getBootstrapFactoryFinder())
+                        .resolve(getCamelContextReference())
+                        .orElseThrow(() -> new IllegalArgumentException("Cannot find BeanProcessorFactory on classpath. "
+                                + "Add camel-bean to classpath."));
     }
 
     @Override
@@ -393,10 +429,11 @@ public class FastCamelContext extends AbstractCamelContext implements CatalogCam
 
     @Override
     protected RestRegistryFactory createRestRegistryFactory() {
-        return new BaseServiceResolver<>(RestRegistryFactory.FACTORY, RestRegistryFactory.class)
-                .resolve(getCamelContextReference())
-                .orElseThrow(() -> new IllegalArgumentException("Cannot find RestRegistryFactory on classpath. "
-                        + "Add camel-rest to classpath."));
+        return new BaseServiceResolver<>(RestRegistryFactory.FACTORY, RestRegistryFactory.class,
+                getBootstrapFactoryFinder())
+                        .resolve(getCamelContextReference())
+                        .orElseThrow(() -> new IllegalArgumentException("Cannot find RestRegistryFactory on classpath. "
+                                + "Add camel-rest to classpath."));
     }
 
     @Override
@@ -425,14 +462,6 @@ public class FastCamelContext extends AbstractCamelContext implements CatalogCam
     }
 
     @Override
-    public AsyncProcessor createMulticast(Collection<Processor> processors, ExecutorService executor,
-            boolean shutdownExecutorService) {
-        return new MulticastProcessor(getCamelContextReference(), null, processors, null,
-                true, executor, shutdownExecutorService, false, false,
-                0, null, false, false);
-    }
-
-    @Override
     protected ConfigurerResolver createConfigurerResolver() {
         return new DefaultConfigurerResolver();
     }
@@ -444,8 +473,9 @@ public class FastCamelContext extends AbstractCamelContext implements CatalogCam
 
     @Override
     protected HealthCheckRegistry createHealthCheckRegistry() {
-        return new BaseServiceResolver<>(HealthCheckRegistry.FACTORY, HealthCheckRegistry.class)
-                .resolve(getCamelContextReference()).orElse(null);
+        return new BaseServiceResolver<>(HealthCheckRegistry.FACTORY, HealthCheckRegistry.class,
+                getBootstrapFactoryFinder())
+                        .resolve(getCamelContextReference()).orElse(null);
     }
 
     @Override
@@ -455,10 +485,12 @@ public class FastCamelContext extends AbstractCamelContext implements CatalogCam
 
     @Override
     protected RestBindingJaxbDataFormatFactory createRestBindingJaxbDataFormatFactory() {
-        return new BaseServiceResolver<>(RestBindingJaxbDataFormatFactory.FACTORY, RestBindingJaxbDataFormatFactory.class)
-                .resolve(getCamelContextReference())
-                .orElseThrow(() -> new IllegalArgumentException("Cannot find RestBindingJaxbDataFormatFactory on classpath. "
-                        + "Add camel-jaxb to classpath."));
+        return new BaseServiceResolver<>(RestBindingJaxbDataFormatFactory.FACTORY, RestBindingJaxbDataFormatFactory.class,
+                getBootstrapFactoryFinder())
+                        .resolve(getCamelContextReference())
+                        .orElseThrow(
+                                () -> new IllegalArgumentException("Cannot find RestBindingJaxbDataFormatFactory on classpath. "
+                                        + "Add camel-jaxb to classpath."));
     }
 
     @Override
@@ -576,6 +608,11 @@ public class FastCamelContext extends AbstractCamelContext implements CatalogCam
                 .createErrorHandler(processor);
     }
 
+    @Override
+    public void disposeModel() {
+        this.model = null;
+    }
+
     //
     // ModelCamelContext
     //
@@ -804,6 +841,16 @@ public class FastCamelContext extends AbstractCamelContext implements CatalogCam
     }
 
     @Override
+    public ModelReifierFactory getModelReifierFactory() {
+        return model.getModelReifierFactory();
+    }
+
+    @Override
+    public void setModelReifierFactory(ModelReifierFactory modelReifierFactory) {
+        model.setModelReifierFactory(modelReifierFactory);
+    }
+
+    @Override
     public void startRouteDefinitions(List<RouteDefinition> routeDefinitions) throws Exception {
         // indicate we are staring the route using this thread so
         // we are able to query this if needed
@@ -860,7 +907,7 @@ public class FastCamelContext extends AbstractCamelContext implements CatalogCam
 
     @Override
     public RouteDefinition adviceWith(RouteDefinition definition, AdviceWithRouteBuilder builder) throws Exception {
-        return RouteReifier.adviceWith(definition, this, builder);
+        return AdviceWith.adviceWith(definition, this, builder);
     }
 
     @SuppressWarnings("unchecked")
diff --git a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastModel.java b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastModel.java
index fd299a8..f266f57 100644
--- a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastModel.java
+++ b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastModel.java
@@ -22,5 +22,4 @@ public class FastModel extends BaseModel {
     public FastModel(CamelContext camelContext) {
         super(camelContext);
     }
-
 }
diff --git a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastTypeConverter.java b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastTypeConverter.java
index 6492338..2df9239 100644
--- a/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastTypeConverter.java
+++ b/extensions-core/core/runtime/src/main/java/org/apache/camel/quarkus/core/FastTypeConverter.java
@@ -25,7 +25,7 @@ public class FastTypeConverter extends DefaultTypeConverter {
     private static final Logger LOG = LoggerFactory.getLogger(FastTypeConverter.class);
 
     public FastTypeConverter() {
-        super(null, null, null, null, false);
+        super(null, null, null, false);
     }
 
     @Override
diff --git a/extensions/json-validator/runtime/pom.xml b/extensions/json-validator/runtime/pom.xml
index cb6ee35..d94e66e 100644
--- a/extensions/json-validator/runtime/pom.xml
+++ b/extensions/json-validator/runtime/pom.xml
@@ -56,6 +56,10 @@
             <groupId>org.apache.camel</groupId>
             <artifactId>camel-json-validator</artifactId>
         </dependency>
+        <dependency>
+            <groupId>org.jruby.joni</groupId>
+            <artifactId>joni</artifactId>
+        </dependency>
     </dependencies>
 
     <build>
diff --git a/extensions/leveldb/runtime/src/main/doc/limitations.adoc b/extensions/leveldb/runtime/src/main/doc/limitations.adoc
index e7ebff9..9b74c99 100644
--- a/extensions/leveldb/runtime/src/main/doc/limitations.adoc
+++ b/extensions/leveldb/runtime/src/main/doc/limitations.adoc
@@ -2,7 +2,13 @@ In native mode the extension uses a port of LevelDB written in Java (https://git
 which is within 10% of the performance of the C++ original. Please upvote https://github.com/apache/camel-quarkus/issues/1911[this issue]
 if you do not like the present state.
 
-This extension does not support binary payloads in native mode since object serialization is https://github.com/oracle/graal/issues/460[not supported] on GraalVM. To work around this limitation, the extension instead uses Jackson serializaton / deserialization.
+Serialization is https://github.com/oracle/graal/issues/460[not supported] on GraalVM. Extension has to use serializationization based
+on Jackson. Aggregation repository in native has to be constructed in one of the following ways:
+
+* Use class `QuarkusLevelDBAggregationRepository` instead of `LevelDBAggregationRepository`.
+* Configure jackson serializer on `LevelDBAggregationRepository` by calling `repo.setSerializer(new JacksonLevelDBSerializer());`
+
+Jackson serializer has limitation towards binary content. If payload object contains binary data (does not concern payloads which are completely binary), Jackson serialization and deserialization won't work correctly.
+To avoid this, define your own jackson serializer/deserealizer via `Module` and provide it to the aggragation repository
+(you can use for example the constructor of `QuarkusLevelDBAggregationRepository`).
 
-The problem will be solved when the camel-leveldb component is refactored to use Jackson and custom
-serializers (see https://issues.apache.org/jira/browse/CAMEL-15679[issue])
diff --git a/extensions/leveldb/runtime/src/main/java/org/apache/camel/quarkus/component/leveldb/ObjectCodecSubstitute.java b/extensions/leveldb/runtime/src/main/java/org/apache/camel/quarkus/component/leveldb/ObjectCodecSubstitute.java
deleted file mode 100644
index 8ab38a4..0000000
--- a/extensions/leveldb/runtime/src/main/java/org/apache/camel/quarkus/component/leveldb/ObjectCodecSubstitute.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You under the Apache License, Version 2.0
- * (the "License"); you may not use this file except in compliance with
- * the License.  You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package org.apache.camel.quarkus.component.leveldb;
-
-import java.io.DataInput;
-import java.io.DataOutput;
-import java.io.IOException;
-
-import com.fasterxml.jackson.annotation.JsonAutoDetect;
-import com.fasterxml.jackson.annotation.PropertyAccessor;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.oracle.svm.core.annotate.Inject;
-import com.oracle.svm.core.annotate.Substitute;
-import com.oracle.svm.core.annotate.TargetClass;
-import org.apache.camel.support.DefaultExchangeHolder;
-import org.fusesource.hawtbuf.codec.ObjectCodec;
-
-/**
- * This os workaround for serialization of DefaultExchangeHolder.
- * Once serialization is implemented in graalVM (see https://github.com/oracle/graal/issues/460), this substitution
- * could
- * be removed.
- */
-@TargetClass(value = ObjectCodec.class)
-final class ObjectCodecSubstitute {
-
-    @Inject
-    private ObjectMapper objectMapper;
-
-    @Substitute
-    public void encode(Object object, DataOutput dataOut) throws IOException {
-        if (objectMapper == null) {
-            objectMapper = new ObjectMapper();
-            objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE);
-            objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
-        }
-        objectMapper.writeValue(dataOut, object);
-    }
-
-    @Substitute
-    public Object decode(DataInput dataIn) throws IOException {
-        if (objectMapper == null) {
-            objectMapper = new ObjectMapper();
-            objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.NONE);
-            objectMapper.setVisibility(PropertyAccessor.FIELD, JsonAutoDetect.Visibility.ANY);
-        }
-        return objectMapper.readValue(dataIn, DefaultExchangeHolder.class);
-    }
-
-}
diff --git a/extensions/leveldb/runtime/src/main/java/org/apache/camel/quarkus/component/leveldb/QuarkusLevelDBAggregationRepository.java b/extensions/leveldb/runtime/src/main/java/org/apache/camel/quarkus/component/leveldb/QuarkusLevelDBAggregationRepository.java
new file mode 100644
index 0000000..7e930ec
--- /dev/null
+++ b/extensions/leveldb/runtime/src/main/java/org/apache/camel/quarkus/component/leveldb/QuarkusLevelDBAggregationRepository.java
@@ -0,0 +1,71 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.camel.quarkus.component.leveldb;
+
+import com.fasterxml.jackson.databind.Module;
+import org.apache.camel.component.leveldb.LevelDBAggregationRepository;
+import org.apache.camel.component.leveldb.LevelDBFile;
+import org.apache.camel.component.leveldb.serializer.JacksonLevelDBSerializer;
+
+public class QuarkusLevelDBAggregationRepository extends LevelDBAggregationRepository {
+
+    public QuarkusLevelDBAggregationRepository() {
+        initSerializer(null);
+    }
+
+    public QuarkusLevelDBAggregationRepository(String repositoryName) {
+        super(repositoryName);
+        initSerializer(null);
+    }
+
+    public QuarkusLevelDBAggregationRepository(String repositoryName, String persistentFileName) {
+        super(repositoryName, persistentFileName);
+        initSerializer(null);
+    }
+
+    public QuarkusLevelDBAggregationRepository(String repositoryName, LevelDBFile levelDBFile) {
+        super(repositoryName, levelDBFile);
+        initSerializer(null);
+    }
+
+    //constructor with module
+
+    public QuarkusLevelDBAggregationRepository(Module module) {
+        JacksonLevelDBSerializer serializer = new JacksonLevelDBSerializer(module);
+        initSerializer(module);
+    }
+
+    public QuarkusLevelDBAggregationRepository(String repositoryName, Module module) {
+        super(repositoryName);
+        initSerializer(module);
+    }
+
+    public QuarkusLevelDBAggregationRepository(String repositoryName, String persistentFileName, Module module) {
+        super(repositoryName, persistentFileName);
+        initSerializer(module);
+    }
+
+    public QuarkusLevelDBAggregationRepository(String repositoryName, LevelDBFile levelDBFile, Module module) {
+        super(repositoryName, levelDBFile);
+        initSerializer(module);
+    }
+
+    private void initSerializer(Module module) {
+        JacksonLevelDBSerializer serializer = new JacksonLevelDBSerializer(module);
+        setSerializer(serializer);
+    }
+}
diff --git a/extensions/microprofile-fault-tolerance/deployment/src/main/java/org/apache/camel/quarkus/component/microprofile/fault/tolerance/deployment/MicroprofileFaultToleranceProcessor.java b/extensions/microprofile-fault-tolerance/deployment/src/main/java/org/apache/camel/quarkus/component/microprofile/fault/tolerance/deployment/MicroprofileFaultToleranceProcessor.java
index d5b8b14..05673b1 100644
--- a/extensions/microprofile-fault-tolerance/deployment/src/main/java/org/apache/camel/quarkus/component/microprofile/fault/tolerance/deployment/MicroprofileFaultToleranceProcessor.java
+++ b/extensions/microprofile-fault-tolerance/deployment/src/main/java/org/apache/camel/quarkus/component/microprofile/fault/tolerance/deployment/MicroprofileFaultToleranceProcessor.java
@@ -18,6 +18,7 @@ package org.apache.camel.quarkus.component.microprofile.fault.tolerance.deployme
 
 import io.quarkus.deployment.annotations.BuildStep;
 import io.quarkus.deployment.builditem.FeatureBuildItem;
+import io.quarkus.deployment.builditem.nativeimage.NativeImageResourceBuildItem;
 
 class MicroprofileFaultToleranceProcessor {
 
@@ -27,4 +28,11 @@ class MicroprofileFaultToleranceProcessor {
     FeatureBuildItem feature() {
         return new FeatureBuildItem(FEATURE);
     }
+
+    @BuildStep
+    NativeImageResourceBuildItem initResources() {
+        return new NativeImageResourceBuildItem(
+                "META-INF/services/org/apache/camel/model/CircuitBreakerDefinition");
+    }
+
 }
diff --git a/extensions/qute/component/src/generated/java/org/apache/camel/component/qute/QuteComponentConfigurer.java b/extensions/qute/component/src/generated/java/org/apache/camel/component/qute/QuteComponentConfigurer.java
index 95e6cc2..eb7658e 100644
--- a/extensions/qute/component/src/generated/java/org/apache/camel/component/qute/QuteComponentConfigurer.java
+++ b/extensions/qute/component/src/generated/java/org/apache/camel/component/qute/QuteComponentConfigurer.java
@@ -4,6 +4,7 @@ package org.apache.camel.component.qute;
 import java.util.Map;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.spi.ConfigurerStrategy;
 import org.apache.camel.spi.GeneratedPropertyConfigurer;
 import org.apache.camel.spi.PropertyConfigurerGetter;
 import org.apache.camel.util.CaseInsensitiveMap;
@@ -23,6 +24,7 @@ public class QuteComponentConfigurer extends PropertyConfigurerSupport implement
         map.put("basicPropertyBinding", boolean.class);
         map.put("quteEngine", io.quarkus.qute.Engine.class);
         ALL_OPTIONS = map;
+        ConfigurerStrategy.addConfigurerClearer(QuteComponentConfigurer::clearConfigurers);
     }
 
     @Override
@@ -46,6 +48,13 @@ public class QuteComponentConfigurer extends PropertyConfigurerSupport implement
         return ALL_OPTIONS;
     }
 
+    public static void clearBootstrapConfigurers() {
+    }
+
+    public static void clearConfigurers() {
+        ALL_OPTIONS.clear();
+    }
+
     @Override
     public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
         QuteComponent target = (QuteComponent) obj;
diff --git a/extensions/qute/component/src/generated/java/org/apache/camel/component/qute/QuteEndpointConfigurer.java b/extensions/qute/component/src/generated/java/org/apache/camel/component/qute/QuteEndpointConfigurer.java
index 983fa1c..7e61ea5 100644
--- a/extensions/qute/component/src/generated/java/org/apache/camel/component/qute/QuteEndpointConfigurer.java
+++ b/extensions/qute/component/src/generated/java/org/apache/camel/component/qute/QuteEndpointConfigurer.java
@@ -4,6 +4,7 @@ package org.apache.camel.component.qute;
 import java.util.Map;
 
 import org.apache.camel.CamelContext;
+import org.apache.camel.spi.ConfigurerStrategy;
 import org.apache.camel.spi.GeneratedPropertyConfigurer;
 import org.apache.camel.spi.PropertyConfigurerGetter;
 import org.apache.camel.util.CaseInsensitiveMap;
@@ -27,6 +28,7 @@ public class QuteEndpointConfigurer extends PropertyConfigurerSupport implements
         map.put("basicPropertyBinding", boolean.class);
         map.put("synchronous", boolean.class);
         ALL_OPTIONS = map;
+        ConfigurerStrategy.addConfigurerClearer(QuteEndpointConfigurer::clearConfigurers);
     }
 
     @Override
@@ -54,6 +56,13 @@ public class QuteEndpointConfigurer extends PropertyConfigurerSupport implements
         return ALL_OPTIONS;
     }
 
+    public static void clearBootstrapConfigurers() {
+    }
+
+    public static void clearConfigurers() {
+        ALL_OPTIONS.clear();
+    }
+
     @Override
     public Object getOptionValue(Object obj, String name, boolean ignoreCase) {
         QuteEndpoint target = (QuteEndpoint) obj;
diff --git a/extensions/qute/component/src/generated/java/org/apache/camel/component/qute/QuteEndpointUriFactory.java b/extensions/qute/component/src/generated/java/org/apache/camel/component/qute/QuteEndpointUriFactory.java
index f24c41f..28b192e 100644
--- a/extensions/qute/component/src/generated/java/org/apache/camel/component/qute/QuteEndpointUriFactory.java
+++ b/extensions/qute/component/src/generated/java/org/apache/camel/component/qute/QuteEndpointUriFactory.java
@@ -39,14 +39,14 @@ public class QuteEndpointUriFactory extends org.apache.camel.support.component.E
     }
 
     @Override
-    public String buildUri(String scheme, Map<String, Object> properties) throws URISyntaxException {
+    public String buildUri(String scheme, Map<String, Object> properties, boolean encode) throws URISyntaxException {
         String syntax = scheme + BASE;
         String uri = syntax;
 
         Map<String, Object> copy = new HashMap<>(properties);
 
         uri = buildPathParameter(syntax, uri, "resourceUri", null, true, copy);
-        uri = buildQueryParameters(uri, copy);
+        uri = buildQueryParameters(uri, copy, encode);
         return uri;
     }
 
diff --git a/integration-tests/foundation/src/main/java/org/apache/camel/quarkus/component/foundation/it/mock/MockResource.java b/integration-tests/foundation/src/main/java/org/apache/camel/quarkus/component/foundation/it/mock/MockResource.java
index 6d0e29c..985a507 100644
--- a/integration-tests/foundation/src/main/java/org/apache/camel/quarkus/component/foundation/it/mock/MockResource.java
+++ b/integration-tests/foundation/src/main/java/org/apache/camel/quarkus/component/foundation/it/mock/MockResource.java
@@ -26,10 +26,10 @@ import javax.ws.rs.core.MediaType;
 
 import org.apache.camel.CamelContext;
 import org.apache.camel.ProducerTemplate;
+import org.apache.camel.builder.AdviceWith;
 import org.apache.camel.builder.AdviceWithRouteBuilder;
 import org.apache.camel.component.mock.MockEndpoint;
 import org.apache.camel.model.ModelCamelContext;
-import org.apache.camel.reifier.RouteReifier;
 import org.jboss.logging.Logger;
 import org.wildfly.common.Assert;
 
@@ -51,7 +51,7 @@ public class MockResource {
 
         // advice the first route using the inlined AdviceWith route builder
         // which has extended capabilities than the regular route builder
-        RouteReifier.adviceWith(context.adapt(ModelCamelContext.class).getRouteDefinition("forMocking"), context,
+        AdviceWith.adviceWith(context.adapt(ModelCamelContext.class).getRouteDefinition("forMocking"), context,
                 new AdviceWithRouteBuilder() {
                     @Override
                     public void configure() throws Exception {
diff --git a/integration-tests/leveldb/src/main/java/org/apache/camel/quarkus/component/leveldb/it/LeveldbRouteBuilder.java b/integration-tests/leveldb/src/main/java/org/apache/camel/quarkus/component/leveldb/it/LeveldbRouteBuilder.java
index ed9674f..a5f7b8b 100644
--- a/integration-tests/leveldb/src/main/java/org/apache/camel/quarkus/component/leveldb/it/LeveldbRouteBuilder.java
+++ b/integration-tests/leveldb/src/main/java/org/apache/camel/quarkus/component/leveldb/it/LeveldbRouteBuilder.java
@@ -24,6 +24,7 @@ import org.apache.camel.AggregationStrategy;
 import org.apache.camel.Exchange;
 import org.apache.camel.builder.RouteBuilder;
 import org.apache.camel.component.leveldb.LevelDBAggregationRepository;
+import org.apache.camel.quarkus.component.leveldb.QuarkusLevelDBAggregationRepository;
 
 public class LeveldbRouteBuilder extends RouteBuilder {
     public static final String DIRECT_START = "direct:start";
@@ -39,21 +40,22 @@ public class LeveldbRouteBuilder extends RouteBuilder {
 
     @Override
     public void configure() throws Exception {
-        LevelDBAggregationRepository repo = new LevelDBAggregationRepository("repo", DATA_FOLDER + "leveldb.dat");
+        LevelDBAggregationRepository repo = new QuarkusLevelDBAggregationRepository("repo", DATA_FOLDER + "leveldb.dat");
 
         from(DIRECT_START)
                 .aggregate(header("id"), new MyAggregationStrategy())
                 .completionSize(7).aggregationRepository(repo)
                 .to(MOCK_RESULT);
 
-        LevelDBAggregationRepository repoBinary = new LevelDBAggregationRepository("repo", DATA_FOLDER + "levelBinarydb.dat");
+        LevelDBAggregationRepository repoBinary = new QuarkusLevelDBAggregationRepository("repo",
+                DATA_FOLDER + "levelBinarydb.dat");
 
         from(DIRECT_BINARY)
                 .aggregate(header("id"), new BinaryAggregationStrategy())
                 .completionSize(3).aggregationRepository(repoBinary)
                 .to(MOCK_RESULT);
 
-        LevelDBAggregationRepository repoWithFailure = new LevelDBAggregationRepository("repoWithFailure",
+        LevelDBAggregationRepository repoWithFailure = new QuarkusLevelDBAggregationRepository("repoWithFailure",
                 DATA_FOLDER + "leveldbWithFailure.dat");
 
         repoWithFailure.setUseRecovery(true);
@@ -72,7 +74,7 @@ public class LeveldbRouteBuilder extends RouteBuilder {
                 .to(MOCK_RESULT)
                 .end();
 
-        LevelDBAggregationRepository repoDeadLetter = new LevelDBAggregationRepository("repoDeadLetter",
+        LevelDBAggregationRepository repoDeadLetter = new QuarkusLevelDBAggregationRepository("repoDeadLetter",
                 DATA_FOLDER + "leveldbDeadLetter.dat");
 
         repoDeadLetter.setUseRecovery(true);
diff --git a/integration-tests/leveldb/src/test/java/org/apache/camel/quarkus/component/leveldb/it/LeveldbIT.java b/integration-tests/leveldb/src/test/java/org/apache/camel/quarkus/component/leveldb/it/LeveldbIT.java
index e4fc4ba..743e2ab 100644
--- a/integration-tests/leveldb/src/test/java/org/apache/camel/quarkus/component/leveldb/it/LeveldbIT.java
+++ b/integration-tests/leveldb/src/test/java/org/apache/camel/quarkus/component/leveldb/it/LeveldbIT.java
@@ -20,8 +20,4 @@ import io.quarkus.test.junit.NativeImageTest;
 
 @NativeImageTest
 class LeveldbIT extends LeveldbTest {
-    @Override
-    boolean doeasBinaryDataWork() {
-        return false;
-    }
 }
diff --git a/integration-tests/leveldb/src/test/java/org/apache/camel/quarkus/component/leveldb/it/LeveldbTest.java b/integration-tests/leveldb/src/test/java/org/apache/camel/quarkus/component/leveldb/it/LeveldbTest.java
index 1ffa037..3d473b8 100644
--- a/integration-tests/leveldb/src/test/java/org/apache/camel/quarkus/component/leveldb/it/LeveldbTest.java
+++ b/integration-tests/leveldb/src/test/java/org/apache/camel/quarkus/component/leveldb/it/LeveldbTest.java
@@ -101,19 +101,7 @@ class LeveldbTest {
                 .statusCode(201)
                 .extract().as(Boolean.class);
 
-        if (doeasBinaryDataWork()) {
-            assertTrue(theSame);
-        } else {
-            assertFalse(theSame);
-        }
-    }
-
-    /**
-     * Until binary payload is not supported, in native binary test will fail.
-     * Needs https://issues.apache.org/jira/browse/CAMEL-15679
-     */
-    boolean doeasBinaryDataWork() {
-        return true;
+        assertTrue(theSame);
     }
 
     private Map<String, List<Map<String, Object>>> testAggregate(String path, List<String> messages) {
diff --git a/integration-tests/saga/src/main/java/org/apache/camel/quarkus/component/saga/it/SagaRoute.java b/integration-tests/saga/src/main/java/org/apache/camel/quarkus/component/saga/it/SagaRoute.java
index 32dc3cb..6196340 100644
--- a/integration-tests/saga/src/main/java/org/apache/camel/quarkus/component/saga/it/SagaRoute.java
+++ b/integration-tests/saga/src/main/java/org/apache/camel/quarkus/component/saga/it/SagaRoute.java
@@ -21,9 +21,9 @@ import javax.inject.Inject;
 
 import org.apache.camel.Exchange;
 import org.apache.camel.builder.RouteBuilder;
-import org.apache.camel.impl.saga.InMemorySagaService;
 import org.apache.camel.model.SagaPropagation;
 import org.apache.camel.saga.CamelSagaService;
+import org.apache.camel.saga.InMemorySagaService;
 
 @ApplicationScoped
 public class SagaRoute extends RouteBuilder {
diff --git a/pom.xml b/pom.xml
index 98b7973..7295173 100644
--- a/pom.xml
+++ b/pom.xml
@@ -45,7 +45,7 @@
         <awssdk1-swf-libs.version>1.11.22</awssdk1-swf-libs.version>
         <awssdk2.version>2.14.3</awssdk2.version>
         <bouncycastle.version>1.66</bouncycastle.version>
-        <camel.version>3.6.0</camel.version>
+        <camel.version>3.7.0-SNAPSHOT</camel.version>
         <commons-beanutils.version>1.9.4</commons-beanutils.version><!-- keep in sync with Camel -->
         <commons-cli.version>1.4</commons-cli.version><!-- keep in sync with Quarkus, via quarkus-bootstrap-core -->
         <commons-collections.version>3.2.2</commons-collections.version><!-- used by hbase, should be pretty stable as commons-collections are not developed actively anymore -->
@@ -72,6 +72,7 @@
         <jackson-asl.version>1.9.13</jackson-asl.version><!-- Mess in the transitive dependencies of spark and hbase-testing-util -->
         <java.xml.ws.version>2.3.1</java.xml.ws.version>
         <jcodings.version>1.0.55</jcodings.version><!-- used by hbase -->
+        <joni.version>2.1.31</joni.version><!-- used by json-validator -->
         <jaxen.version>1.2.0</jaxen.version>
         <javassist.version>3.22.0-CR2</javassist.version><!-- debezium -->
         <jersey-sun.version>1.19.4</jersey-sun.version><!-- Spark -->
diff --git a/poms/bom/pom.xml b/poms/bom/pom.xml
index ab3e1e7..6b7003a 100644
--- a/poms/bom/pom.xml
+++ b/poms/bom/pom.xml
@@ -656,6 +656,11 @@
             </dependency>
             <dependency>
                 <groupId>org.apache.camel</groupId>
+                <artifactId>camel-core-processor</artifactId>
+                <version>${camel.version}</version>
+            </dependency>
+            <dependency>
+                <groupId>org.apache.camel</groupId>
                 <artifactId>camel-couchbase</artifactId>
                 <version>${camel.version}</version>
             </dependency>
@@ -5602,6 +5607,11 @@
                 <version>${jcodings.version}</version>
             </dependency>
             <dependency>
+                <groupId>org.jruby.joni</groupId>
+                <artifactId>joni</artifactId>
+                <version>${joni.version}</version>
+            </dependency>
+            <dependency>
                 <groupId>org.springframework</groupId>
                 <artifactId>spring-aop</artifactId>
                 <version>${spring.version}</version>