You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by gi...@apache.org on 2026/10/13 08:31:33 UTC
(camel-website-pub) branch asf-site updated: Website updated to cd918dff1316c762be74a50252eb1e21dd2bbf4f
This is an automated email from the ASF dual-hosted git repository.
asf-gitbox-commits pushed a commit to branch asf-site
in repository https://gitbox.apache.org/repos/asf/camel-website-pub.git
The following commit(s) were added to refs/heads/asf-site by this push:
new 6ee96ecf05 Website updated to cd918dff1316c762be74a50252eb1e21dd2bbf4f
6ee96ecf05 is described below
commit 6ee96ecf05e3fb6766e5aca6ed88b37610eb1f88
Author: jenkins <bu...@apache.org>
AuthorDate: Tue Oct 13 08:31:24 2026 +0000
Website updated to cd918dff1316c762be74a50252eb1e21dd2bbf4f
---
.htaccess | 10 +-
.well-known/security.txt | 2 +-
camel-quarkus/next/migration-guide/3.40.0.html | 4 +-
camel-quarkus/next/migration-guide/3.40.0.md | 26 +-
camel-quarkus/next/migration-guide/4.0.0.html | 2 +-
camel-quarkus/next/migration-guide/4.0.0.md | 18 +-
.../next/reference/extensions/salesforce.html | 3 +-
.../next/reference/extensions/salesforce.md | 40 +
camel-spring-boot/next/list.html | 2 +-
camel-spring-boot/next/list.md | 2 +-
camel-spring-boot/next/starters/wasm.html | 2 +-
camel-spring-boot/next/starters/wasm.md | 4 +-
components/next/atom-component.html | 2 +-
components/next/atom-component.md | 2 +-
.../next/dataformats/swiftMt-dataformat.html | 2 +-
components/next/dataformats/swiftMt-dataformat.md | 8 +
.../next/dataformats/swiftMx-dataformat.html | 2 +-
components/next/dataformats/swiftMx-dataformat.md | 8 +
components/next/dfdl-component.html | 2 +-
components/next/dfdl-component.md | 2 -
components/next/eips/saga-eip.html | 2 +-
components/next/eips/saga-eip.md | 2 +
components/next/index.html | 2 +-
components/next/index.md | 2 +-
components/next/jpa-component.html | 2 +-
components/next/jpa-component.md | 2 +
components/next/others/main.html | 2 +-
components/next/others/main.md | 3 +-
components/next/rss-component.html | 2 +-
components/next/rss-component.md | 2 +-
components/next/wasm-component.html | 94 +-
components/next/wasm-component.md | 252 +-
manual/camel-4x-upgrade-guide-4_18.html | 2 +-
manual/camel-4x-upgrade-guide-4_18.md | 8 +
manual/camel-4x-upgrade-guide-4_22.html | 2 +-
manual/camel-4x-upgrade-guide-4_22.md | 14 +
manual/camel-4x-upgrade-guide-4_23.html | 112 +-
manual/camel-4x-upgrade-guide-4_23.md | 3418 ++++++++--------
manual/camel-4x-upgrade-guide-4_24.html | 2 +-
manual/camel-4x-upgrade-guide-4_24.md | 131 +-
manual/camel-jbang-projects.html | 2 +-
manual/camel-jbang-projects.md | 1 -
manual/camel-jbang-tui-source-editor.html | 2 +-
manual/camel-jbang-tui-source-editor.md | 1 +
manual/camel-report-maven-plugin.html | 2 +-
manual/camel-report-maven-plugin.md | 2 +
manual/jbang-commands/camel-jbang-commands.html | 2 +-
manual/jbang-commands/camel-jbang-commands.md | 1 -
.../jbang-commands/camel-jbang-route-parser.html | 1 -
manual/jbang-commands/camel-jbang-route-parser.md | 21 -
site-manifest.json | 8 +-
sitemap-camel-core.md | 16 +-
sitemap-camel-core.xml | 16 +-
sitemap-camel-k.md | 738 ++--
sitemap-camel-k.xml | 738 ++--
sitemap-camel-kafka-connector.md | 438 +-
sitemap-camel-kafka-connector.xml | 438 +-
sitemap-camel-kamelets.md | 1536 +++----
sitemap-camel-kamelets.xml | 1536 +++----
sitemap-camel-karaf.md | 6 +-
sitemap-camel-karaf.xml | 6 +-
sitemap-camel-quarkus.md | 2386 +++++------
sitemap-camel-quarkus.xml | 2386 +++++------
sitemap-camel-spring-boot.md | 1780 ++++-----
sitemap-camel-spring-boot.xml | 1780 ++++-----
sitemap-components.md | 4222 ++++++++++----------
sitemap-components.xml | 4222 ++++++++++----------
sitemap-manual.md | 769 ++--
sitemap-manual.xml | 770 ++--
69 files changed, 14191 insertions(+), 13834 deletions(-)
diff --git a/.htaccess b/.htaccess
index 669ff2a42f..0b374fc386 100644
--- a/.htaccess
+++ b/.htaccess
@@ -3,8 +3,16 @@ RewriteEngine on
RewriteBase "/"
# Content negotiation for LLM-friendly Markdown
-# When Accept header requests text/markdown, serve .md instead of .html
+# Coding agents ask for Markdown in the Accept header; Claude Code, for example, sends
+# "Accept: text/markdown, text/html, */*" when it fetches a page. An agent that opens the
+# home page gets llms.txt, the Markdown index of the documentation, instead of the HTML
+# home page, so it finds the docs and their Markdown copies from there.
RewriteCond %{HTTP_ACCEPT} text/markdown [NC]
+RewriteRule ^index\.html$ llms.txt [L]
+# Any other page is served as its .md copy when it has one; pages without a copy stay HTML
+RewriteCond %{HTTP_ACCEPT} text/markdown [NC]
+RewriteCond %{REQUEST_FILENAME} ^(.+)\.html$
+RewriteCond %1.md -f
RewriteRule ^(.+)\.html$ $1.md [L]
RewriteRule "^security-advisories.data/(.+)$" "security/$1" [R=permanent,L]
diff --git a/.well-known/security.txt b/.well-known/security.txt
index c15a260c68..bfce3748ea 100644
--- a/.well-known/security.txt
+++ b/.well-known/security.txt
@@ -2,4 +2,4 @@ Canonical: https://camel.apache.com/.well-known/security.txt
Contact: mailto:security@apache.org
Encryption: https://www.apache.org/security/KEYS.txt
Policy: https://www.apache.org/security/
-Expires: 2027-10-12T14:37:57Z
+Expires: 2027-10-13T08:02:23Z
diff --git a/camel-quarkus/next/migration-guide/3.40.0.html b/camel-quarkus/next/migration-guide/3.40.0.html
index 84ee650a4f..94c067bb7e 100644
--- a/camel-quarkus/next/migration-guide/3.40.0.html
+++ b/camel-quarkus/next/migration-guide/3.40.0.html
@@ -11,5 +11,5 @@ quarkus.tls.cipher-suites=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256</code></pre> </d
parserFactory.setNamespaceAware(true);
// Configure the parser as required, then hand the transformer a reader of your own
Source source = new SAXSource(parserFactory.newSAXParser().getXMLReader(), inputSource);</code></pre> </div> </div> <div class="paragraph"> <p><code>DOMSource</code> and <code>StAXSource</code> bodies are parsed before they reach the transformer and are unaffected.</p> </div> </div> <div class="sect2"> <h3 id="_document_is_denied_unless_a_uriresolver_resolves_it"><a class="anchor" href="#_document_is_denied_unless_a_uriresolver_resolves_it"></a>document() is denied unless a URIResolver r [...]
-transformer.setURIResolver(myResolver);</code></pre> </div> </div> <div class="paragraph"> <p><code>xsl:import</code> and <code>xsl:include</code> are unchanged. Xalan dereferences those hrefs itself while compiling a stylesheet, ignoring the resolver it consulted first, so they cannot be restricted here. Stylesheets are deployment owned rather than attacker controlled, and camel-xslt resolves includes through its own unrestricted resolver in any case.</p> </div> </div> <div class="sect2 [...]
-quarkus.avro.trusted-classes=com.acme.LegacyOrder</code></pre> </div> </div> <div class="paragraph"> <p>Avro’s own <code>org.apache.avro.SERIALIZABLE_PACKAGES</code> and <code>org.apache.avro.SERIALIZABLE_CLASSES</code> system properties still work as an addendum, since Quarkus adds its trusted classes on top of them rather than replacing them. They are read once, when Avro initializes, so they have to be set on the command line. Note that <code>*</code> in <code>org.apache.avro.SE [...]
\ No newline at end of file
+transformer.setURIResolver(myResolver);</code></pre> </div> </div> <div class="paragraph"> <p><code>xsl:import</code> and <code>xsl:include</code> are unchanged. Xalan dereferences those hrefs itself while compiling a stylesheet, ignoring the resolver it consulted first, so they cannot be restricted here. Stylesheets are deployment owned rather than attacker controlled, and camel-xslt resolves includes through its own unrestricted resolver in any case.</p> </div> </div> <div class="sect2 [...]
+quarkus.avro.trusted-classes=com.acme.LegacyOrder</code></pre> </div> </div> <div class="paragraph"> <p>Avro’s own <code>org.apache.avro.SERIALIZABLE_PACKAGES</code> and <code>org.apache.avro.SERIALIZABLE_CLASSES</code> system properties still work as an addendum, since Quarkus adds its trusted classes on top of them rather than replacing them. They are read once, when Avro initializes, so they have to be set on the command line. Note that <code>*</code> in <code>org.apache.avro.SE [...]
\ No newline at end of file
diff --git a/camel-quarkus/next/migration-guide/3.40.0.md b/camel-quarkus/next/migration-guide/3.40.0.md
index b23f6de60d..a1a0d312a3 100644
--- a/camel-quarkus/next/migration-guide/3.40.0.md
+++ b/camel-quarkus/next/migration-guide/3.40.0.md
@@ -230,7 +230,7 @@ java.lang.SecurityException: Forbidden com.acme.orders.avro.Order! This class is
Classes annotated with `@org.apache.avro.specific.AvroGenerated` are trusted automatically, which covers everything produced by the `generate-code` goal of `quarkus-maven-plugin` from `src/main/avro`. Nothing needs to be done for those.
-Specific records that predate that annotation, which Avro added in 1.9.0, or that were written by hand, have to be trusted explicitly. Prefer the Quarkus configuration properties, which are resolved at build time and so apply in both JVM and native mode:
+Specific records without that annotation, such as those written by hand, have to be trusted explicitly. Prefer the Quarkus configuration properties, which are resolved at build time and so apply in both JVM and native mode:
```properties
quarkus.avro.trusted-packages=com.acme.orders.avro
@@ -239,4 +239,26 @@ quarkus.avro.trusted-classes=com.acme.LegacyOrder
Avro’s own `org.apache.avro.SERIALIZABLE_PACKAGES` and `org.apache.avro.SERIALIZABLE_CLASSES` system properties still work as an addendum, since Quarkus adds its trusted classes on top of them rather than replacing them. They are read once, when Avro initializes, so they have to be set on the command line. Note that `*` in `org.apache.avro.SERIALIZABLE_PACKAGES` disables the class loading protection entirely.
-Whichever route is used, list only the packages holding your own Avro model classes.
\ No newline at end of file
+Whichever route is used, list only the packages holding your own Avro model classes.
+
+## Salesforce extension changes
+
+### Pub / Sub API event classes must be trusted by Avro
+
+The Salesforce Pub / Sub API encodes events with Avro, so the Avro change described above also applies to routes that use `pubSubSubscribe` or `pubSubPublish`.
+
+The most likely case to be affected is a subscription with `pubSubDeserializeType=POJO`. The class configured on `pubSubPojoClass` is a plain class, so it is never trusted automatically and each event now fails with:
+
+```text
+java.lang.SecurityException: Forbidden org.foo.TestEvent! This class is not trusted to be included in Avro schemas.
+```
+
+Trust the class, or its package, in `application.properties`.
+
+```properties
+quarkus.avro.trusted-classes=org.foo.TestEvent
+```
+
+Subscriptions with the default `AVRO` type, or with `SPECIFIC_RECORD`, map events to the Avro `SpecificRecord` classes in the `com.sforce.eventbus` package. Those are trusted automatically if they are annotated with `@org.apache.avro.specific.AvroGenerated`, and only need to be trusted explicitly if they lack that annotation, for example because they were written by hand. The `GENERIC_RECORD` and `JSON` types are unaffected.
+
+Refer to the [Salesforce extension documentation](../reference/extensions/salesforce.html#extensions-salesforce-usage-trusting-classes-used-with-the-pub-sub-api) for details.
\ No newline at end of file
diff --git a/camel-quarkus/next/migration-guide/4.0.0.html b/camel-quarkus/next/migration-guide/4.0.0.html
index 163263a153..1ef2a40927 100644
--- a/camel-quarkus/next/migration-guide/4.0.0.html
+++ b/camel-quarkus/next/migration-guide/4.0.0.html
@@ -5,4 +5,4 @@ factory.setAttribute(XMLConstants.ACCESS_EXTERNAL_STYLESHEET, "");</code></pre>
<groupId>org.apache.camel.quarkus</groupId>
<artifactId>camel-quarkus-junit</artifactId>
<scope>test</scope>
-</dependency></code></pre> </div> </div> <div class="paragraph"> <p>Any remaining imports of <code>org.apache.camel.test.junit5</code> in your tests must be updated to <code>org.apache.camel.test.junit6</code>. Refer to the <a href="3.31.0.html" class="xref page">Camel Quarkus 3.31.0 migration guide</a> for details.</p> </div> </div> </div> </article> <aside class="toc sidebar" aria-label="Table of contents" data-title="Contents" data-levels="2"> <div class="toc-menu"></div> </asid [...]
\ No newline at end of file
+</dependency></code></pre> </div> </div> <div class="paragraph"> <p>Any remaining imports of <code>org.apache.camel.test.junit5</code> in your tests must be updated to <code>org.apache.camel.test.junit6</code>. Refer to the <a href="3.31.0.html" class="xref page">Camel Quarkus 3.31.0 migration guide</a> for details.</p> </div> </div> </div> <div class="sect1"> <h2 id="_management_extension_honors_camel_main_jmxmanagementnamepattern"><a class="anchor" href="#_management_extension_ho [...]
\ No newline at end of file
diff --git a/camel-quarkus/next/migration-guide/4.0.0.md b/camel-quarkus/next/migration-guide/4.0.0.md
index 4d43b3da1d..8685da812c 100644
--- a/camel-quarkus/next/migration-guide/4.0.0.md
+++ b/camel-quarkus/next/migration-guide/4.0.0.md
@@ -59,4 +59,20 @@ Replace any dependency on `org.apache.camel.quarkus:camel-quarkus-junit5` with `
</dependency>
```
-Any remaining imports of `org.apache.camel.test.junit5` in your tests must be updated to `org.apache.camel.test.junit6`. Refer to the [Camel Quarkus 3.31.0 migration guide](3.31.0.md) for details.
\ No newline at end of file
+Any remaining imports of `org.apache.camel.test.junit5` in your tests must be updated to `org.apache.camel.test.junit6`. Refer to the [Camel Quarkus 3.31.0 migration guide](3.31.0.md) for details.
+
+## Management extension honors `camel.main.jmxManagementNamePattern`
+
+In previous releases, the `camel-quarkus-management` extension ignored the `camel.main.jmxManagementNamePattern` option, and the CamelContext management name was always the CamelContext name.
+
+The option is now honored. If your application sets `camel.main.jmxManagementNamePattern`, the CamelContext management name and the `context` key of the Camel MBean `ObjectName` values change to the name resolved from the pattern.
+
+For example, with the following configuration, Camel MBeans that were previously registered under `org.apache.camel:context=camel-1` are now registered under `org.apache.camel:context=custom-camel-1`.
+
+```properties
+camel.main.jmxManagementNamePattern = custom-#name#
+```
+
+Anything that refers to the Camel MBeans by `ObjectName`, such as monitoring tools or Jolokia requests, must be updated to use the new name. To retain the previous behavior, remove `camel.main.jmxManagementNamePattern` from the application configuration.
+
+Applications that do not set `camel.main.jmxManagementNamePattern` are unaffected.
\ No newline at end of file
diff --git a/camel-quarkus/next/reference/extensions/salesforce.html b/camel-quarkus/next/reference/extensions/salesforce.html
index b683edd6fc..dc93dd50f3 100644
--- a/camel-quarkus/next/reference/extensions/salesforce.html
+++ b/camel-quarkus/next/reference/extensions/salesforce.html
@@ -24,7 +24,8 @@
</configuration>
</execution>
</executions>
-</plugin></code></pre> </div> </div> </div> <div class="sect2"> <h3 id="extensions-salesforce-usage-native-mode-support-for-pub-sub-api-with-pojo-pubsubdeserializetype"><a class="anchor" href="#extensions-salesforce-usage-native-mode-support-for-pub-sub-api-with-pojo-pubsubdeserializetype"></a>Native mode support for Pub / Sub API with POJO <code>pubSubDeserializeType</code></h3> <div class="paragraph"> <p>When using the Camel Salesforce Pub / Sub API and <code>pubSubDeserializeTyp [...]
+</plugin></code></pre> </div> </div> </div> <div class="sect2"> <h3 id="extensions-salesforce-usage-trusting-classes-used-with-the-pub-sub-api"><a class="anchor" href="#extensions-salesforce-usage-trusting-classes-used-with-the-pub-sub-api"></a>Trusting classes used with the Pub / Sub API</h3> <div class="paragraph"> <p>The Pub / Sub API exchanges events encoded with Avro. Since Avro 1.12.2, classes that events are mapped to must be explicitly trusted, otherwise the event is reject [...]
+ .log("Received Salesforce POJO topic message: ${body}");</code></pre> </div> </div> <div class="paragraph"> <p>Class <code>org.foo.TestEvent</code> would need to be trusted in <code>application.properties</code>.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-properties hljs" data-lang="properties">quarkus.avro.trusted-classes=org.foo.TestEvent</code></pre> </div> </div> <div class="paragraph"> <p>Alternatively, tr [...]
.log("Received Salesforce POJO topic message: ${body}");</code></pre> </div> </div> <div class="paragraph"> <p>Class <code>org.foo.TestEvent</code> would need to be registered for reflection.</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">package org.foo;
import io.quarkus.runtime.annotations.RegisterForReflection;
diff --git a/camel-quarkus/next/reference/extensions/salesforce.md b/camel-quarkus/next/reference/extensions/salesforce.md
index c4a3198a88..35c20236fb 100644
--- a/camel-quarkus/next/reference/extensions/salesforce.md
+++ b/camel-quarkus/next/reference/extensions/salesforce.md
@@ -59,6 +59,46 @@ To generate Salesforce DTOs for your project, use the `salesforce-maven-plugin`.
</plugin>
```
+### Trusting classes used with the Pub / Sub API
+
+The Pub / Sub API exchanges events encoded with Avro. Since Avro 1.12.2, classes that events are mapped to must be explicitly trusted, otherwise the event is rejected with:
+
+```text
+java.lang.SecurityException: Forbidden org.foo.TestEvent! This class is not trusted to be included in Avro schemas.
+```
+
+Whether anything needs to be trusted depends on the `pubSubDeserializeType` of the subscribing endpoint.
+
+
+| `pubSubDeserializeType` | Classes to trust |
+| --- | --- |
+| `AVRO` (default), `SPECIFIC_RECORD` | The Avro `SpecificRecord` classes in the `com.sforce.eventbus` package that events are mapped to. Classes annotated with `@org.apache.avro.specific.AvroGenerated` are trusted automatically, which covers classes generated by the Avro compiler. Only classes without that annotation, such as those written by hand, need to be trusted explicitly. |
+| `POJO` | The class configured on the `pubSubPojoClass` option. This is always required, as it is a plain class that Avro maps to reflectively. |
+| `GENERIC_RECORD`, `JSON` | None. |
+
+For example, given the following route.
+
+```java
+from("salesforce:pubSubSubscribe:/event/TestEvent__e?pubSubDeserializeType=POJO&pubSubPojoClass=org.foo.TestEvent")
+ .log("Received Salesforce POJO topic message: ${body}");
+```
+
+Class `org.foo.TestEvent` would need to be trusted in `application.properties`.
+
+```properties
+quarkus.avro.trusted-classes=org.foo.TestEvent
+```
+
+Alternatively, trust every class in a package and its sub-packages. List only the packages holding your own event classes.
+
+```properties
+quarkus.avro.trusted-packages=org.foo
+```
+
+Publishing with `pubSubPublish` does not require the message body class to be trusted. However, if an Avro `SpecificRecord` class exists for the topic in the `com.sforce.eventbus` package, then publishing a POJO body requires that class to be trusted in the same way as for subscribing.
+
+Refer to the [Avro extension documentation](avro.html#extensions-avro-configuration-trusted-classes) for more information.
+
### Native mode support for Pub / Sub API with POJO `pubSubDeserializeType`
When using the Camel Salesforce Pub / Sub API and `pubSubDeserializeType` is configured as `POJO`, you must register any classes configured on the `pubSubPojoClass` option for reflection.
diff --git a/camel-spring-boot/next/list.html b/camel-spring-boot/next/list.html
index dba6c06f54..2151a64d2b 100644
--- a/camel-spring-boot/next/list.html
+++ b/camel-spring-boot/next/list.html
@@ -1 +1 @@
-<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>Component Starters :: Apache Camel</title> <link rel="canonical" href="https://camel.apache.org/camel-spring-boot/4.22.x/list.html"> <meta name="generator" content="Antora 3.2.0"> <link rel="stylesheet" href="../../_/css/vendor/docsearch-5db8a73adb.css"> <link rel="stylesheet" href="../../_/css/site-fcc1ff1ab1.css"> <meta name="application-name" conten [...]
\ No newline at end of file
+<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>Component Starters :: Apache Camel</title> <link rel="canonical" href="https://camel.apache.org/camel-spring-boot/4.22.x/list.html"> <meta name="generator" content="Antora 3.2.0"> <link rel="stylesheet" href="../../_/css/vendor/docsearch-5db8a73adb.css"> <link rel="stylesheet" href="../../_/css/site-fcc1ff1ab1.css"> <meta name="application-name" conten [...]
\ No newline at end of file
diff --git a/camel-spring-boot/next/list.md b/camel-spring-boot/next/list.md
index 1666201b90..a5722d6bff 100644
--- a/camel-spring-boot/next/list.md
+++ b/camel-spring-boot/next/list.md
@@ -1260,7 +1260,7 @@ Number of Camel components: 0 in 0 JAR artifacts (0 deprecated)
| [Vert.x](../../components/next/vertx-component.md) | camel-vertx-starter | Stable | 2.12 | Send and receive messages to/from Vert.x Event Bus. |
| [Vert.x HTTP Client](../../components/next/vertx-http-component.md) | camel-vertx-http-starter | Stable | 3.5 | Send requests to external HTTP servers using Vert.x |
| [Vert.x WebSocket](../../components/next/vertx-websocket-component.md) | camel-vertx-websocket-starter | Stable | 3.5 | Expose WebSocket endpoints and connect to remote WebSocket servers using Vert.x |
-| [Wasm](../../components/next/wasm-component.md) | camel-wasm-starter | Experimental | 4.4 | Invoke Wasm functions. |
+| [Wasm](../../components/next/wasm-component.md) | camel-wasm-starter | Experimental | 4.4 | Run Wasm programs (WASI Preview 1 command modules) with the message body as standard input. |
| [Weather](../../components/next/weather-component.md) | camel-weather-starter | Stable | 2.12 | Poll the weather information from Open Weather Map. |
| [weaviate](../../components/next/weaviate-component.md) | camel-weaviate-starter | Stable | 4.12 | Perform operations on the Weaviate Vector Database. |
| [Web3j Ethereum Blockchain](../../components/next/web3j-component.md) | camel-web3j-starter | Stable | 2.22 | Interact with Ethereum nodes using web3j client API. |
diff --git a/camel-spring-boot/next/starters/wasm.html b/camel-spring-boot/next/starters/wasm.html
index 3fe378bc8b..91de8a0e5d 100644
--- a/camel-spring-boot/next/starters/wasm.html
+++ b/camel-spring-boot/next/starters/wasm.html
@@ -1,4 +1,4 @@
-<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>Wasm :: Apache Camel</title> <link rel="canonical" href="https://camel.apache.org/camel-spring-boot/4.22.x/starters/wasm.html"> <meta name="generator" content="Antora 3.2.0"> <link rel="stylesheet" href="../../../_/css/vendor/docsearch-5db8a73adb.css"> <link rel="stylesheet" href="../../../_/css/site-fcc1ff1ab1.css"> <meta name="application-name" conte [...]
+<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>Wasm :: Apache Camel</title> <link rel="canonical" href="https://camel.apache.org/camel-spring-boot/4.22.x/starters/wasm.html"> <meta name="generator" content="Antora 3.2.0"> <link rel="stylesheet" href="../../../_/css/vendor/docsearch-5db8a73adb.css"> <link rel="stylesheet" href="../../../_/css/site-fcc1ff1ab1.css"> <meta name="application-name" conte [...]
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-wasm-starter</artifactId>
</dependency></code></pre> </div> </div> </div> </div> <div class="sect1"> <h2 id="_spring_boot_auto_configuration"><a class="anchor" href="#_spring_boot_auto_configuration"></a>Spring Boot Auto-Configuration</h2> <div class="sectionbody"> <div class="paragraph"> <p>The starter supports 5 options, which are listed below.</p> </div> <div class="table-wrapper"><table class="tableblock frame-all grid-all stretch"> <colgroup> <col> <col> <col> <col> </colgroup> <thead> <tr> <th class=" [...]
\ No newline at end of file
diff --git a/camel-spring-boot/next/starters/wasm.md b/camel-spring-boot/next/starters/wasm.md
index 5c406e4b5a..18eb72070a 100644
--- a/camel-spring-boot/next/starters/wasm.md
+++ b/camel-spring-boot/next/starters/wasm.md
@@ -1,10 +1,10 @@
# Wasm
-Invoke Wasm functions.
+Run Wasm programs (WASI Preview 1 command modules) with the message body as standard input.
## What’s inside
-- [Wasm component](../../../components/next/wasm-component.md), URI syntax: `wasm:functionName`
+- [Wasm component](../../../components/next/wasm-component.md), URI syntax: `wasm:module`
- [Wasm language](../../../components/next/languages/wasm-language.md)
diff --git a/components/next/atom-component.html b/components/next/atom-component.html
index 5e46eb57c6..20c4e2ed67 100644
--- a/components/next/atom-component.html
+++ b/components/next/atom-component.html
@@ -3,7 +3,7 @@
<artifactId>camel-atom</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
-</dependency></code></pre> </div> </div> </div> </div> <div class="sect1"> <h2 id="_uri_format"><a class="anchor" href="#_uri_format"></a>URI format</h2> <div class="sectionbody"> <div class="listingblock"> <div class="content"> <pre>atom://atomUri[?options]</pre> </div> </div> <div class="paragraph"> <p>Where <strong>atomUri</strong> is the URI to the Atom feed to poll.</p> </div> </div> </div> <div class="sect1"> <h2 id="_configuring_options"><a class="anchor" href="#_configuring [...]
+</dependency></code></pre> </div> </div> </div> </div> <div class="sect1"> <h2 id="_uri_format"><a class="anchor" href="#_uri_format"></a>URI format</h2> <div class="sectionbody"> <div class="listingblock"> <div class="content"> <pre>atom://atomUri[?options]</pre> </div> </div> <div class="paragraph"> <p>Where <strong>atomUri</strong> is the URI to the Atom feed to poll.</p> </div> </div> </div> <div class="sect1"> <h2 id="_configuring_options"><a class="anchor" href="#_configuring [...]
<from uri="atom://http://macstrac.blogspot.com/feeds/posts/default?idempotent=false"/>
<to uri="..."/>
</route></code></pre> </div> </div> </div> <div id="_tabs_1_yaml--panel" class="tabpanel" aria-labelledby="_tabs_1_yaml"> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-yaml hljs" data-lang="yaml">- route:
diff --git a/components/next/atom-component.md b/components/next/atom-component.md
index 70eca85e67..609fef4c5a 100644
--- a/components/next/atom-component.md
+++ b/components/next/atom-component.md
@@ -102,7 +102,7 @@ With the following _path_ and _query_ parameters:
| Name | Description | Default | Type |
| --- | --- | --- | --- |
| **sendEmptyMessageWhenIdle** (consumer) | If the polling consumer did not poll any files, you can enable this option to send an empty message (no body) instead. | false | boolean |
-| **sortEntries** (consumer) | Sets whether to sort entries by published date. Only works when splitEntries = true. | false | boolean |
+| **sortEntries** (consumer) | Sets whether to sort entries by updated date (by published date for an entry without an updated date), so the oldest entry is routed first. Only works when splitEntries = true. | false | boolean |
| **splitEntries** (consumer) | Sets whether or not entries should be sent individually or whether the entire feed should be sent as a single message. | true | boolean |
| **throttleEntries** (consumer) | Sets whether all entries identified in a single feed poll should be delivered immediately. If true, only one entry is processed per delay. Only applicable when splitEntries = true. | true | boolean |
| **bridgeErrorHandler** (consumer (advanced)) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions (if possible) occurred while the Camel consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. Important: This is only possible if the 3rd party component allows Camel to be alerted if an exception was thrown. Some components handle this internally only, and theref [...]
diff --git a/components/next/dataformats/swiftMt-dataformat.html b/components/next/dataformats/swiftMt-dataformat.html
index 8ccfda4027..71fb56b4a4 100644
--- a/components/next/dataformats/swiftMt-dataformat.html
+++ b/components/next/dataformats/swiftMt-dataformat.html
@@ -64,7 +64,7 @@
- unmarshal:
swiftMt: {}
- to:
- uri: bean:newOrder</code></pre> </div> </div> </div> </div> </div> </div> </div> <div class="sect1"> <h2 id="_dependencies"><a class="anchor" href="#_dependencies"></a>Dependencies</h2> <div class="sectionbody"> <div class="paragraph"> <p>To use SWIFT MT in your Camel routes, you need to add a dependency on <strong>camel-swift</strong> which implements this data format.</p> </div> <div class="paragraph"> <p>If you use Maven, you can add the following to your <code>pom.xml</co [...]
+ uri: bean:newOrder</code></pre> </div> </div> </div> </div> </div> </div> </div> <div class="sect1"> <h2 id="_translating_between_mt_and_mx"><a class="anchor" href="#_translating_between_mt_and_mx"></a>Translating between MT and MX</h2> <div class="sectionbody"> <div class="paragraph"> <p>The SWIFT MT and <a href="swiftMx-dataformat.html" class="xref page">SWIFT MX</a> data formats read and write messages, but they do not translate one format into the other. They also do not [...]
<groupId>org.apache.camel</groupId>
<artifactId>camel-swift</artifactId>
<version>x.x.x</version> <!-- use the same version as your Camel core version -->
diff --git a/components/next/dataformats/swiftMt-dataformat.md b/components/next/dataformats/swiftMt-dataformat.md
index 8e1815f6f0..c46eedbb45 100644
--- a/components/next/dataformats/swiftMt-dataformat.md
+++ b/components/next/dataformats/swiftMt-dataformat.md
@@ -177,6 +177,14 @@ from("file://data.bin")
uri: bean:newOrder
```
+## Translating between MT and MX
+
+The SWIFT MT and [SWIFT MX](swiftMx-dataformat.md) data formats read and write messages, but they do not translate one format into the other. They also do not validate messages against SWIFT network rules or usage guidelines such as CBPR+ or SEPA.
+
+To convert a message, such as an MT103 into a pacs.008, unmarshal it with SWIFT MT, map the fields to an ISO 20022 model class such as `MxPacs00800108` in your own bean or processor, and marshal the result with SWIFT MX. The other direction works the same way, starting with SWIFT MX.
+
+Translation that follows the official SWIFT mapping rules is outside the scope of Camel. Use a dedicated translation product or service for that.
+
## Dependencies
To use SWIFT MT in your Camel routes, you need to add a dependency on **camel-swift** which implements this data format.
diff --git a/components/next/dataformats/swiftMx-dataformat.html b/components/next/dataformats/swiftMx-dataformat.html
index bc7bd8a93b..b873befc4d 100644
--- a/components/next/dataformats/swiftMx-dataformat.html
+++ b/components/next/dataformats/swiftMx-dataformat.html
@@ -64,7 +64,7 @@
- unmarshal:
swiftMx: {}
- to:
- uri: bean:newOrder</code></pre> </div> </div> </div> </div> </div> </div> </div> <div class="sect1"> <h2 id="_dependencies"><a class="anchor" href="#_dependencies"></a>Dependencies</h2> <div class="sectionbody"> <div class="paragraph"> <p>To use SWIFT MX in your Camel routes, you need to add a dependency on <strong>camel-swift</strong> which implements this data format.</p> </div> <div class="paragraph"> <p>If you use Maven, you can add the following to your pom.xml:</p> </di [...]
+ uri: bean:newOrder</code></pre> </div> </div> </div> </div> </div> </div> </div> <div class="sect1"> <h2 id="_translating_between_mt_and_mx"><a class="anchor" href="#_translating_between_mt_and_mx"></a>Translating between MT and MX</h2> <div class="sectionbody"> <div class="paragraph"> <p>The SWIFT MX and <a href="swiftMt-dataformat.html" class="xref page">SWIFT MT</a> data formats read and write messages, but they do not translate one format into the other. They also do not [...]
<groupId>org.apache.camel</groupId>
<artifactId>camel-swift</artifactId>
<version>x.x.x</version> <!-- use the same version as your Camel core version -->
diff --git a/components/next/dataformats/swiftMx-dataformat.md b/components/next/dataformats/swiftMx-dataformat.md
index defb3182c3..2ba14d5bd9 100644
--- a/components/next/dataformats/swiftMx-dataformat.md
+++ b/components/next/dataformats/swiftMx-dataformat.md
@@ -180,6 +180,14 @@ from("file://data.bin")
uri: bean:newOrder
```
+## Translating between MT and MX
+
+The SWIFT MX and [SWIFT MT](swiftMt-dataformat.md) data formats read and write messages, but they do not translate one format into the other. They also do not validate messages against SWIFT network rules or usage guidelines such as CBPR+ or SEPA.
+
+To convert a message, such as an MT103 into a pacs.008, unmarshal it with SWIFT MT, map the fields to an ISO 20022 model class such as `MxPacs00800108` in your own bean or processor, and marshal the result with SWIFT MX. The other direction works the same way, starting with SWIFT MX.
+
+Translation that follows the official SWIFT mapping rules is outside the scope of Camel. Use a dedicated translation product or service for that.
+
## Dependencies
To use SWIFT MX in your Camel routes, you need to add a dependency on **camel-swift** which implements this data format.
diff --git a/components/next/dfdl-component.html b/components/next/dfdl-component.html
index 1c650e70e6..4c0033270c 100644
--- a/components/next/dfdl-component.html
+++ b/components/next/dfdl-component.html
@@ -1,4 +1,4 @@
-<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>DFDL :: Apache Camel</title> <link rel="canonical" href="https://camel.apache.org/components/4.22.x/dfdl-component.html"> <meta name="description" content="Transforms fixed format data such as EDI message from/to XML using a Data Format Description Language (DFDL)."> <meta name="generator" content="Antora 3.2.0"> <link rel="stylesheet" href="../../_/cs [...]
+<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>DFDL :: Apache Camel</title> <link rel="canonical" href="https://camel.apache.org/components/4.22.x/dfdl-component.html"> <meta name="description" content="Transforms fixed format data such as EDI message from/to XML using a Data Format Description Language (DFDL)."> <meta name="generator" content="Antora 3.2.0"> <link rel="stylesheet" href="../../_/cs [...]
.to("dfdl:X12-837P.dfdl.xsd");</code></pre> </div> </div> </div> <div id="_tabs_1_xml--panel" class="tabpanel" aria-labelledby="_tabs_1_xml"> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml"><route>
<from uri="direct:parse"/>
<to uri="dfdl:X12-837P.dfdl.xsd"/>
diff --git a/components/next/dfdl-component.md b/components/next/dfdl-component.md
index 96736d2f58..0a492308a9 100644
--- a/components/next/dfdl-component.md
+++ b/components/next/dfdl-component.md
@@ -110,8 +110,6 @@ Enum values:
| **rootElement** (advanced) | The root element name of the schema to use. If not specified, the first root element in the schema will be used. | | String |
| **rootNamespace** (advanced) | The root namespace of the schema to use. | | String |
-/ component headers: START
-
## DFDL Schemas
Many DFDL schemas are freely available at [DFDLSchemas on GitHub](https://github.com/DFDLSchemas) including:
diff --git a/components/next/eips/saga-eip.html b/components/next/eips/saga-eip.html
index ba28ec442e..95cf11d4d1 100644
--- a/components/next/eips/saga-eip.html
+++ b/components/next/eips/saga-eip.html
@@ -1,4 +1,4 @@
-<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>Saga :: Apache Camel</title> <link rel="canonical" href="https://camel.apache.org/components/4.22.x/eips/saga-eip.html"> <meta name="description" content="Defines a Saga (long-running action) that coordinates distributed services toward a consistent outcome. Unlike XA transactions, Sagas use compensating actions for rollback and work across heterogeneo [...]
+<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>Saga :: Apache Camel</title> <link rel="canonical" href="https://camel.apache.org/components/4.22.x/eips/saga-eip.html"> <meta name="description" content="Defines a Saga (long-running action) that coordinates distributed services toward a consistent outcome. Unlike XA transactions, Sagas use compensating actions for rollback and work across heterogeneo [...]
<groupId>org.apache.camel</groupId>
<artifactId>camel-lra</artifactId>
<!-- use the same version as your Camel core version -->
diff --git a/components/next/eips/saga-eip.md b/components/next/eips/saga-eip.md
index 7e57efb262..3a1c2b09ea 100644
--- a/components/next/eips/saga-eip.md
+++ b/components/next/eips/saga-eip.md
@@ -115,6 +115,8 @@ The LRA Saga Service is an implementation based on the MicroProfile sandbox LRA
The URL of the LRA coordinator is a required parameter of the Camel LRA service. The Camel application and the LRA service communicate using the HTTP protocol.
+A saga started by another participant is joined when the message carries its LRA in the `Long-Running-Action` header. The LRA Saga Service only joins, completes or compensates an LRA hosted by the configured coordinator: a `Long-Running-Action` with any other URL fails the exchange. When the participants reach the coordinator under different URLs, for example with different host names, list the other coordinator URLs, including the context path, in the `allowedCoordinatorUrls` option (`c [...]
+
To use the LRA Saga service, maven users will need to add the following dependency to their `pom.xml`:
```xml
diff --git a/components/next/index.html b/components/next/index.html
index 1cc1ae169d..262947b7ec 100644
--- a/components/next/index.html
+++ b/components/next/index.html
@@ -1 +1 @@
-<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>Components :: Apache Camel</title> <link rel="canonical" href="https://camel.apache.org/components/4.22.x/index.html"> <meta name="generator" content="Antora 3.2.0"> <link rel="stylesheet" href="../../_/css/vendor/docsearch-5db8a73adb.css"> <link rel="stylesheet" href="../../_/css/site-fcc1ff1ab1.css"> <meta name="application-name" content="Apache Came [...]
\ No newline at end of file
+<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>Components :: Apache Camel</title> <link rel="canonical" href="https://camel.apache.org/components/4.22.x/index.html"> <meta name="generator" content="Antora 3.2.0"> <link rel="stylesheet" href="../../_/css/vendor/docsearch-5db8a73adb.css"> <link rel="stylesheet" href="../../_/css/site-fcc1ff1ab1.css"> <meta name="application-name" content="Apache Came [...]
\ No newline at end of file
diff --git a/components/next/index.md b/components/next/index.md
index b180cdaf2b..4f509c652f 100644
--- a/components/next/index.md
+++ b/components/next/index.md
@@ -39,7 +39,7 @@ Number of Core Components: 29 in 26 JAR artifacts (0 deprecated)
| [Stub](stub-component.md) | camel-stub | Stable | 2.10 | Stub out any physical endpoints while in development or testing. |
| [Timer](timer-component.md) | camel-timer | Stable | 1.0 | Generate messages in specified intervals using java.util.Timer. |
| [Validator](validator-component.md) | camel-validator | Stable | 1.1 | Validate the payload using XML Schema and JAXP Validation. |
-| [Wasm](wasm-component.md) | camel-wasm | Experimental | 4.4 | Invoke Wasm functions. |
+| [Wasm](wasm-component.md) | camel-wasm | Experimental | 4.4 | Run Wasm programs (WASI Preview 1 command modules) with the message body as standard input. |
| [XSLT](xslt-component.md) | camel-xslt | Stable | 1.3 | Transforms XML payload using an XSLT template. |
| [XSLT Saxon](xslt-saxon-component.md) | camel-xslt-saxon | Stable | 3.0 | Transform XML payloads using an XSLT template using Saxon. |
diff --git a/components/next/jpa-component.html b/components/next/jpa-component.html
index 0d66cf752a..58185dbd4f 100644
--- a/components/next/jpa-component.html
+++ b/components/next/jpa-component.html
@@ -3,7 +3,7 @@
<artifactId>camel-jpa</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
-</dependency></code></pre> </div> </div> </div> </div> <div class="sect1"> <h2 id="_uri_format"><a class="anchor" href="#_uri_format"></a>URI format</h2> <div class="sectionbody"> <div class="listingblock"> <div class="content"> <pre>jpa:entityClassName[?options]</pre> </div> </div> <div class="paragraph"> <p>For sending to the endpoint, the <em>entityClassName</em> is optional. If specified, it helps the <a href="../../manual/type-converter.html" class="xref page">Type Converter</ [...]
+</dependency></code></pre> </div> </div> </div> </div> <div class="sect1"> <h2 id="_uri_format"><a class="anchor" href="#_uri_format"></a>URI format</h2> <div class="sectionbody"> <div class="listingblock"> <div class="content"> <pre>jpa:entityClassName[?options]</pre> </div> </div> <div class="paragraph"> <p>For sending to the endpoint, the <em>entityClassName</em> is optional. If specified, it helps the <a href="../../manual/type-converter.html" class="xref page">Type Converter</ [...]
<property name="entityManagerFactory" ref="myEMFactory"/>
</bean></code></pre> </div> </div> <div class="paragraph"> <p>The <code>JpaComponent</code> looks up automatically the <code>EntityManagerFactory</code> from the Registry which means you do not need to configure this on the <code>JpaComponent</code> as shown above. You only need to do so if there is ambiguity, in which case Camel will log a WARN.</p> </div> </div> <div class="sect2"> <h3 id="_configuring_transactionstrategy"><a class="anchor" href="#_configuring_transactionstrategy [...]
<property name="entityManagerFactory" ref="myEMFactory"/>
diff --git a/components/next/jpa-component.md b/components/next/jpa-component.md
index 2b1825a247..8f9f590e04 100644
--- a/components/next/jpa-component.md
+++ b/components/next/jpa-component.md
@@ -278,6 +278,8 @@ If you do not wish to delete the entity bean when it has been processed (and whe
If you would rather perform some update on the entity to mark it as processed (such as to exclude it from a future query), then you can annotate a method with `@Consumed` (org.apache.camel.component.jpa.Consumed). It will be invoked on your entity bean when the entity bean has been processed (and when routing is done).
+An entity bean is only deleted (or `@Consumed` invoked) when its exchange completed successfully. If the route marks the exchange rollback only (for example with `markRollbackOnly()`), the entity bean is not consumed and stays in the table, so the next poll consumes it again, as long as it still matches the query. With `transacted=false` the other entity beans of the poll are still consumed, and so is what a `@PreConsumed` method changed before routing: an entity bean that `@PreConsumed` [...]
+
You can use `@PreConsumed` (org.apache.camel.component.jpa.PreConsumed) which will be invoked on your entity bean before it has been processed (before routing).
If you are consuming a lot of rows (100K+) and experience `OutOfMemory` problems, you should set the `maximumResults` to a sensible value.
diff --git a/components/next/others/main.html b/components/next/others/main.html
index f868a9d564..1675776107 100644
--- a/components/next/others/main.html
+++ b/components/next/others/main.html
@@ -1,4 +1,4 @@
-<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>Main :: Apache Camel</title> <link rel="canonical" href="https://camel.apache.org/components/4.22.x/others/main.html"> <meta name="description" content="Camel Main"> <meta name="generator" content="Antora 3.2.0"> <link rel="stylesheet" href="../../../_/css/vendor/docsearch-5db8a73adb.css"> <link rel="stylesheet" href="../../../_/css/site-fcc1ff1ab1.css [...]
+<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>Main :: Apache Camel</title> <link rel="canonical" href="https://camel.apache.org/components/4.22.x/others/main.html"> <meta name="description" content="Camel Main"> <meta name="generator" content="Antora 3.2.0"> <link rel="stylesheet" href="../../../_/css/vendor/docsearch-5db8a73adb.css"> <link rel="stylesheet" href="../../../_/css/site-fcc1ff1ab1.css [...]
public class MyCoolApplication {
diff --git a/components/next/others/main.md b/components/next/others/main.md
index 5365f9514e..8242458788 100644
--- a/components/next/others/main.md
+++ b/components/next/others/main.md
@@ -700,11 +700,12 @@ The camel.resilience4j supports 25 options, which are listed below.
### Camel Saga EIP (Long Running Actions) configurations
-The camel.lra supports 5 options, which are listed below.
+The camel.lra supports 6 options, which are listed below.
| Name | Description | Default | Type |
| --- | --- | --- | --- |
+| `camel.lra.allowedCoordinatorUrls` | Comma-separated URLs, including the context path, of further LRA coordinators whose LRAs may be joined, completed or compensated. By default, only an LRA hosted by the configured coordinator is accepted. Use it when participants reach the same coordinator under different URLs, for example with different host names. | | String |
| `camel.lra.coordinatorContextPath` | The context-path for the LRA coordinator. Is default /lra-coordinator | /lra-coordinator | String |
| `camel.lra.coordinatorUrl` | The URL for the LRA coordinator service that orchestrates the transactions | | String |
| `camel.lra.enabled` | To enable Saga LRA | false | boolean |
diff --git a/components/next/rss-component.html b/components/next/rss-component.html
index 56a8b455ef..d7b9612249 100644
--- a/components/next/rss-component.html
+++ b/components/next/rss-component.html
@@ -3,7 +3,7 @@
<artifactId>camel-rss</artifactId>
<version>x.x.x</version>
<!-- use the same version as your Camel core version -->
-</dependency></code></pre> </div> </div> <div class="admonitionblock note"> <div class="table-wrapper"><table> <tr> <td class="icon"> <i class="fa icon-note" title="Note"></i> </td> <td class="content"> The component currently only supports consuming feeds. </td> </tr> </table></div> </div> </div> </div> <div class="sect1"> <h2 id="_uri_format"><a class="anchor" href="#_uri_format"></a>URI format</h2> <div class="sectionbody"> <div class="listingblock"> <div class="content"> <pre>r [...]
+</dependency></code></pre> </div> </div> <div class="admonitionblock note"> <div class="table-wrapper"><table> <tr> <td class="icon"> <i class="fa icon-note" title="Note"></i> </td> <td class="content"> The component currently only supports consuming feeds. </td> </tr> </table></div> </div> </div> </div> <div class="sect1"> <h2 id="_uri_format"><a class="anchor" href="#_uri_format"></a>URI format</h2> <div class="sectionbody"> <div class="listingblock"> <div class="content"> <pre>r [...]
.to("bean:rss");</code></pre> </div> </div> </div> <div id="_tabs_1_xml--panel" class="tabpanel" aria-labelledby="_tabs_1_xml"> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml"><route>
<from uri="rss:http://someserver.com/feeds/posts/default?alt=rss&amp;splitEntries=false&amp;delay=1000"/>
<to uri="bean:rss"/>
diff --git a/components/next/rss-component.md b/components/next/rss-component.md
index a61968bd89..96e2c79798 100644
--- a/components/next/rss-component.md
+++ b/components/next/rss-component.md
@@ -102,7 +102,7 @@ With the following _path_ and _query_ parameters:
| Name | Description | Default | Type |
| --- | --- | --- | --- |
| **sendEmptyMessageWhenIdle** (consumer) | If the polling consumer did not poll any files, you can enable this option to send an empty message (no body) instead. | false | boolean |
-| **sortEntries** (consumer) | Sets whether to sort entries by published date. Only works when splitEntries = true. | false | boolean |
+| **sortEntries** (consumer) | Sets whether to sort entries by updated date (by published date for an entry without an updated date), so the oldest entry is routed first. Only works when splitEntries = true. | false | boolean |
| **splitEntries** (consumer) | Sets whether or not entries should be sent individually or whether the entire feed should be sent as a single message. | true | boolean |
| **throttleEntries** (consumer) | Sets whether all entries identified in a single feed poll should be delivered immediately. If true, only one entry is processed per delay. Only applicable when splitEntries = true. | true | boolean |
| **bridgeErrorHandler** (consumer (advanced)) | Allows for bridging the consumer to the Camel routing Error Handler, which mean any exceptions (if possible) occurred while the Camel consumer is trying to pickup incoming messages, or the likes, will now be processed as a message and handled by the routing Error Handler. Important: This is only possible if the 3rd party component allows Camel to be alerted if an exception was thrown. Some components handle this internally only, and theref [...]
diff --git a/components/next/wasm-component.html b/components/next/wasm-component.html
index 7a00702f1a..f25fbc4701 100644
--- a/components/next/wasm-component.html
+++ b/components/next/wasm-component.html
@@ -1,67 +1,47 @@
-<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>Wasm :: Apache Camel</title> <link rel="canonical" href="https://camel.apache.org/components/4.22.x/wasm-component.html"> <meta name="description" content="Invoke Wasm functions."> <meta name="generator" content="Antora 3.2.0"> <link rel="stylesheet" href="../../_/css/vendor/docsearch-5db8a73adb.css"> <link rel="stylesheet" href="../../_/css/site-fcc1f [...]
+<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>Wasm :: Apache Camel</title> <link rel="canonical" href="https://camel.apache.org/components/4.22.x/wasm-component.html"> <meta name="description" content="Run Wasm programs (WASI Preview 1 command modules) with the message body as standard input."> <meta name="generator" content="Antora 3.2.0"> <link rel="stylesheet" href="../../_/css/vendor/docsearch [...]
<groupId>org.apache.camel</groupId>
<artifactId>camel-wasm</artifactId>
<version>${camel-version}</version>
- </dependency></code></pre> </div> </div> </div> </div> <div class="sect1"> <h2 id="_uri_format"><a class="anchor" href="#_uri_format"></a>URI format</h2> <div class="sectionbody"> <div class="listingblock"> <div class="content"> <pre>wasm://functionName?[options]</pre> </div> </div> </div> </div> <div class="sect1"> <h2 id="_configuring_options"><a class="anchor" href="#_configuring_options"></a>Configuring Options</h2> <div class="sectionbody"> <div class="paragraph"> <p>Camel [...]
- let mut buf = Vec::with_capacity(size as usize);
- let ptr = buf.as_mut_ptr();
-
- // tell Rust not to clean this up
- mem::forget(buf);
-
- ptr
-}
-
-pub unsafe extern "C" fn dealloc(ptr: &mut u8, len: i32) {
- // Retakes the pointer which allows its memory to be freed.
- let _ = Vec::from_raw_parts(ptr, 0, len as usize);
-}</code></pre> </div> </div> </div> <div class="sect3"> <h4 id="_data_shapes"><a class="anchor" href="#_data_shapes"></a>Data shapes</h4> <div class="paragraph"> <p>It is not possible to share a Java object with the Wasm module directly, and as mentioned before, data exchange leverages Wasm’s memory that can be accessed by both the host and the guest runtimes. At this stage, the data structure that the component exchange with the Wasm function is a subset of the Apache Camel Messag [...]
- @JsonProperty
- public Map<String, String> headers = new HashMap<>();
-
- @JsonProperty
- public byte[] body;
-}</code></pre> </div> </div> </div> <div class="sect3"> <h4 id="_data_processing"><a class="anchor" href="#_data_processing"></a>Data processing</h4> <div class="paragraph"> <p>The component expects the processing function to have the following signature:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-rust hljs" data-lang="rust">fn function(ptr: u32, len: u32) -> u64</code></pre> </div> </div> <div class="ulist"> <u [...]
-struct Message {
- headers: HashMap<String, serde_json::Value>,
-
- #[serde(with = "Base64Standard")]
- body: Vec<u8>,
-}
-
-#[cfg_attr(all(target_arch = "wasm32"), export_name = "process")]
-#[no_mangle]
-pub extern fn process(ptr: u32, len: u32) -> u64 {
- let bytes = unsafe {
- slice::from_raw_parts_mut(
- ptr as *mut u8,
- len as usize)
- };
-
- let mut msg: Message = serde_json::from_slice(bytes).unwrap();
-
-
- let out_vec = serde_json::to_vec(&msg).unwrap();
- let out_len = out_vec.len();
- let out_ptr = alloc(out_len as u32);
-
- unsafe {
- std::ptr::copy_nonoverlapping(
- out_vec.as_ptr(),
- out_ptr,
- out_len as usize)
- };
-
- return ((out_ptr as u64) << 32) | out_len as u64;
-}</code></pre> </div> </div> </div> <div class="sect3"> <h4 id="_errors_and_module_state"><a class="anchor" href="#_errors_and_module_state"></a>Errors and module state</h4> <div class="paragraph"> <p>The module is instantiated once per producer (each <code>to</code> of a <code>wasm</code> endpoint in a route has its own instance) and that instance handles every message, one at a time, so data the module keeps in its memory or globals carries over from one message to the next.</p> </div> [...]
- .to("wasm:process?module=classpath://functions.wasm");</code></pre> </div> </div> </div> <div id="_tabs_1_xml--panel" class="tabpanel" aria-labelledby="_tabs_1_xml"> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml"><route>
+ </dependency></code></pre> </div> </div> </div> </div> <div class="sect1"> <h2 id="_uri_format"><a class="anchor" href="#_uri_format"></a>URI format</h2> <div class="sectionbody"> <div class="listingblock"> <div class="content"> <pre>wasm:module[?options]</pre> </div> </div> <div class="paragraph"> <p>The <code>module</code> is the location of the <code>.wasm</code> file, loaded as a resource: from the classpath by default, or with a prefix such as <code>classpath:</code>, <cod [...]
+
+fn main() {
+ let mut input = String::new();
+ io::stdin().read_to_string(&mut input).unwrap();
+ io::stdout().write_all(input.to_uppercase().as_bytes()).unwrap();
+}</code></pre> </div> </div> <div class="paragraph"> <p>Built with <code>rustup target add wasm32-wasip1</code> and <code>cargo build --release --target wasm32-wasip1</code>.</p> </div> <div class="paragraph"> <p>The same program in <a href="https://go.dev">Go</a>:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-go hljs" data-lang="go">package main
+
+import (
+ "bytes"
+ "io"
+ "os"
+)
+
+func main() {
+ input, _ := io.ReadAll(os.Stdin)
+ os.Stdout.Write(bytes.ToUpper(input))
+}</code></pre> </div> </div> <div class="paragraph"> <p>Built with <code>GOOS=wasip1 GOARCH=wasm go build -o upper.wasm</code>.</p> </div> </div> <div class="sect2"> <h3 id="_running_a_module"><a class="anchor" href="#_running_a_module"></a>Running a module</h3> <div class="paragraph"> <p>For every exchange the component:</p> </div> <div class="olist arabic"> <ol class="arabic"> <li> <p>creates a new instance of the module (the module is parsed once, when the producer starts),</p> </li> [...]
+ .to("wasm:classpath:upper.wasm?timeout=5000&maxMemoryPages=256");</code></pre> </div> </div> </div> <div id="_tabs_1_xml--panel" class="tabpanel" aria-labelledby="_tabs_1_xml"> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml"><route>
<from uri="direct:in"/>
- <to uri="wasm:process?module=classpath://functions.wasm"/>
+ <to uri="wasm:classpath:upper.wasm?timeout=5000&amp;maxMemoryPages=256"/>
</route></code></pre> </div> </div> </div> <div id="_tabs_1_yaml--panel" class="tabpanel" aria-labelledby="_tabs_1_yaml"> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-yaml hljs" data-lang="yaml">- route:
from:
uri: direct:in
steps:
- to:
- uri: wasm:process
+ uri: wasm:classpath:upper.wasm
+ parameters:
+ timeout: 5000
+ maxMemoryPages: 256</code></pre> </div> </div> </div> </div> </div> <div class="paragraph"> <p>A module with arguments and environment variables, which also receives the <code>TENANT</code> header of the message:</p> </div> <div id="_tabs_2" class="openblock tabs is-sync is-loading"> <div class="content"> <div class="ulist tablist"> <ul> <li id="_tabs_2_java" class="tab"> <p>Java</p> </li> <li id="_tabs_2_yaml" class="tab"> <p>YAML</p> </li> </ul> </div> <div id="_tabs_2_ja [...]
+ .to("wasm:file:/opt/transforms/normalize.wasm?args=--strict&environment.LOG_LEVEL=info&environmentHeaders=TENANT")
+ .to("kafka:normalized-orders");</code></pre> </div> </div> </div> <div id="_tabs_2_yaml--panel" class="tabpanel" aria-labelledby="_tabs_2_yaml"> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-yaml hljs" data-lang="yaml">- route:
+ from:
+ uri: kafka:orders
+ steps:
+ - to:
+ uri: wasm:file:/opt/transforms/normalize.wasm
parameters:
- module: classpath://functions.wasm</code></pre> </div> </div> </div> </div> </div> </div> </div> </article> <aside class="toc sidebar" aria-label="Table of contents" data-title="Contents" data-levels="2"> <div class="toc-menu"></div> </aside> </div> </main> </div> <footer> <div class="footer-tools"> <a href="#top" title="Reach the top of the page">Back to top</a> </div> <div class="footer"> <div class="footer-brand"> <img class="footer-logo" src="../../_/img/logo-d-a567cee6 [...]
\ No newline at end of file
+ args: --strict
+ environment.LOG_LEVEL: info
+ environmentHeaders: TENANT
+ - to:
+ uri: kafka:normalized-orders</code></pre> </div> </div> </div> </div> </div> </div> </div> </article> <aside class="toc sidebar" aria-label="Table of contents" data-title="Contents" data-levels="2"> <div class="toc-menu"></div> </aside> </div> </main> </div> <footer> <div class="footer-tools"> <a href="#top" title="Reach the top of the page">Back to top</a> </div> <div class="footer"> <div class="footer-brand"> <img class="footer-logo" src="../../_/img/logo-d-a567cee6fa.svg" [...]
\ No newline at end of file
diff --git a/components/next/wasm-component.md b/components/next/wasm-component.md
index e434fd5621..3e9db1db5a 100644
--- a/components/next/wasm-component.md
+++ b/components/next/wasm-component.md
@@ -4,9 +4,9 @@
**Only producer is supported**
-[WebAssembly (Wasm)](https://webassembly.org) is a low-level bytecode format designed as a portable target for the compilation of high-level languages like C, C++, and Rust, enabling deployment on the web for client and server applications.
+[WebAssembly (Wasm)](https://webassembly.org) is a portable bytecode format that languages such as Rust, Go, C and C++ compile to. [WASI](https://wasi.dev) is the system interface those programs use for their standard input, output, arguments and environment.
-This component provides support to leverage Wasm functions for message transformation.
+The Wasm component runs a WASI Preview 1 _command module_ (a program with a `_start` function) as a processor: the message body is the standard input of the program, and what the program writes to its standard output becomes the message body. Any program built for WASI Preview 1 can be used as it is, without a Camel specific API. The module runs inside the JVM on [Endive](https://github.com/bytecodealliance/endive), a WebAssembly runtime written in Java, so no native code or external pro [...]
Maven users will need to add the following dependency to their `pom.xml` for this component:
@@ -20,7 +20,12 @@ Maven users will need to add the following dependency to their `pom.xml` for thi
## URI format
-wasm://functionName?\[options\]
+wasm:module\[?options\]
+
+The `module` is the location of the `.wasm` file, loaded as a resource: from the classpath by default, or with a prefix such as `classpath:`, `file:` or `http:`. For example `wasm:classpath:upper.wasm` or `wasm:file:/opt/transforms/upper.wasm`.
+
+> **Warning**
+> Use a static URI. With a dynamic one, such as `toD("wasm:${header.module}")`, data of the message chooses the program that runs, including a module downloaded from an `http:` location, and the module is loaded and parsed again for every new URI (0.2 to 0.4 seconds for a Go program). To choose between known modules, use a [Choice](eips/choice-eip.md) with one static `wasm` endpoint per module.
## Configuring Options
@@ -81,7 +86,7 @@ The Wasm component supports the following options which are listed below.
The Wasm endpoint is configured using URI syntax:
-wasm:functionName
+wasm:module
With the following _path_ and _query_ parameters:
@@ -90,147 +95,165 @@ With the following _path_ and _query_ parameters:
| Name | Description | Default | Type |
| --- | --- | --- | --- |
-| **functionName** (producer) | **Required** The Function Name. | | String |
+| **module** (producer) | **Required** The WASI Preview 1 command module to run, as a resource: by default from the classpath, or with a prefix such as classpath:, file: or http:. | | String |
### Query Parameters
| Name | Description | Default | Type |
| --- | --- | --- | --- |
-| **module** (producer) | **Required** Set the module (the distributable, loadable, and executable unit of code in WebAssembly) resource that provides the producer function. | | String |
+| **args** (producer) | The command line arguments passed to the module, separated by whitespace. Use double quotes around an argument that contains whitespace. The module receives the file name of the module (for example upper.wasm, without scheme, directories or query) as argument zero, followed by these arguments. The arguments are fixed by the route: they cannot be set from message headers. | | String |
+| **environment** (producer) | Environment variables for the module, for example environment.LOG\_LEVEL=debug. The module sees no environment variables other than these and the headers listed in environmentHeaders; the environment of the JVM is never passed on. This is a multi-value option with prefix: environment. | | Map |
+| **environmentHeaders** (producer) | A comma separated allow-list of message headers whose values are passed to the module as environment variables of the same name. Headers usually come from whoever sent the message, so no header reaches the module unless it is listed here. A listed header that is not on the message is left unset. Camel matches header names ignoring case, so listing TENANT also passes a header named tenant, as the variable TENANT. A name may not be listed here and also [...]
+| **failOnNonZeroExit** (producer) | Whether a module that exits with a non-zero exit code fails the exchange with a WasmExitCodeException. No new body is set then, but a body that is a stream has been read by the module: it can be read again when handling the failure if stream caching is on (the default). When false, the standard output of the module replaces the message body whatever the exit code, which is available in the CamelWasmExitCode header. | true | boolean |
+| **maxMemoryPages** (producer) | The maximum size of the memory of the module, in WebAssembly pages of 64 KiB. Rust and Go programs declare no maximum by default. When the limit is reached, growing the memory fails inside the module, which then usually traps or exits with an error. 0 (the default) keeps the maximum declared by the module. The value must not be lower than the initial size the module declares. | | int |
+| **maxOutputSize** (producer) | The maximum number of bytes the module may write to its standard output, and separately to its standard error, which are buffered in memory. A module that writes more is stopped and the exchange fails. 0 (the default) means no limit: a module that keeps writing then fills the heap of the JVM, so set a limit for modules whose output size is not known. | | int |
+| **timeout** (producer) | The maximum time the module may run for one exchange, in milliseconds. When it is exceeded the module is interrupted and the exchange fails with an ExchangeTimedOutException. When a timeout is set, the module runs on a separate thread while the calling thread waits, and the message body is read into memory before the module starts, instead of being streamed to it. The time to read the body does not count. 0 (the default) means no timeout. | | long |
| **lazyStartProducer** (producer (advanced)) | Whether the producer should be started lazy (on the first message). By starting lazy you can use this to allow CamelContext and routes to startup in situations where a producer may otherwise fail during starting and cause the route to fail being started. By deferring this startup to be lazy then the startup failure can be handled during routing messages via Camel’s routing error handlers. Beware that when the first message is processed then [...]
-## Usage
-
-### Writing A Wasm processor
+## Message Headers
-In _Wasm_, sharing objects between the host, in this case the _JVM_, and the _Wasm_ module is deliberately restricted and as of today, it requires a number of steps:
+The Wasm component supports the following message header(s), which is/are listed below:
-1. From the _host_, call a function inside the webassembly module that allocates a block of memory and returns its address, then save it
-
-2. From the _host_, write the data that should be exchanged with the _Wasm_ module to the saved address
-
-3. From the _host_, invoke the required function passing both the address where the data is written and its size
-
-4. From the _Wasm_ module, read the data and process it
-
-5. From the _host_, release the memory when done
-
+
+| Name | Description | Default | Type |
+| --- | --- | --- | --- |
+| **CamelWasmExitCode** (producer) Constant: [`EXIT_CODE`](https://javadoc.io/doc/org.apache.camel/camel-wasm/latest/org/apache/camel/wasm/Wasm$Headers.html#EXIT_CODE) | The exit code of the module: 0 when it returned from its \_start function, otherwise the value it passed to proc\_exit. Not set when the module trapped, timed out or exceeded maxOutputSize. | | Integer |
+| **CamelWasmStderr** (producer) Constant: [`STDERR`](https://javadoc.io/doc/org.apache.camel/camel-wasm/latest/org/apache/camel/wasm/Wasm$Headers.html#STDERR) | What the module wrote to its standard error, decoded as UTF-8. Not set when the module wrote nothing or timed out. | | String |
-#### Providing functions for memory management
+## Usage
-The module hosting the function **must** provide the functions to allocate/deallocate memory that **must** be named `alloc` and `dealloc` respectively.
+### Writing a module
-Here’s an example of the mentioned functions implemented in [Rust](https://www.rust-lang.org):
+A module is an ordinary program that reads its standard input and writes its standard output. For example, in [Rust](https://www.rust-lang.org):
```rust
-pub extern "C" fn alloc(size: u32) -> *mut u8 {
- let mut buf = Vec::with_capacity(size as usize);
- let ptr = buf.as_mut_ptr();
-
- // tell Rust not to clean this up
- mem::forget(buf);
-
- ptr
-}
+use std::io::{self, Read, Write};
-pub unsafe extern "C" fn dealloc(ptr: &mut u8, len: i32) {
- // Retakes the pointer which allows its memory to be freed.
- let _ = Vec::from_raw_parts(ptr, 0, len as usize);
+fn main() {
+ let mut input = String::new();
+ io::stdin().read_to_string(&mut input).unwrap();
+ io::stdout().write_all(input.to_uppercase().as_bytes()).unwrap();
}
```
-#### Data shapes
+Built with `rustup target add wasm32-wasip1` and `cargo build --release --target wasm32-wasip1`.
-It is not possible to share a Java object with the Wasm module directly, and as mentioned before, data exchange leverages Wasm’s memory that can be accessed by both the host and the guest runtimes. At this stage, the data structure that the component exchange with the Wasm function is a subset of the Apache Camel Message, containing headers the body encoded as a base64 string:
+The same program in [Go](https://go.dev):
-_Java-only: data exchange wrapper class for Wasm module communication_
+```go
+package main
-```java
-public static class Wrapper {
- @JsonProperty
- public Map<String, String> headers = new HashMap<>();
+import (
+ "bytes"
+ "io"
+ "os"
+)
- @JsonProperty
- public byte[] body;
+func main() {
+ input, _ := io.ReadAll(os.Stdin)
+ os.Stdout.Write(bytes.ToUpper(input))
}
```
-#### Data processing
+Built with `GOOS=wasip1 GOARCH=wasm go build -o upper.wasm`.
-The component expects the processing function to have the following signature:
+### Running a module
-```rust
-fn function(ptr: u32, len: u32) -> u64
-```
+For every exchange the component:
-- it accepts two 32bit unsigned integers arguments
+1. creates a new instance of the module (the module is parsed once, when the producer starts),
- - a pointer to the memory location when the input data has been written (`ptr`)
-
- - the size of the input data (`len`)
-
+2. runs its `_start` function with the message body as standard input, the arguments configured with `args` and the environment variables configured with `environment` and `environmentHeaders`,
-- it returns a 64bit unsigned integer where:
+3. sets the `CamelWasmExitCode` header to the exit code of the program: 0 when `_start` returns, otherwise the code the program passed to `proc_exit`,
- - the first 32bit represents a pointer to the return data
-
- - the last 31bit represents the size of the return data, which must have the same data shape discussed above unless there is an error (see below)
-
- - the most significant bit of the returned data size is reserved to signal an error, so if it is set, then the return data could contain an error message/code/etc
-
+4. sets the `CamelWasmStderr` header to what the program wrote to its standard error, if anything,
+
+5. and replaces the message body with the standard output of the program, as a `byte[]`.
-Here’s an example of a complete function:
-
-```rust
-#[derive(Serialize, Deserialize)]
-struct Message {
- headers: HashMap<String, serde_json::Value>,
+When the program exits with a non-zero code, the exchange fails with a `WasmExitCodeException` (which holds the exit code and the standard error) and the standard output is not set as the body, unless `failOnNonZeroExit` is `false`: then the standard output replaces the body as for any other exit code. The other headers of the message are kept. See [The message body after a failure](#_the_message_body_after_a_failure) for what the body holds when the exchange fails.
- #[serde(with = "Base64Standard")]
- body: Vec<u8>,
-}
+Every exchange runs on its own instance, so exchanges never share the memory or the globals of the module and can run in parallel without a lock. A module cannot keep state from one message to the next.
-#[cfg_attr(all(target_arch = "wasm32"), export_name = "process")]
-#[no_mangle]
-pub extern fn process(ptr: u32, len: u32) -> u64 {
- let bytes = unsafe {
- slice::from_raw_parts_mut(
- ptr as *mut u8,
- len as usize)
- };
+The `CamelWasmExitCode` and `CamelWasmStderr` headers always describe the current run: a value already on the message is removed before the module runs.
- let mut msg: Message = serde_json::from_slice(bytes).unwrap();
+### What the module can access
+- **Standard input, output and error**: the message body, the new body and the `CamelWasmStderr` header. They are not terminals.
+
+- **Arguments**: the file name of the module as argument zero (`upper.wasm` for `wasm:file:/opt/modules/upper.wasm`; the directories, the host, user info and query of the location are not passed on), followed by the `args` option, for example `args=--level 2`. Use double quotes around an argument that contains spaces. Arguments are fixed by the route.
+
+- **Environment variables**: only the ones configured with `environment.NAME=value`, and the message headers listed in `environmentHeaders`, passed under the name they are listed with. Header names are matched the way Camel matches them, ignoring case: `environmentHeaders=TENANT` also passes a header named `tenant`, as the variable `TENANT`. A listed header that is not on the message is not set. Headers usually come from whoever sent the message, so no header reaches the module unless [...]
+
+- **Files and network**: none. The module gets no preopened directories, so it cannot open files, and no sockets.
+
+- **Clock**: the one of the host.
+
+- **Random numbers**: WASI `random_get` (used by Go `crypto/rand` and Rust `getrandom`) returns bytes from a `java.security.SecureRandom` of the host.
+
- let out_vec = serde_json::to_vec(&msg).unwrap();
- let out_len = out_vec.len();
- let out_ptr = alloc(out_len as u32);
+### Limits
- unsafe {
- std::ptr::copy_nonoverlapping(
- out_vec.as_ptr(),
- out_ptr,
- out_len as usize)
- };
+The following options bound what one run of a module can use. They are off by default.
- return ((out_ptr as u64) << 32) | out_len as u64;
-}
-```
+- `maxMemoryPages`: the maximum size of the memory of the module, in pages of 64 KiB. Rust and Go programs declare no maximum by default, so the memory of one run can grow to gigabytes of JVM heap. When the limit is reached, growing the memory fails inside the module, which then usually traps or exits with an error.
+
+- `timeout`: the maximum time one run may take. The module then runs on a thread of the producer while the route thread waits. When the time is up, the module is interrupted at its next function call or loop iteration and the exchange fails with an `ExchangeTimedOutException`. Without a `timeout`, a module that never ends blocks the route thread.
+
+- `maxOutputSize`: the maximum number of bytes the module may write to its standard output, and separately to its standard error. Both are buffered in memory. A module that writes more is stopped and the exchange fails.
+
-#### Errors and module state
+> **Warning**
+> Without `maxOutputSize` the standard output and the standard error are buffered without a limit: a module that keeps writing fills the heap of the JVM, which affects the whole application and not only one exchange. Set `maxOutputSize` unless the output size of the module is known and small, for example `maxOutputSize=16777216` (16 MiB).
-The module is instantiated once per producer (each `to` of a `wasm` endpoint in a route has its own instance) and that instance handles every message, one at a time, so data the module keeps in its memory or globals carries over from one message to the next.
+With a `timeout`, the message body is read into memory, on the route thread, before the module starts, and the module reads that copy. Without a `timeout` the body is streamed to the module. The copy is what makes the timeout safe: the thread of a module that timed out can run for a moment longer, and it must not read a stream that the route is using again. It also means that:
-- When the function returns with the error bit set, the error data is released with `dealloc` using its size without the error bit, the error data becomes the message of the exception, and the instance is kept.
+- the whole body is on the heap for the time of the run, in addition to the buffered output,
-- When the call fails without returning, for example on a Rust `panic` or any other Wasm trap, the instance is discarded and a new one is created from the module for the next message. Whatever the failed call allocated can no longer be released, so keeping the instance would grow its memory with every failure. Any state the module kept in the discarded instance is lost. On a route where every call fails this way, the module is instantiated again for every message (its data segments are [...]
+- the time to read the body is not part of the `timeout`: a body stream that delivers slowly, such as a slow network connection, holds the route thread as it does without a `timeout`,
+- the threads of the producer are never blocked on the body, so a module that timed out gives its thread back at its next function call or loop iteration. The pool of these threads has no maximum size and needs none: it holds one thread for each exchange that is in the endpoint at the same time.
+
+
+These limits are robustness controls, not a sandbox. A module is trusted code chosen by the route author, like a processor or a bean, as described in the [security model](../../manual/security-model.md): the limits keep a misbehaving module from turning one message into an unbounded use of memory, time or threads, but they are not a defence against a module written to attack the host.
+
+### Errors
+
+
+| What happens | Result |
+| --- | --- |
+| The program exits with code 0 | The body is the standard output. `CamelWasmExitCode` is 0. |
+| The program exits with another code | A `WasmExitCodeException`, no new body, `CamelWasmExitCode` and `CamelWasmStderr` set. With `failOnNonZeroExit=false`: the body is the standard output. |
+| The program traps, for example on a Rust `panic` | A `CamelExchangeException` caused by the `TrapException` of Endive, with the start of the standard error in its message. `CamelWasmStderr` is set, `CamelWasmExitCode` is not. |
+| The program writes more than `maxOutputSize` | A `CamelExchangeException`. `CamelWasmStderr` is set when the program wrote to its standard error, `CamelWasmExitCode` is not. |
+| The program runs longer than `timeout` | An `ExchangeTimedOutException`. Neither header is set. |
+| The module is not a WASI Preview 1 command module, or the options are invalid | The route fails to start. |
+
+In every case, the instance the program ran on is discarded.
+
+### The message body after a failure
+
+When the exchange fails (a non-zero exit code, a trap, the output limit or the timeout), the component does not set a new body, but the program may already have read the old one as its standard input:
+
+
+| Body before the call | Body when the exchange has failed |
+| --- | --- |
+| A `String`, a `byte[]`, a file, or another value that is converted to a stream | Unchanged. |
+| A cached stream (a `StreamCache`): what [stream caching](../../manual/stream-caching.md), which is on by default, makes of a stream body | The same stream cache. The program has read from it; Camel resets it for the error handler and for a redelivery, so it can be read again. |
+| A stream that is not cached, and no `timeout` | The same stream, read as far as the program read it, usually to its end. Its content cannot be read again. |
+| A stream that is not cached, with a `timeout` | A `byte[]` with the content of the stream: the body was read into memory before the run, and the component puts that copy back. |
+
+So keep stream caching on when an `onException` or a dead letter channel needs the body of a failed exchange and the body is a stream.
+
+### Performance
+
+Creating an instance per exchange is cheap for a small module, but the start-up code of the program itself runs for every message. Programs with a large runtime, such as standard Go programs, spend most of each run initializing that runtime; TinyGo, Rust and C programs start much faster. Modules are interpreted.
## Examples
-Supposing we have compiled a Wasm module containing the function above, then it can be called in a Camel Route by its name and module resource location:
+A route that upper-cases the message body with the module `upper.wasm` from the classpath:
- Java
@@ -241,13 +264,13 @@ Supposing we have compiled a Wasm module containing the function above, then it
```java
from("direct:in")
- .to("wasm:process?module=classpath://functions.wasm");
+ .to("wasm:classpath:upper.wasm?timeout=5000&maxMemoryPages=256");
```
```xml
<route>
<from uri="direct:in"/>
- <to uri="wasm:process?module=classpath://functions.wasm"/>
+ <to uri="wasm:classpath:upper.wasm?timeout=5000&maxMemoryPages=256"/>
</route>
```
@@ -257,7 +280,36 @@ from("direct:in")
uri: direct:in
steps:
- to:
- uri: wasm:process
+ uri: wasm:classpath:upper.wasm
parameters:
- module: classpath://functions.wasm
+ timeout: 5000
+ maxMemoryPages: 256
+```
+
+A module with arguments and environment variables, which also receives the `TENANT` header of the message:
+
+- Java
+
+- YAML
+
+
+```java
+from("kafka:orders")
+ .to("wasm:file:/opt/transforms/normalize.wasm?args=--strict&environment.LOG_LEVEL=info&environmentHeaders=TENANT")
+ .to("kafka:normalized-orders");
+```
+
+```yaml
+- route:
+ from:
+ uri: kafka:orders
+ steps:
+ - to:
+ uri: wasm:file:/opt/transforms/normalize.wasm
+ parameters:
+ args: --strict
+ environment.LOG_LEVEL: info
+ environmentHeaders: TENANT
+ - to:
+ uri: kafka:normalized-orders
```
\ No newline at end of file
diff --git a/manual/camel-4x-upgrade-guide-4_18.html b/manual/camel-4x-upgrade-guide-4_18.html
index 4e14037838..f54d5fcc91 100644
--- a/manual/camel-4x-upgrade-guide-4_18.html
+++ b/manual/camel-4x-upgrade-guide-4_18.html
@@ -1,4 +1,4 @@
-<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>Apache Camel 4.x Upgrade Guide :: Apache Camel</title> <link rel="canonical" href="https://camel.apache.org/manual/camel-4x-upgrade-guide-4_18.html"> <meta name="generator" content="Antora 3.2.0"> <link rel="stylesheet" href="../_/css/vendor/docsearch-5db8a73adb.css"> <link rel="stylesheet" href="../_/css/site-fcc1ff1ab1.css"> <meta name="application-n [...]
+<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>Apache Camel 4.x Upgrade Guide :: Apache Camel</title> <link rel="canonical" href="https://camel.apache.org/manual/camel-4x-upgrade-guide-4_18.html"> <meta name="generator" content="Antora 3.2.0"> <link rel="stylesheet" href="../_/css/vendor/docsearch-5db8a73adb.css"> <link rel="stylesheet" href="../_/css/site-fcc1ff1ab1.css"> <meta name="application-n [...]
.unmarshal().json(DynamicRouterControlMessage.class)
.to("dynamic-router-control:subscribe?allowPredicateFromMessage=true");</code></pre> </div> </div> <div class="paragraph"> <p>Two alternatives avoid the flag entirely. A control message may still name a <code>predicateBean</code>, which selects a <code>Predicate</code> that the route author bound in the registry; that path is unchanged. The control endpoint may also carry <code>predicate</code> and <code>expressionLanguage</code> as URI parameters, in which case every subscription ma [...]
+ "&deserializationFilter=com.example.model.**;java.**;!*")</code></pre> </div> </div> <div class="paragraph"> <p>Setting the <code>serializer</code> option to a custom <code>RedisSerializer</code> bypasses the filter entirely, since Camel then no longer controls how the payload is read.</p> </div> </div> <div class="sect2"> <h3 id="_camel_google_mail_the_raw_option_now_returns_the_message"><a class="anchor" href="#_camel_google_mail_the_raw_option_now_returns_the_message"></a>c [...]
diff --git a/manual/camel-4x-upgrade-guide-4_18.md b/manual/camel-4x-upgrade-guide-4_18.md
index 85f0736317..a0ae285bc9 100644
--- a/manual/camel-4x-upgrade-guide-4_18.md
+++ b/manual/camel-4x-upgrade-guide-4_18.md
@@ -7,6 +7,14 @@ This document is for helping you upgrade your Apache Camel application from Came
## Upgrading from 4.18.5 to 4.18.6
+### camel-lra - only an LRA hosted by the configured coordinator is joined
+
+The LRA saga service now joins, completes or compensates an LRA only when its URL is under the configured LRA coordinator (`coordinatorUrl` followed by `coordinatorContextPath`). A message whose `Long-Running-Action` header holds the URL of another coordinator now fails, instead of the saga service calling that URL.
+
+If your participants reach the same coordinator under different URLs, for example with different host names, list the other coordinator URLs, including the context path, in the new `allowedCoordinatorUrls` option (`camel.lra.allowedCoordinatorUrls`).
+
+This also applies to the LRAs the service starts itself, which a nested saga route looks up again: when the coordinator returns LRA URLs under another base URL than `coordinatorUrl`, for example behind a proxy, add that base URL to `allowedCoordinatorUrls` as well.
+
### camel-netty-http - the roles of a security constraint are matched by role name
The roles of a `SecurityConstraintMapping` inclusion are a comma-separated list of role names, and an authenticated user is now accepted only when one of their roles is equal to one of those names. The comparison is case-sensitive, whitespace around each name and blank entries are ignored, and a value of `*` still accepts any role. A roles value that uses another separator, such as `admin;guest` or `admin guest`, must be changed to `admin,guest`.
diff --git a/manual/camel-4x-upgrade-guide-4_22.html b/manual/camel-4x-upgrade-guide-4_22.html
index d3e7c741db..00076b8c6a 100644
--- a/manual/camel-4x-upgrade-guide-4_22.html
+++ b/manual/camel-4x-upgrade-guide-4_22.html
@@ -1,4 +1,4 @@
-<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>Apache Camel 4.x Upgrade Guide :: Apache Camel</title> <link rel="canonical" href="https://camel.apache.org/manual/camel-4x-upgrade-guide-4_22.html"> <meta name="generator" content="Antora 3.2.0"> <link rel="stylesheet" href="../_/css/vendor/docsearch-5db8a73adb.css"> <link rel="stylesheet" href="../_/css/site-fcc1ff1ab1.css"> <meta name="application-n [...]
+<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>Apache Camel 4.x Upgrade Guide :: Apache Camel</title> <link rel="canonical" href="https://camel.apache.org/manual/camel-4x-upgrade-guide-4_22.html"> <meta name="generator" content="Antora 3.2.0"> <link rel="stylesheet" href="../_/css/vendor/docsearch-5db8a73adb.css"> <link rel="stylesheet" href="../_/css/site-fcc1ff1ab1.css"> <meta name="application-n [...]
.unmarshal().json(DynamicRouterControlMessage.class)
.to("dynamic-router-control:subscribe?allowPredicateFromMessage=true");</code></pre> </div> </div> <div class="paragraph"> <p>Two alternatives avoid the flag entirely. A control message may still name a <code>predicateBean</code>, which selects a <code>Predicate</code> that the route author bound in the registry; that path is unchanged. The control endpoint may also carry <code>predicate</code> and <code>expressionLanguage</code> as URI parameters, in which case every subscription ma [...]
+ "&deserializationFilter=com.example.model.**;java.**;!*")</code></pre> </div> </div> <div class="paragraph"> <p>Setting the <code>serializer</code> option to a custom <code>RedisSerializer</code> bypasses the filter entirely, since Camel then no longer controls how the payload is read.</p> </div> </div> <div class="sect2"> <h3 id="_camel_infinispan_the_aggregation_repository_keeps_completed_exchanges_for_recovery"><a class="anchor" href="#_camel_infinispan_the_aggregation_repo [...]
diff --git a/manual/camel-4x-upgrade-guide-4_22.md b/manual/camel-4x-upgrade-guide-4_22.md
index 71ff8f26cc..6b5d608958 100644
--- a/manual/camel-4x-upgrade-guide-4_22.md
+++ b/manual/camel-4x-upgrade-guide-4_22.md
@@ -7,6 +7,14 @@ This document is for helping you upgrade your Apache Camel application from Came
## Upgrading from 4.22.1 to 4.22.2
+### camel-lra - only an LRA hosted by the configured coordinator is joined
+
+The LRA saga service now joins, completes or compensates an LRA only when its URL is under the configured LRA coordinator (`coordinatorUrl` followed by `coordinatorContextPath`). A message whose `Long-Running-Action` header holds the URL of another coordinator now fails, instead of the saga service calling that URL.
+
+If your participants reach the same coordinator under different URLs, for example with different host names, list the other coordinator URLs, including the context path, in the new `allowedCoordinatorUrls` option (`camel.lra.allowedCoordinatorUrls`).
+
+This also applies to the LRAs the service starts itself, which a nested saga route looks up again: when the coordinator returns LRA URLs under another base URL than `coordinatorUrl`, for example behind a proxy, add that base URL to `allowedCoordinatorUrls` as well.
+
### camel-management - Route group exchange counters count once per entry into the group again
In 4.22.1, the route group MBean (`ManagedRouteGroupMBean`) exchange counters and processing times counted each exchange once per member route instead of once per entry into the group. This was an unintended side effect of CAMEL-24590. The counters now count each exchange once per entry into the group again, as in 4.22.0: calls nested inside another route of the same group are not counted again.
@@ -168,6 +176,12 @@ Three changes to `CryptoDataFormat`, none of which affects the format of data al
Not changed: the HMAC key is still derived from the same key material as the cipher. Separating them would change the MAC written into the message and so could not be read by earlier versions; that is tracked separately.
+### camel-aws2-s3 - a listed object that cannot be fetched is skipped
+
+When the consumer lists the bucket, a failure to get one of the listed objects (or to download its content) no longer fails the poll, as long as another object of that listing could be got: the object is skipped, the other listed objects are consumed in that poll, and the skipped object is tried again by a later poll. An object that no longer exists (for example deleted by another consumer after the listing) is skipped with a log line at `DEBUG`. Any other failure is given to the excepti [...]
+
+The poll still fails, as before, when none of the listed objects could be got and at least one get failed with an error other than that the object no longer exists (for example expired credentials, no permission to get objects, throttling): the failure of the first object is then the failure of the poll, and `backoffErrorThreshold` applies. In both cases the objects are no longer kept in the `inProgressRepository`; before, the object (or a new object with the same key) was skipped by all [...]
+
## Upgrading from 4.22.0 to 4.22.1
### camel-docling
diff --git a/manual/camel-4x-upgrade-guide-4_23.html b/manual/camel-4x-upgrade-guide-4_23.html
index 892ae028c3..8013b0f07d 100644
--- a/manual/camel-4x-upgrade-guide-4_23.html
+++ b/manual/camel-4x-upgrade-guide-4_23.html
@@ -1,13 +1,4 @@
-<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>Apache Camel 4.x Upgrade Guide :: Apache Camel</title> <link rel="canonical" href="https://camel.apache.org/manual/camel-4x-upgrade-guide-4_23.html"> <meta name="generator" content="Antora 3.2.0"> <link rel="stylesheet" href="../_/css/vendor/docsearch-5db8a73adb.css"> <link rel="stylesheet" href="../_/css/site-fcc1ff1ab1.css"> <meta name="application-n [...]
-camel.resource.http.read-timeout = 30000</code></pre> </div> </div> </div> <div class="sect2"> <h3 id="_camel_oauth"><a class="anchor" href="#_camel_oauth"></a>camel-oauth</h3> <div class="paragraph"> <p>OAuth client credentials token caching now distinguishes profiles by client secret and requested scope, in addition to token endpoint and client ID. Profiles with different credentials or scopes request separate tokens instead of reusing the same cached token. Applications using such pro [...]
- .marshal().avro(AvroLibrary.ApacheAvro, Value.getClassSchema())
- .to("kafka:orders-avro");</code></pre> </div> </div> <div class="paragraph"> <p>For additional packages not inferred from the schema, configure the data format in Java:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">AvroDataFormat avro = new AvroDataFormat(Value.getClassSchema());
-avro.setSerializablePackages("com.example.orders.avro");</code></pre> </div> </div> <div class="paragraph"> <p>If you use <code>camel-avro-rpc</code>, Camel automatically trusts <code>org.apache.avro</code>, which contains the Avro IPC handshake classes. You only need <code>serializablePackages</code> or the JVM property for packages not inferred from the configured protocol.</p> </div> <div class="paragraph"> <p>Do not use <code>*</code>, as it disables Avro’s class-loading protec [...]
- .to("aws2-s3://mybucket?keyName=RAW(${date:now:yyyyMMdd}/file.txt)");</code></pre> </div> </div> <div class="paragraph"> <p>A route that needs a dynamic value on the header must evaluate it in the route, so the header already holds the resolved value when it reaches the producer:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">from("direct:start")
- .setHeader(AWS2S3Constants.KEY, simple("${date:now:yyyyMMdd}/file.txt"))
- .to("aws2-s3://mybucket");</code></pre> </div> </div> <div class="paragraph"> <p>A header that carries a literal <code>${…​}</code> string is now used as the object key verbatim instead of being evaluated.</p> </div> <div class="paragraph"> <p>A configured <code>keyName</code> or <code>bucketName</code> whose Simple expression resolves to <code>null</code> now fails with an <code>IllegalArgumentException</code> at the producer, instead of passing a <code>null</code> key/b [...]
- .unmarshal().json(DynamicRouterControlMessage.class)
- .to("dynamic-router-control:subscribe?allowPredicateFromMessage=true");</code></pre> </div> </div> <div class="paragraph"> <p>The option is annotated <code>security = "insecure:dev"</code>, so with <code>camel.main.profile = prod</code> the default policy for that category is <code>fail</code>, and an endpoint that sets <code>allowPredicateFromMessage=true</code> will not start unless you relax <code>camel.security.insecureDevPolicy</code>.</p> </div> <div class="paragraph"> <p>Two a [...]
+<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>Apache Camel 4.x Upgrade Guide :: Apache Camel</title> <link rel="canonical" href="https://camel.apache.org/manual/camel-4x-upgrade-guide-4_23.html"> <meta name="generator" content="Antora 3.2.0"> <link rel="stylesheet" href="../_/css/vendor/docsearch-5db8a73adb.css"> <link rel="stylesheet" href="../_/css/site-fcc1ff1ab1.css"> <meta name="application-n [...]
from("langchain4j-tools:weather?tags=weather&description=Get weather&parameter.city=string")
.setBody(constant("{\"city\": \"Paris\", \"temp\": \"22C\"}"));
@@ -17,7 +8,7 @@ from("ai-tool:weather?tags=weather&description=Get weather&parameter.cit
.to("langchain4j-agent:assistant?agent=#myAgent&tags=weather");</code></pre> </div> </div> <div class="paragraph"> <p>Add the <code>camel-ai-tool</code> dependency to your project:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-xml hljs" data-lang="xml"><dependency>
<groupId>org.apache.camel</groupId>
<artifactId>camel-ai-tool</artifactId>
-</dependency></code></pre> </div> </div> </div> <div class="sect3"> <h4 id="_camel_leveldb"><a class="anchor" href="#_camel_leveldb"></a>camel-leveldb</h4> <div class="paragraph"> <p><code>camel-leveldb</code> was deprecated in 4.18. <code>leveldb</code> library is no more maintained and it exists several alternatives for file-based database nowadays.</p> </div> </div> <div class="sect3"> <h4 id="_camel_reactive_executor_tomcat"><a class="anchor" href="#_camel_reactive_executor_tom [...]
+</dependency></code></pre> </div> </div> </div> <div class="sect3"> <h4 id="_camel_leveldb"><a class="anchor" href="#_camel_leveldb"></a>camel-leveldb</h4> <div class="paragraph"> <p><code>camel-leveldb</code> was deprecated in 4.18. <code>leveldb</code> library is no more maintained and it exists several alternatives for file-based database nowadays.</p> </div> </div> <div class="sect3"> <h4 id="_camel_reactive_executor_tomcat"><a class="anchor" href="#_camel_reactive_executor_tom [...]
IdempotentRepository repo = MemoryIdempotentRepository.memoryIdempotentRepository();
// After (simple — defaults to in-memory)
@@ -31,7 +22,7 @@ AggregationRepository repo = new MemoryAggregationRepository();
AggregationRepository repo = new KeyValueAggregationRepository();
// After (explicit — useful when sharing a store or using a custom KeyValueRepository)
-AggregationRepository repo = new KeyValueAggregationRepository(new MemoryKeyValueRepository());</code></pre> </div> </div> </div> <div class="sect3"> <h4 id="_xml_dsl"><a class="anchor" href="#_xml_dsl"></a>XML DSL</h4> <div class="paragraph"> <p>If you define the repository as a bean in XML, a simple one-to-one replacement is sufficient since the adapters default to an in-memory backing store:</p> </div> <div class="paragraph"> <p>For idempotent consumers:</p> </div> <div class="listing [...]
+AggregationRepository repo = new KeyValueAggregationRepository(new MemoryKeyValueRepository());</code></pre> </div> </div> </div> <div class="sect4"> <h5 id="_xml_dsl"><a class="anchor" href="#_xml_dsl"></a>XML DSL</h5> <div class="paragraph"> <p>If you define the repository as a bean in XML, a simple one-to-one replacement is sufficient since the adapters default to an in-memory backing store:</p> </div> <div class="paragraph"> <p>For idempotent consumers:</p> </div> <div class="listing [...]
<bean name="myRepo" type="org.apache.camel.support.processor.idempotent.MemoryIdempotentRepository"/>
<!-- After -->
@@ -44,19 +35,7 @@ AggregationRepository repo = new KeyValueAggregationRepository(new MemoryKeyValu
<constructors>
<constructor value="#kvStore"/>
</constructors>
-</bean></code></pre> </div> </div> <div class="paragraph"> <p>The <code>idempotentRepository</code> and <code>aggregationRepository</code> attributes in the route DSL remain unchanged — they still reference the bean by its name.</p> </div> <div class="paragraph"> <p>The deprecated classes continue to work but will be removed in a future release.</p> </div> </div> </div> <div class="sect2"> <h3 id="_camel_core_endpoint_uri_normalization_is_now_order_independent"><a class="anchor" hr [...]
-KafkaManualCommit manual = exchange.getMessage().getBody(Exchange.class)
- .getMessage().getHeader(KafkaConstants.MANUAL_COMMIT, KafkaManualCommit.class);
-
-// now
-KafkaManualCommit manual = exchange.getMessage().getHeader(KafkaConstants.MANUAL_COMMIT, KafkaManualCommit.class);</code></pre> </div> </div> <div class="paragraph"> <p>The message of the part is copied into the child exchange, so the exchanges in the original list are left untouched and remain usable after the split, for example by the batching consumer that owns them. Exchange properties of the part are not carried over to the child exchange, as is already the case for <code>Message</c [...]
-.to("netty-http:http://localhost/{{basePath}}")</code></pre> </div> </div> <div class="paragraph"> <p>A <code>{{…​}}</code> token arriving in <code>CamelHttpUri</code> or <code>CamelRestHttpUri</code> is now treated as a literal part of the URI rather than being expanded. Routes that relied on that expansion must resolve the value before it reaches the header, or keep the placeholder in the route.</p> </div> <div class="paragraph"> <p>The affected sites, all of which resolved [...]
- "global": [ { "key": "foo", "type": "java.lang.String", "value": "bar" } ]
-}</code></pre> </div> </div> <div class="paragraph"> <p>After:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-json hljs" data-lang="json">{
- "repositories": [
- { "id": "global", "variables": [ { "key": "foo", "type": "java.lang.String", "value": "bar" } ] }
- ]
-}</code></pre> </div> </div> <div class="paragraph"> <p>Each repository is now an entry in the <code>repositories</code> array carrying its own <code>id</code>, rather than the id being a dynamic top-level JSON key. Anything that parses this console’s raw JSON directly (custom tooling, or scripts calling the dev console HTTP endpoint) must be updated to the new shape. The <code>camel get variable</code> CLI command has already been updated accordingly.</p> </div> </div> <div class= [...]
+</bean></code></pre> </div> </div> <div class="paragraph"> <p>The <code>idempotentRepository</code> and <code>aggregationRepository</code> attributes in the route DSL remain unchanged — they still reference the bean by its name.</p> </div> <div class="paragraph"> <p>The deprecated classes continue to work but will be removed in a future release.</p> </div> </div> </div> <div class="sect3"> <h4 id="_camel_minio"><a class="anchor" href="#_camel_minio"></a>camel-minio</h4> <div class= [...]
kind: Pipe
metadata:
name: my-pipe
@@ -74,31 +53,37 @@ spec:
- to:
uri: "https://my-service/api"
- to:
- uri: log:result</code></pre> </div> </div> </div> <div class="sect2"> <h3 id="_camel_mail"><a class="anchor" href="#_camel_mail"></a>camel-mail</h3> <div class="paragraph"> <p><code>MimeMultipartDataFormat</code> now uses <code>MailHeaderFilterStrategy</code> instead of a plain <code>DefaultHeaderFilterStrategy</code> when <code>headersInline</code> unmarshal copies the remaining MIME headers onto the Camel message. That strategy filters the <code>mail.smtp.</code> and <code> [...]
- + "&deserializationFilter=com.example.model.**;java.**;!*")</code></pre> </div> </div> <div class="paragraph"> <p>Setting the <code>serializer</code> option to a custom <code>RedisSerializer</code> bypasses the filter entirely, since Camel then no longer controls how the payload is read.</p> </div> </div> <div class="sect2"> <h3 id="_camel_spring_redis_springredisidempotentrepository_remove_returns_false_for_a_missing_key"><a class="anchor" href="#_camel_spring_redis_springredis [...]
-camel.routeController.backOffDelay = 2000
-camel.routeController.backOffMaxDelay = 60000</code></pre> </div> </div> </div> <div class="sect2"> <h3 id="_camel_paho_mqtt5"><a class="anchor" href="#_camel_paho_mqtt5"></a>camel-paho-mqtt5</h3> <div class="paragraph"> <p>When <code>automaticReconnect=true</code> and the MQTT broker reconnects, the consumer now restarts the route if the post-reconnect <code>subscribe()</code> call fails. Previously a failed resubscription (for example, when the broker does not send a SUBACK and the Pah [...]
-camel.routeController.backOffDelay = 2000
-camel.routeController.backOffMaxDelay = 60000</code></pre> </div> </div> </div> <div class="sect2"> <h3 id="_camel_http"><a class="anchor" href="#_camel_http"></a>camel-http</h3> <div class="paragraph"> <p>The OAuth2 client-credentials token cache was keyed on the request URI, the client id and the client secret only. <code>oauth2Scope</code>, <code>oauth2TokenEndpoint</code> and <code>oauth2ResourceIndicator</code> all shape the token that gets minted, but none of them was part of the k [...]
- if (!pbe.verify()) {
- throw new PGPException("Message failed integrity check");
- }
-}</code></pre> </div> </div> <div class="paragraph"> <p>The older symmetrically encrypted data packet carries no such code, so a message using it skipped the check entirely. Because the packet type is chosen by whoever produced the message, that left the sender — or anyone able to rewrite the message in transit — deciding whether the check applied. The existing <code>integrity</code> option governs marshalling only and has no decrypt-side counterpart.</p> </div> <div class="paragraph"> < [...]
- &filterInit.allowedOrigins=https://app.example
- &filterInit.allowCredentials=true</code></pre> </div> </div> <div class="paragraph"> <p>Setting <code>filterInit.allowCredentials=true</code> while leaving <code>filterInit.allowedOrigins</code> unset or <code>*</code> is logged as a warning at startup, because that combination lets any origin make credentialed requests.</p> </div> <div class="paragraph"> <p>The same change was made to camel-platform-http-vertx.</p> </div> </div> <div class="sect2"> <h3 id="_camel_mllp"><a class= [...]
-OAuth oauth = factory.findOAuth().orElseGet(factory::createOAuth);
-oauth.getOAuthConfig().getJWTOptions().setLeeway(30);</code></pre> </div> </div> </div> <div class="sect2"> <h3 id="_camel_platform_http_vertx"><a class="anchor" href="#_camel_platform_http_vertx"></a>camel-platform-http-vertx</h3> <div class="paragraph"> <p>The CORS handler used to send <code>Access-Control-Allow-Credentials: true</code> on every response to a request carrying an <code>Origin</code> header — including responses to origins it had just decided not to allow, because the he [...]
-camel.debug.jmx-connector-port = 1099</code></pre> </div> </div> <div class="paragraph"> <p>Enable it only on a trusted network, with the port bound to a loopback interface or protected by a firewall.</p> </div> <div class="paragraph"> <p>The <code>camel debug</code> command of Camel JBang is unaffected: it drives a Spring Boot application through the local CLI connector from <code>camel-cli-connector-starter</code>, not through JMX.</p> </div> </div> <div class="sect3"> <h4 id="_camel_s [...]
- -c encrypt -p "$JASYPT_PASSWORD" -i my-secret-value \
- -a PBEWITHHMACSHA256ANDAES_256 -riga SHA1PRNG</code></pre> </div> </div> <div class="paragraph"> <p>The <code>camel-jasypt</code> component itself is unchanged: <code>JasyptPropertiesParser</code> leaves the algorithm unset, so it still falls back to the Jasypt library default of <code>PBEWithMD5AndDES</code>. Aligning the component with the starter is a separate change; until it lands, an application that configures <code>JasyptPropertiesParser</code> directly keeps the old algorithm [...]
-component.setVertxFactory(new io.vertx.core.impl.VertxBuilder(options));
+ uri: log:result</code></pre> </div> </div> </div> <div class="sect3"> <h4 id="_camel_catalog_did_you_mean_suggestions_by_default_camel_catalog_suggest_deprecated"><a class="anchor" href="#_camel_catalog_did_you_mean_suggestions_by_default_camel_catalog_suggest_deprecated"></a>camel-catalog - did-you-mean suggestions by default, camel-catalog-suggest deprecated</h4> <div class="paragraph"> <p><code>CamelCatalog</code> now suggests the closest option names (and enum values) by [...]
+ .marshal().avro(AvroLibrary.ApacheAvro, Value.getClassSchema())
+ .to("kafka:orders-avro");</code></pre> </div> </div> <div class="paragraph"> <p>For additional packages not inferred from the schema, configure the data format in Java:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">AvroDataFormat avro = new AvroDataFormat(Value.getClassSchema());
+avro.setSerializablePackages("com.example.orders.avro");</code></pre> </div> </div> <div class="paragraph"> <p>If you use <code>camel-avro-rpc</code>, Camel automatically trusts <code>org.apache.avro</code>, which contains the Avro IPC handshake classes. You only need <code>serializablePackages</code> or the JVM property for packages not inferred from the configured protocol.</p> </div> <div class="paragraph"> <p>Do not use <code>*</code>, as it disables Avro’s class-loading protec [...]
+ .to("aws2-s3://mybucket?keyName=RAW(${date:now:yyyyMMdd}/file.txt)");</code></pre> </div> </div> <div class="paragraph"> <p>A route that needs a dynamic value on the header must evaluate it in the route, so the header already holds the resolved value when it reaches the producer:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-java hljs" data-lang="java">from("direct:start")
+ .setHeader(AWS2S3Constants.KEY, simple("${date:now:yyyyMMdd}/file.txt"))
+ .to("aws2-s3://mybucket");</code></pre> </div> </div> <div class="paragraph"> <p>A header that carries a literal <code>${…​}</code> string is now used as the object key verbatim instead of being evaluated.</p> </div> <div class="paragraph"> <p>A configured <code>keyName</code> or <code>bucketName</code> whose Simple expression resolves to <code>null</code> now fails with an <code>IllegalArgumentException</code> at the producer, instead of passing a <code>null</code> key/b [...]
+ "global": [ { "key": "foo", "type": "java.lang.String", "value": "bar" } ]
+}</code></pre> </div> </div> <div class="paragraph"> <p>After:</p> </div> <div class="listingblock"> <div class="content"> <pre class="highlightjs highlight"><code class="language-json hljs" data-lang="json">{
+ "repositories": [
+ { "id": "global", "variables": [ { "key": "foo", "type": "java.lang.String", "value": "bar" } ] }
+ ]
+}</code></pre> </div> </div> <div class="paragraph"> <p>Each repository is now an entry in the <code>repositories</code> array carrying its own <code>id</code>, rather than the id being a dynamic top-level JSON key. Anything that parses this console’s raw JSON directly (custom tooling, or scripts calling the dev console HTTP endpoint) must be updated to the new shape. The <code>camel get variable</code> CLI command has already been updated accordingly.</p> </div> </div> </div> <div [...]
+camel.resource.http.read-timeout = 30000</code></pre> </div> </div> </div> <div class="sect3"> <h4 id="_internal_processor_advices"><a class="anchor" href="#_internal_processor_advices"></a>Internal processor advices</h4> <div class="paragraph"> <p>When a <code>CamelInternalProcessorAdvice</code> fails in its <code>before</code> method, then the <code>after</code> method is now executed for the advices whose <code>before</code> was already executed. Previously they were skipped, which co [...]
+KafkaManualCommit manual = exchange.getMessage().getBody(Exchange.class)
+ .getMessage().getHeader(KafkaConstants.MANUAL_COMMIT, KafkaManualCommit.class);
-// after
-component.setVertxFactory(Vertx.builder().with(options));</code></pre> </div> </div> <div class="paragraph"> <p>An application that does not set <code>vertxFactory</code> is not affected.</p> </div> </div> <div class="sect2"> <h3 id="_camel_disruptor_an_interrupted_requestreply_producer_fails_the_exchange"><a class="anchor" href="#_camel_disruptor_an_interrupted_requestreply_producer_fails_the_exchange"></a>camel-disruptor - an interrupted request/reply producer fails the exchange</h3> < [...]
+// now
+KafkaManualCommit manual = exchange.getMessage().getHeader(KafkaConstants.MANUAL_COMMIT, KafkaManualCommit.class);</code></pre> </div> </div> <div class="paragraph"> <p>The message of the part is copied into the child exchange, so the exchanges in the original list are left untouched and remain usable after the split, for example by the batching consumer that owns them. Exchange properties of the part are not carried over to the child exchange, as is already the case for <code>Message</c [...]
+ from:
+ uri: direct:start
+ steps:
+ - circuitBreaker:
+ inheritErrorHandler: "{{myInheritFlag}}"
+ steps:
+ - to:
+ uri: mock:a</code></pre> </div> </div> <div class="paragraph"> <p>Before this change the value was converted to a <code>Boolean</code> while the route was being loaded, so <code>inheritErrorHandler: "{{myInheritFlag}}"</code> silently evaluated to <code>false</code> instead of resolving the placeholder.</p> </div> <div class="paragraph"> <p>The accessors changed accordingly:</p> </div> <div class="ulist"> <ul> <li> <p><code>ProcessorDefinition.getInheritErrorHandler()</ [...]
expression:
groovy:
expression: "counter == 1 ? 'resource:file:order.json' : 'resource:file:order-bad-email.json'"
- resolveResource: true</code></pre> </div> </div> <div class="paragraph"> <p>A name without a scheme, <code>resource:orderTemplate.json</code>, is a classpath resource. The loaded content is the final value and is not evaluated again. Nothing changes without the option: the <code>resource:</code> prefix on the expression text itself is resolved as before, and a returned value that happens to start with <code>resource:</code> stays as it is.</p> </div> </div> <div class="sect2"> <h [...]
+ resolveResource: true</code></pre> </div> </div> <div class="paragraph"> <p>A name without a scheme, <code>resource:orderTemplate.json</code>, is a classpath resource. The loaded content is the final value and is not evaluated again. Nothing changes without the option: the <code>resource:</code> prefix on the expression text itself is resolved as before, and a returned value that happens to start with <code>resource:</code> stays as it is.</p> </div> </div> <div class="sect3"> <h [...]
id: myTemplate
parameters:
- name: greeting
@@ -107,16 +92,31 @@ component.setVertxFactory(Vertx.builder().with(options));</code></pre> </div> </
uri: direct:start
steps:
- log:
- message: "{{greeting}}"</code></pre> </div> </div> <div class="paragraph"> <p>Before this change the value was converted to a <code>Boolean</code> while the route was being loaded, so <code>required: "{{myRequiredFlag}}"</code> silently evaluated to <code>false</code> instead of resolving the placeholder.</p> </div> <div class="paragraph"> <p>The accessors changed accordingly:</p> </div> <div class="ulist"> <ul> <li> <p><code>ParamDefinition.getRequired()</code> and <code>set [...]
- from:
- uri: direct:start
- steps:
- - circuitBreaker:
- inheritErrorHandler: "{{myInheritFlag}}"
- steps:
- - to:
- uri: mock:a</code></pre> </div> </div> <div class="paragraph"> <p>Before this change the value was converted to a <code>Boolean</code> while the route was being loaded, so <code>inheritErrorHandler: "{{myInheritFlag}}"</code> silently evaluated to <code>false</code> instead of resolving the placeholder.</p> </div> <div class="paragraph"> <p>The accessors changed accordingly:</p> </div> <div class="ulist"> <ul> <li> <p><code>ProcessorDefinition.getInheritErrorHandler()</ [...]
+ message: "{{greeting}}"</code></pre> </div> </div> <div class="paragraph"> <p>Before this change the value was converted to a <code>Boolean</code> while the route was being loaded, so <code>required: "{{myRequiredFlag}}"</code> silently evaluated to <code>false</code> instead of resolving the placeholder.</p> </div> <div class="paragraph"> <p>The accessors changed accordingly:</p> </div> <div class="ulist"> <ul> <li> <p><code>ParamDefinition.getRequired()</code> and <code>set [...]
+ if (!pbe.verify()) {
+ throw new PGPException("Message failed integrity check");
+ }
+}</code></pre> </div> </div> <div class="paragraph"> <p>The older symmetrically encrypted data packet carries no such code, so a message using it skipped the check entirely. Because the packet type is chosen by whoever produced the message, that left the sender — or anyone able to rewrite the message in transit — deciding whether the check applied. The existing <code>integrity</code> option governs marshalling only and has no decrypt-side counterpart.</p> </div> <div class="paragraph"> < [...]
+ .unmarshal().json(DynamicRouterControlMessage.class)
+ .to("dynamic-router-control:subscribe?allowPredicateFromMessage=true");</code></pre> </div> </div> <div class="paragraph"> <p>The option is annotated <code>security = "insecure:dev"</code>, so with <code>camel.main.profile = prod</code> the default policy for that category is <code>fail</code>, and an endpoint that sets <code>allowPredicateFromMessage=true</code> will not start unless you relax <code>camel.security.insecureDevPolicy</code>.</p> </div> <div class="paragraph"> <p>Two a [...]
<groupId>org.apache.camel</groupId>
<artifactId>camel-kafka-common</artifactId>
<version>${camel.version}</version>
-</dependency></code></pre> </div> </div> </div> <div class="sect2"> <h3 id="_camel_pulsar_the_producer_no_longer_replaces_the_body_with_the_message_id"><a class="anchor" href="#_camel_pulsar_the_producer_no_longer_replaces_the_body_with_the_message_id"></a>camel-pulsar - the producer no longer replaces the body with the message id</h3> <div class="paragraph"> <p>After sending, the producer used to overwrite the message body with the <code>MessageId</code> returned by the broker, so [...]
\ No newline at end of file
+</dependency></code></pre> </div> </div> </div> </div> <div class="sect2"> <h3 id="_camel_keycloak"><a class="anchor" href="#_camel_keycloak"></a>camel-keycloak</h3> <div class="paragraph"> <p>When <code>validateIssuer</code> is enabled and the token is checked by introspection, an introspection response carrying no <code>iss</code> claim used to log a warning and pass. It is now rejected with <code>Token issuer missing: expected '<issuer>' but the introspection result carrie [...]
+OAuth oauth = factory.findOAuth().orElseGet(factory::createOAuth);
+oauth.getOAuthConfig().getJWTOptions().setLeeway(30);</code></pre> </div> </div> </div> </div> <div class="sect2"> <h3 id="_camel_openai"><a class="anchor" href="#_camel_openai"></a>camel-openai</h3> <div class="sect3"> <h4 id="_llm_scheme_alias"><a class="anchor" href="#_llm_scheme_alias"></a>LLM scheme alias</h4> <div class="paragraph"> <p>The <code>camel-openai</code> component now registers the <code>llm</code> URI scheme alongside the existing <code>openai</code> scheme. Both scheme [...]
+camel.routeController.backOffDelay = 2000
+camel.routeController.backOffMaxDelay = 60000</code></pre> </div> </div> </div> <div class="sect3"> <h4 id="_camel_paho_mqtt5_post_reconnect_resubscribe_failure_handling"><a class="anchor" href="#_camel_paho_mqtt5_post_reconnect_resubscribe_failure_handling"></a>camel-paho-mqtt5 - post-reconnect resubscribe failure handling</h4> <div class="paragraph"> <p>When <code>automaticReconnect=true</code> and the MQTT broker reconnects, the consumer now restarts the route if the post-reconnect <c [...]
+camel.routeController.backOffDelay = 2000
+camel.routeController.backOffMaxDelay = 60000</code></pre> </div> </div> </div> </div> <div class="sect2"> <h3 id="_camel_platform_http_and_camel_platform_http_vertx"><a class="anchor" href="#_camel_platform_http_and_camel_platform_http_vertx"></a>camel-platform-http and camel-platform-http-vertx</h3> <div class="sect3"> <h4 id="_vert_x_string_response_in_the_charset_of_the_content_type"><a class="anchor" href="#_vert_x_string_response_in_the_charset_of_the_content_type"></a>Vert.x - Str [...]
+ &filterInit.allowedOrigins=https://app.example
+ &filterInit.allowCredentials=true</code></pre> </div> </div> <div class="paragraph"> <p>Setting <code>filterInit.allowCredentials=true</code> while leaving <code>filterInit.allowedOrigins</code> unset or <code>*</code> is logged as a warning at startup, because that combination lets any origin make credentialed requests.</p> </div> <div class="paragraph"> <p>The same change was made to camel-platform-http-vertx.</p> </div> </div> <div class="sect3"> <h4 id="_multipart_upload_whit [...]
+camel.debug.jmx-connector-port = 1099</code></pre> </div> </div> <div class="paragraph"> <p>Enable it only on a trusted network, with the port bound to a loopback interface or protected by a firewall.</p> </div> <div class="paragraph"> <p>The <code>camel debug</code> command of Camel JBang is unaffected: it drives a Spring Boot application through the local CLI connector from <code>camel-cli-connector-starter</code>, not through JMX.</p> </div> </div> <div class="sect3"> <h4 id="_camel_s [...]
+ -c encrypt -p "$JASYPT_PASSWORD" -i my-secret-value \
+ -a PBEWITHHMACSHA256ANDAES_256 -riga SHA1PRNG</code></pre> </div> </div> <div class="paragraph"> <p>The <code>camel-jasypt</code> component itself is unchanged: <code>JasyptPropertiesParser</code> leaves the algorithm unset, so it still falls back to the Jasypt library default of <code>PBEWithMD5AndDES</code>. Aligning the component with the starter is a separate change; until it lands, an application that configures <code>JasyptPropertiesParser</code> directly keeps the old algorithm [...]
+ + "&deserializationFilter=com.example.model.**;java.**;!*")</code></pre> </div> </div> <div class="paragraph"> <p>Setting the <code>serializer</code> option to a custom <code>RedisSerializer</code> bypasses the filter entirely, since Camel then no longer controls how the payload is read.</p> </div> </div> <div class="sect3"> <h4 id="_springredisidempotentrepository_remove_returns_false_for_a_missing_key"><a class="anchor" href="#_springredisidempotentrepository_remove_returns_fa [...]
+.to("netty-http:http://localhost/{{basePath}}")</code></pre> </div> </div> <div class="paragraph"> <p>A <code>{{…​}}</code> token arriving in <code>CamelHttpUri</code> or <code>CamelRestHttpUri</code> is now treated as a literal part of the URI rather than being expanded. Routes that relied on that expansion must resolve the value before it reaches the header, or keep the placeholder in the route.</p> </div> <div class="paragraph"> <p>The affected sites, all of which resolved [...]
+component.setVertxFactory(new io.vertx.core.impl.VertxBuilder(options));
+
+// after
+component.setVertxFactory(Vertx.builder().with(options));</code></pre> </div> </div> <div class="paragraph"> <p>An application that does not set <code>vertxFactory</code> is not affected.</p> </div> </div> </div> <div class="sect2"> <h3 id="_camel_vertx_http_the_rest_producer_applies_the_outbound_header_filter"><a class="anchor" href="#_camel_vertx_http_the_rest_producer_applies_the_outbound_header_filter"></a>camel-vertx-http - the REST producer applies the outbound header filter</h3> < [...]
\ No newline at end of file
diff --git a/manual/camel-4x-upgrade-guide-4_23.md b/manual/camel-4x-upgrade-guide-4_23.md
index ee6b1baf01..32c270fcc5 100644
--- a/manual/camel-4x-upgrade-guide-4_23.md
+++ b/manual/camel-4x-upgrade-guide-4_23.md
@@ -7,15 +7,133 @@ This document is for helping you upgrade your Apache Camel application from Came
## Upgrading Camel 4.22 to 4.23
-### camel-management - Route group exchange counters count once per entry into the group
+### Removed Components, Languages, and Tools
-The route group MBean (`ManagedRouteGroupMBean`) exchange counters and processing times now count each exchange once per entry into the group: calls nested inside another route of the same group are not counted again. In 4.22.1, a regression (CAMEL-24590) caused them to count once per member route instead.
+#### camel-csimple, camel-csimple-joor and csimple-maven-plugin
-### camel-core - Rest DSL response Content-Type
+The `csimple` (compiled simple) language was deprecated in 4.19. Use the `simple` language instead.
-Under json or xml binding, a response without a Content-Type header again takes it from the `produces` of the rest verb, as before Camel 4.18.4 and 4.22.0. Those releases used `application/json` (or `application/xml`) whenever the binding mode allowed it and marshalled the body, so a verb producing `text/plain` answered with a json-quoted body and a binary body failed. When `produces` lists several media types, the first json (or xml) type is used, otherwise the first one. Wildcards such [...]
+#### camel-archetype-spring
+
+The Maven archetype `camel-archetype-spring` was deprecated in 4.17. Use spring boot instead.
+
+#### camel-catalog-lucene
+
+The maven plugin was deprecated in 4.12. The catalog now has built-in suggestions (see `camel-catalog` below).
+
+#### camel-digitalocean
+
+The component camel-digitalocean was deprecated in 4.21. The java library used has been unmaintained for several years and there is no replacement.
+
+#### camel-hazelcast-atomicvalue
+
+The component `camel-hazelcast-atomicvalue` was deprecated in 4.19.0.
+
+In hazelcast 5.5+, the CP subsystem is only available in the enterprise edition of hazelcast. `hazelcast-pncounter` is a partial replacement.
+
+#### camel-headersmap
+
+The component camel-headersmap was deprecated in 4.21. The default `CaseInsensitiveMap` in camel-core uses a custom O(1) hash table with zero-allocation lookups and header key deduplication, making the external cedarsoftware `java-util` dependency unnecessary. Simply remove the `camel-headersmap` dependency from your project — the core implementation now provides equivalent or better performance.
+
+#### camel-iec60870
+
+`camel-iec60870` was deprecated in 4.21. The library used to implement it NeoScada is no more maintained since 2021. There are no alternatives in Java with compatible license.
+
+#### camel-irc
+
+The component camel-irc was deprecated in 4.21. The library used had no stable release since 2007. There is no Java library very active for this protocol.
+
+#### camel-ironmq
+
+The component camel-ironmq was deprecated in 4.21. The official library used has been unmaintained since 2017 All the other client libraries (in other languages) are unmaintained since the same amount of time. The whole iron-io GitHub organization has almost no activity.
+
+#### camel-joor
+
+The language `joor` was deprecated in 4.3. The language `java` can be used in-place. It was a renaming. Joor is used underneath for `java` expression.
+
+#### camel-json-patch
+
+The `camel-json-patch` was deprecated in 4.19. The library it uses is not actively maintained and this module does not work with Jackson 3.
+
+#### camel-langchain4j-tools
+
+The `camel-langchain4j-tools` component was deprecated in 4.19. Use `camel-ai-tool` to define tools and `camel-langchain4j-agent` for tool-calling with LangChain4j models.
+
+Migrate your tool definition routes from `langchain4j-tools:` to `ai-tool:`:
+
+```java
+// Before
+from("langchain4j-tools:weather?tags=weather&description=Get weather¶meter.city=string")
+ .setBody(constant("{\"city\": \"Paris\", \"temp\": \"22C\"}"));
+
+// After
+from("ai-tool:weather?tags=weather&description=Get weather¶meter.city=string")
+ .setBody(constant("{\"city\": \"Paris\", \"temp\": \"22C\"}"));
+```
+
+Use `langchain4j-agent` with matching tags to invoke tools:
+
+```java
+from("direct:chat")
+ .to("langchain4j-agent:assistant?agent=#myAgent&tags=weather");
+```
+
+Add the `camel-ai-tool` dependency to your project:
+
+```xml
+<dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-ai-tool</artifactId>
+</dependency>
+```
+
+#### camel-leveldb
+
+`camel-leveldb` was deprecated in 4.18. `leveldb` library is no more maintained and it exists several alternatives for file-based database nowadays.
+
+#### camel-reactive-executor-tomcat
+
+The `camel-reactive-executor-tomcat` component has been deprecated in 4.22. It is now removed.
+
+Its cross-thread `ThreadLocal` cleanup relied on reflective access to the private `Thread.threadLocals` field, which is denied by the JDK module system since JDK 17 and is incompatible with virtual threads. Without that cleanup, this executor is functionally identical to the built-in `DefaultReactiveExecutor`.
+
+To migrate, remove the `camel-reactive-executor-tomcat` dependency from your project. Camel will automatically use the default reactive executor.
+
+#### camel-reactive-executor-vertx
+
+The `camel-reactive-executor-vertx` component was deprecated in 4.21. The component has been in an experimental state for a long time and no user feedback has been received to justify continued maintenance.
+
+#### camel-splunk
+
+The `camel-splunk` component was deprecated in 4.19. The Splunk Java SDK it depends on is no longer actively maintained.
+
+Users who only need to **send events to Splunk** can migrate to `camel-splunk-hec`, which uses the Splunk HTTP Event Collector (HEC) over standard HTTPS with no dependency on the Splunk Java SDK.
-### camel-core - Exchange Pooling deprecated
+However, `camel-splunk-hec` is a **producer-only** component. The following `camel-splunk` capabilities have no equivalent in `camel-splunk-hec`:
+
+- **Consumer (search)**: normal searches, real-time searches, and saved-search execution are not supported.
+
+- **TCP streaming**: the `tcp` producer publish type (raw socket streaming to a Splunk TCP input) is not available.
+
+- **SUBMIT and STREAM publish types**: only HEC-based ingestion is supported.
+
+
+If your routes only produce events to Splunk (using the `submit` or `stream` publish types), switching to `camel-splunk-hec` is straightforward — configure the HEC token, index, sourceType, and source on the endpoint. If your routes consume (search) data from Splunk, there is currently no direct replacement within Apache Camel, and you will need to use the Splunk REST API directly or keep using `camel-splunk` until it is removed.
+
+> **Note**
+> `camel-splunk-hec` is NOT deprecated and remains actively maintained.
+
+#### camel-threadpoolfactory-vertx
+
+The component camel-threadpoolfactory-vertx was deprecated in 4.21. The component has been in an experimental state for a long time and no user feedback has been received to justify continued maintenance.
+
+#### camel-zeebe
+
+`camel-zeebe` component was deprecated in 4.19 and has a straightforward replacement with `camel-camunda`. It is removed in 4.23.
+
+### Deprecated Components and Features
+
+#### Exchange Pooling deprecated
Exchange pooling (`exchangeFactory=pooled`) is deprecated and will be removed in a future release. The following classes are deprecated:
@@ -47,197 +165,324 @@ The following `camel.main` configuration properties are deprecated:
To migrate, remove the `camel.main.exchange-factory=pooled` property (and any related capacity/statistics properties) from your `application.properties`. Camel will use the default prototype mode which creates a new exchange per message. A `WARN` is logged at startup if pooled mode is still configured.
-### http and https resources are now resolved with a timeout
+#### MemoryIdempotentRepository and MemoryAggregationRepository deprecated
-Loading a resource from an `http:` or `https:` location - a Groovy script, an XSLT stylesheet, a Velocity template, or anything else resolved through `ResourceHelper` - previously used the JDK defaults, which are to wait indefinitely for both the connection and every read. A server that accepted the connection and then stopped answering would stall `CamelContext` startup with no way to bound the wait.
+`MemoryIdempotentRepository` and `MemoryAggregationRepository` are deprecated in favor of the new `KeyValueIdempotentRepository` and `KeyValueAggregationRepository` adapters wrapping a `MemoryKeyValueRepository`. The new classes delegate to the `KeyValueRepository` SPI introduced in 4.23, which provides a uniform key-value abstraction that can be backed by any store (in-memory, Redis, JDBC, etc.).
-Such a resource is now read with a 10 second connect timeout and a 30 second read timeout, and fails with a `java.net.SocketTimeoutException` instead of hanging. The read timeout applies per read rather than to the transfer as a whole, so a large resource arriving slowly is unaffected as long as data keeps coming.
+##### Java DSL
-Both values can be changed, in milliseconds, and `0` restores the previous wait-forever behaviour:
+To migrate from `MemoryIdempotentRepository`:
-```properties
-camel.resource.http.connect-timeout = 10000
-camel.resource.http.read-timeout = 30000
+```java
+// Before
+IdempotentRepository repo = MemoryIdempotentRepository.memoryIdempotentRepository();
+
+// After (simple — defaults to in-memory)
+IdempotentRepository repo = new KeyValueIdempotentRepository();
+
+// After (explicit — useful when sharing a store or using a custom KeyValueRepository)
+IdempotentRepository repo = new KeyValueIdempotentRepository(new MemoryKeyValueRepository());
```
-### camel-oauth
+To migrate from `MemoryAggregationRepository`:
-OAuth client credentials token caching now distinguishes profiles by client secret and requested scope, in addition to token endpoint and client ID. Profiles with different credentials or scopes request separate tokens instead of reusing the same cached token. Applications using such profiles may make additional token requests after upgrading.
+```java
+// Before
+AggregationRepository repo = new MemoryAggregationRepository();
-The post login url of the authorization code flow is now always built from the origin (`scheme://host[:port]`) of the configured `camel.oauth.redirect-uri`, plus the requested path. `OAuthCodeFlowProcessor` previously rebuilt that url from the `X-Forwarded-Proto` / `X-Forwarded-Host` / `X-Forwarded-Port` request headers, or from the `Host` header behind `CamelHttpUrl` when those were absent. All of those are set by the caller, so a request could point the post login redirect at any origi [...]
+// After (simple — defaults to in-memory)
+AggregationRepository repo = new KeyValueAggregationRepository();
-### Simple language
+// After (explicit — useful when sharing a store or using a custom KeyValueRepository)
+AggregationRepository repo = new KeyValueAggregationRepository(new MemoryKeyValueRepository());
+```
-`${ }` may now hold a predicate, as the braces do in Jakarta EL, Groovy and a JavaScript template: `${body != null && body.size() > 0}` answers whether it matches, instead of being refused with _Operators go outside the function_. The form with the operators outside the braces (`${body} != null && ${body.size()} > 0`) means the same and is unchanged, and the ternary keeps working as before.
+##### XML DSL
-An operator counts only when whitespace surrounds it outside quotes, so a name such as `${header.Content-Length}` and a pattern such as `${date:now:yyyy-MM-dd}` are read as they were. Only expressions that used to throw can now return a value: every one of the 804 distinct simple expressions in camel, camel-kamelets, camel-examples and camel-jbang-examples parses to what it parsed to before.
+If you define the repository as a bean in XML, a simple one-to-one replacement is sufficient since the adapters default to an in-memory backing store:
-The simple language reads a `Map` with a dot as well as with a key: `${body.sku}` answers the `sku` entry of a map body when the map has no `sku()` method, the same value `${body[sku]}` gives. A method of the map still wins, so `${body.size}` calls `size()` as before, and a name that is neither a method nor a key still fails. Only expressions that used to throw can now return a value.
+For idempotent consumers:
-The `range(max)` function now starts at 0, as documented and as `range` does in Python: `${range(5)}` returns `[0, 1, 2, 3, 4]` where it used to return `[1, 2, 3, 4]`. Routes that relied on the range starting at 1 must use `${range(1,5)}` instead. The two-argument form `range(min,max)` is unchanged.
+```xml
+<!-- Before -->
+<bean name="myRepo" type="org.apache.camel.support.processor.idempotent.MemoryIdempotentRepository"/>
-A review of the simple language fixed a number of edge cases. These change what an existing expression returns:
+<!-- After -->
+<bean name="myRepo" type="org.apache.camel.support.KeyValueIdempotentRepository"/>
+```
-- `split` uses the separator as plain text, not as a regular expression: `${split(${body},'.')}` splits on dots (it used to return an empty array), and `${split(${body},'|')}` splits on the bar. A route that relied on a regular expression separator such as `'\s+'` must use `${body.split('\s+')}` instead.
-
-- The elvis operator `?:` treats any numeric zero as falsy (such as `0L`, `0.0` or `BigDecimal.ZERO`), not only `0` as an `Integer`.
-
-- `++` and `--` keep decimals: `1.5` becomes `2.5` (it used to be `2.0`).
-
-- `safeQuote` escapes double quotes, backslashes and control characters in the value, so the result is a valid JSON string. A `BigDecimal` is a number, so it is not quoted.
-
-- `kindOfType` returns `object` for a `Map` (it used to return `array`).
-
-- A name glued to a function prefix is an unknown function instead of being read as that function, such as `${headerfoo}` (which returned the header `foo`), `${uuidv7}` or `${exceptionInfo}`. Use `${header.foo}`.
-
-- A hidden file name has no extension: for `.bashrc` then `${file:name.ext}` is `null` (it used to be `bashrc`), and for `.route.yaml` then `${file:name.noext}` is `.route`. This comes from `FileUtil.onlyExt` and `FileUtil.stripExt`.
-
-- The chain operator `~>` needs a space on both sides, as the other operators do, so `A~>B` is text.
-
-- Comparing two numbers of different types, such as a `Double` or `BigDecimal` header and an integer literal, no longer drops the decimals: `${header.amount} > 100` is `true` for a `BigDecimal` of `100.50` (it used to be `false`), `${header.price} == 2` is `false` for a `Double` of `2.5`, and `${header.price} range '1..2'` is `false` for `2.5`. The same applies to two `BigDecimal` or two `BigInteger` values, to a number compared with a numeric `String`, and to the Java DSL predicates s [...]
-
-- Inside `${ }` the ternary `?` and `:` need whitespace around them, so `${bean:svc?method=at(10:30)}` is not a ternary.
-
+For aggregation repositories:
-The simple catalog (`simple.json`) now spells these functions as they are written: `hostname` (was `hostName`), `exception.stacktrace` (was `exception.stackTrace`), `throwException(msg,type)` (was `throwException(type,msg)`, the order the function has always used), `not(exp)`, and `setAttachment(key,exp)`.
+```xml
+<!-- Before -->
+<bean name="myRepo" type="org.apache.camel.processor.aggregate.MemoryAggregationRepository"/>
-### camel-core - internal processor advices
+<!-- After -->
+<bean name="myRepo" type="org.apache.camel.support.KeyValueAggregationRepository"/>
+```
-When a `CamelInternalProcessorAdvice` fails in its `before` method, then the `after` method is now executed for the advices whose `before` was already executed. Previously they were skipped, which could leave the exchange counted as inflight and its unit of work not done. The same now happens when the debugger skips over a processor.
+To use a custom `KeyValueRepository` (e.g. a shared store), define the backing store separately:
-An exception thrown from the `after` method of an advice no longer replaces the exception the exchange has already failed with. Instead, it is added as a suppressed exception to the existing exception.
+```xml
+<bean name="kvStore" type="org.apache.camel.support.MemoryKeyValueRepository"/>
+<bean name="myRepo" type="org.apache.camel.support.KeyValueIdempotentRepository">
+ <constructors>
+ <constructor value="#kvStore"/>
+ </constructors>
+</bean>
+```
-### camel-core - message headers keep the case of their names
+The `idempotentRepository` and `aggregationRepository` attributes in the route DSL remain unchanged — they still reference the bean by its name.
-A header whose name is the name of a Camel constant in another case, such as `content-type` for `Exchange.CONTENT_TYPE` (`Content-Type`) or `camelfilename`, keeps the name it was set with, as it did in Camel 4.20 and older. From Camel 4.21 to 4.22 the header map stored such a header under the name of the constant, so a header set or received as `content-type` was sent on as `Content-Type`. Looking up a header is case-insensitive as before, and the first name a header is set with is the o [...]
+The deprecated classes continue to work but will be removed in a future release.
-### camel-core - stream caching deletes a spooled file after the other on completions
+#### camel-minio
-When stream caching spools a message body to disk, the temporary file is deleted by an on completion (`Synchronization`) of the exchange. This on completion now has the order `Ordered.LOWEST`, instead of the default order `0`, so it runs after the other on completions of the exchange. The file is therefore deleted later than before, never earlier. On completions with the same order (such as the disconnect of the FTP and SMB consumers, and the close of a JPA `EntityManager`) still run in [...]
+The Minio GitHub repository has been archived on the 25th April 2026. The container images were removed from Docker Hub on September 2026.
-The `onCompletion` EIP in the default mode (`modeAfterConsumer`) now uses the order `Ordered.LOWEST - 1`, so it runs just before the file is deleted, and its copy of the exchange holds its own reference to a spooled body. An onCompletion can therefore read a spooled body, also with `parallelProcessing`. Previously it failed with a `NoSuchFileException`, and a parallel onCompletion stopped at the first step that read the body. As a side effect, an on completion with the order `Ordered.LOW [...]
+MinIO is S3-compatible, so existing deployments can migrate to the `camel-aws2-s3` component by pointing it at the MinIO server, for example: `aws2-s3://mybucket?overrideEndpoint=true&uriEndpointOverride=http://localhost:9000&forcePathStyle=true&accessKey=…&secretKey=…`
-### camel-core - routeConfiguration named onCompletion fires once per exchange in the Java DSL
+#### camel-yaml-dsl - Pipe (kind: Pipe) support is deprecated
-In the Java DSL, `routeConfiguration("myconfig").onCompletion()` previously set `routeScoped=false` unconditionally, which caused the `onCompletion` to be skipped when the opted-in route was called indirectly (for example via `direct:` from a REST DSL consumer route).
+Loading Camel K `kind: Pipe` resources (formerly `KameletBinding`), typically from a `.pipe.yaml` file, is deprecated in the YAML DSL and will be removed in a future release. Loading such a file now logs a deprecation warning.
-The behavior is now corrected: a named route configuration (`routeConfiguration("id")`) keeps `routeScoped=true` so that the `onCompletion` fires correctly regardless of which route is the actual consumer. A per-exchange deduplication key ensures the `onCompletion` fires exactly once per exchange, even when multiple routes opt in to the same named configuration, or when the opted-in route is called several times in the same exchange.
+Write a plain Camel route instead, which is more expressive (any EIP, multiple routes per file, error handling and route configuration) and is what the tooling, catalog and validator work on. For example, a Pipe with a source, a step and a sink:
-If your application relied on the (broken) behavior where `onCompletion` was silently skipped for named configurations in indirect call chains, you may now observe it firing where it did not before.
+```yaml
+apiVersion: camel.apache.org/v1
+kind: Pipe
+metadata:
+ name: my-pipe
+spec:
+ source:
+ uri: timer:tick
+ steps:
+ - uri: "https://my-service/api"
+ sink:
+ uri: log:result
+```
+
+becomes:
+
+```yaml
+- route:
+ id: my-pipe
+ from:
+ uri: timer:tick
+ steps:
+ - to:
+ uri: "https://my-service/api"
+ - to:
+ uri: log:result
+```
+
+#### camel-catalog - did-you-mean suggestions by default, camel-catalog-suggest deprecated
+
+`CamelCatalog` now suggests the closest option names (and enum values) by default when validation finds an unknown one, using the new edit-distance based `org.apache.camel.catalog.impl.EditDistanceSuggestionStrategy` from `camel-core-catalog`. Before, suggestions were only produced when a `SuggestionStrategy` had been set explicitly, which meant the CLI and the TUI validators never gave any. Code that never wants suggestions can call `setSuggestionStrategy(null)`.
+
+The `camel-catalog-suggest` module with its phonetic (Soundex, commons-codec based) `CatalogSuggestionStrategy` is deprecated: the class now delegates to the edit-distance strategy and the module no longer depends on commons-codec. Remove the dependency and the `setSuggestionStrategy` call; the default gives the same or better suggestions. Edit distance also changes what is suggested: a partly typed name lists the names starting with it, and a name with a typo lists the names a few edits [...]
+
+#### camel-tensorflow-serving - the Target and Credentials headers are deprecated
+
+`TensorFlowServingConstants.TARGET` (`CamelTensorFlowServingTarget`) and `TensorFlowServingConstants.CREDENTIALS` (`CamelTensorFlowServingCredentials`) are deprecated. Both were declared with `@Metadata` and advertised through the endpoint’s `headersClass`, but neither has ever been read by the component.
+
+The gRPC channel and its stubs are built once in `TensorFlowServingEndpoint.doInit()` from `configuration.getTarget()` and `configuration.getCredentials()`, so a per-exchange override supplied as a header cannot take effect. A route that set either header was silently ignored. The sibling `camel-kserve` component declares neither.
+
+Configure the `target` and `credentials` endpoint options instead, or route to a different endpoint with `toD` when the destination varies per message. The constants remain in place for backwards compatibility and are now marked deprecated in the component metadata.
+
+#### camel-elasticsearch, camel-opensearch - the maxRetryTimeout option is deprecated
+
+The `maxRetryTimeout` endpoint and component option is deprecated in both `camel-elasticsearch` and `camel-opensearch`. It was a leftover from the old low-level Elasticsearch REST client (`setMaxRetryTimeoutMillis`), which no longer exists in the client these components use today, so setting it had no effect. The option is kept for backward compatibility of existing endpoint URIs but is marked deprecated and will be removed in a future release. Routes that set `maxRetryTimeout` can simpl [...]
-### @PropertyInject - an invalid property value is an error (Breaking change)
+### Breaking Changes
+
+#### @PropertyInject - an invalid property value is an error (Breaking change)
When a property injected with `@PropertyInject` has a value that cannot be converted to the type of the field or parameter, the injection now fails. Prior to Camel 4.23 the `defaultValue` was silently used instead, so a mistake in the configured value (such as `port=80a` for an `int`) went unnoticed. The `defaultValue` is still used when the property does not exist.
This can break an application that has such an invalid value configured and worked because the `defaultValue` was good enough, as it now fails when starting. To keep the previous result, correct the configured value, or remove the property so the `defaultValue` is used.
-### @PropertyInject - the separator is a plain string (Breaking change)
+#### @PropertyInject - the separator is a plain string (Breaking change)
The `separator` of `@PropertyInject`, which splits the value into an array, a collection or a map, was used as a regular expression: a separator such as `|` split the value into single characters, and `.` gave no values at all. It is now a plain string, as documented ("for example to use comma to separate the values"). An application that escaped a separator to work around this (for example `separator = "\\|"`) must now use the separator itself (`separator = "|"`). A separator that relie [...]
-### Aggregate EIP - optimistic locking retry delay
+#### camel-cloudevents - data of the application-cloudevents+json data type (Breaking change)
-When optimistic locking is enabled without configuring an `optimisticLockRetryPolicy`, the retry delay between attempts is now capped at 1 second, which is the documented default of `maximumRetryDelay`. Prior to Camel 4.23 the delay was not capped in that case and doubled on every attempt, so after a few failed attempts an exchange could wait minutes or hours before trying again. To keep an uncapped delay, configure an `optimisticLockRetryPolicy` with `maximumRetryDelay` set to `0`.
+The `application-cloudevents+json` data type now writes the body according to the `datacontenttype` of the event (CloudEvents JSON format, section 3.1): with a declared JSON content type (a `Content-Type` or `CamelCloudEventDataContentType` header with a `json` subtype or `+json` suffix) a JSON scalar body is now nested too (`"data":42` instead of `"data":"42"`), while without a declared content type only a JSON object or array is nested, as before; with any other content type a JSON obj [...]
-### Circuit Breaker EIP
+#### camel-mybatis - a String or byte\[\] body is one parameter (Breaking change)
-The exchange property `CamelCircuitBreakerResponseRejected` is now also set inside the `onFallback`, in both `camel-resilience4j` and `camel-microprofile-fault-tolerance`: `true` when the call was not attempted because the breaker was open or the bulkhead was full, `false` when the call was made and failed or timed out. Prior to Camel 4.23 the property was only set when there was no fallback and was absent inside the fallback, so a fallback that tested it for `null` must now test for `tr [...]
+With `statementType=Insert`, `Update` or `Delete`, a `String` body (or input header) is now passed to the statement as one parameter, also when it contains commas or is blank, and so is a `byte[]`. MyBatis wraps an array parameter into a parameter map, so the statement refers to the `byte[]` as `#{array}`. Prior to Camel 4.23 the String was split at each comma and the statement ran once for each part (once for each byte of a `byte[]`, and not at all for a blank String). Collections, iter [...]
-### camel-resilience4j - bulkhead together with timeout
+#### camel-mybatis, camel-sql - onConsume does not run for a failed or rollback only exchange (Breaking change)
-When the Circuit Breaker EIP with resilience4j has both `bulkheadEnabled` and `timeoutEnabled`, the bulkhead permit is now held until the protected call has ended, also when the call has timed out and the fallback has already been used. Prior to Camel 4.23 the permit was released when the timeout fired, while the call kept running on the timeout thread pool, so `bulkheadMaxConcurrentCalls` did not limit the calls running against a slow service. This applies to both the synchronous and th [...]
+The camel-mybatis consumer no longer runs the `onConsume` statements for a row whose exchange failed or was marked rollback only: the row is consumed again by the next poll, so a row that always fails is now processed at every poll. Handle the exception in the route (for example with `onException(…).handled(true)`) to consume the row anyway. The camel-sql consumer now runs `onConsumeFailed` instead of `onConsume` for a rollback only exchange (no statement when `onConsumeFailed` is not s [...]
-As a result, while calls that timed out are still running, further calls are rejected by the bulkhead (and answered by the fallback, with `CamelCircuitBreakerResponseRejected` set to `true`), where before they were started. A call that never ends keeps its permit.
+#### camel-djl (Breaking change)
-In the synchronous mode the resilience4j `TimeLimiter` now also sees a call that the bulkhead rejects (as an error with a `BulkheadFullException`), so the events and metrics of resilience4j itself count such a call as a `TimeLimiter` error. The Camel circuit breaker counters are not affected.
+DJL library dependency has been upgraded to 0.37+ Object detection with this version is now reporting coordinates of spotted elements with absolute values instead of a value fraction between 0 and 1. If you do not manipulate the result directly you will be fine as the internal DJL Image converter has been updated. you are impacted if you use the provided result in your own code.
-### Convert Body, Convert Header and Convert Variable EIPs
+#### camel-barcode - the hint maps are read-only (Breaking change)
-When a charset is configured, such as `convertBodyTo(String.class, "UTF-8")`, then the conversion now uses that charset also when the message has a `CamelCharsetName` header. Previously the header took precedence, so the configured charset was ignored. The header is kept on the message unchanged.
+The maps returned by `BarcodeDataFormat.getWriterHintMap()` and `getReaderHintMap()` are now read-only views, so changing them throws an `UnsupportedOperationException`. Such changes were lost when the data format started (again), since the hints are computed at start. Use `addToHintMap` and `removeFromHintMap` instead.
-The `CamelCharsetName` exchange property is now also restored when the conversion fails. Previously the configured charset was left on the exchange, where the error handler would use it.
+#### camel-debezium-oracle (breaking change)
-### Error handler - onException when the exception changes during redelivery
+The parameters `logMiningBufferEhcacheRollbacksConfig`, `logMiningBufferInfinispanCacheRollbacks` have been removed due to the upgrade of Debezium to 3.6.3.Final.
-When a redelivery attempt fails with a different exception than the previous attempt, the error handler now uses the `onException` that matches the new exception. If no `onException` matches it, the error handler’s own settings apply, for example moving the message to the dead letter channel.
+#### camel-iggy - breaking change
-Prior to Camel 4.23 the error handler kept using the `onException` matched by the earlier exception, including its `handled`, `continued`, redelivery and `onRedelivery` settings. So a new exception with no `onException` of its own could be routed and handled by the earlier exception’s `onException`, and was not seen by the caller or the dead letter channel.
+Client dependency has been upgraded to 0.9.0. The URI parameter `replicationFactor` has been removed. It was removed from Iggy API. It wasn’t used anyway in Iggy code. New parameter `iggyHeaderOptions` has been added. Each key is specific to the implementation chosen and there is no API or documentation for them. So providing the possibility to use it but you have to look to the internals of Iggy.
-The redelivery counter is not reset when the exception changes, so the new `onException` measures its `maximumRedeliveries` against the attempts already made. A route whose `onException(IOException.class)` allows 5 redeliveries and which fails 4 times before the exception changes leaves the new policy a counter of 4, so an `onException(IllegalArgumentException.class).maximumRedeliveries(2)` is already exhausted and the message goes to the dead letter channel on the next failure.
+#### camel-ibm-cos
-### Aggregate EIP - completion timeout with optimistic locking
+The `CACHE_CONTROL` header constant’s value has been corrected from the misspelled `CamelIBMCOSContentControl` to `CamelIBMCOSCacheControl`, so the header name matches the Cache-Control metadata it carries. This is a breaking change for routes that reference the header by its literal string name: they must switch to `CamelIBMCOSCacheControl`, although the change is trivial to adapt. Routes using the `IBMCOSConstants.CACHE_CONTROL` constant are unaffected.
-When the aggregator uses optimistic locking together with `completionTimeoutExpression`, a group now records its completion timeout in the `CamelAggregatedTimeout` exchange property of the aggregated exchange stored in the aggregation repository, and a group only completes by timeout when it has this property. This prevents the timeout of an already completed group from completing a new group for the same correlation key.
+#### camel-debezium-oracle - the databaseOutServerName option is removed
-A group that was persisted in the aggregation repository before the upgrade does not have this property, so it does not complete by timeout until another exchange that has a completion timeout arrives for the group. A custom `AggregationRepository` that does not keep exchange properties never completes a group by timeout. This only affects optimistic locking combined with `completionTimeoutExpression`.
+`databaseOutServerName` is gone from the `debezium-oracle` endpoint and component options. It mapped to Debezium’s `database.out.server.name`, which Debezium deprecated in favour of `xstream.out.server.name`.
-### Aggregate EIP - stream caching with spooling to disk
+Camel already drops the options that Debezium deprecates, but the filter only recognised the ones the connector declares as a `Field`, so this one - declared as a plain `String` constant - slipped through and was published as a second, undocumented spelling of the same setting. Routes that set `databaseOutServerName` should use `xstreamOutServerName` instead; it configures the same XStream outbound server and is unchanged.
-When stream caching spools message bodies to disk, the aggregator now keeps the spool files of the bodies it aggregates until the aggregated exchange is done. Prior to Camel 4.23 a spool file was deleted as soon as the incoming exchange was done, so the aggregated exchange could fail to read the bodies with a `NoSuchFileException`.
+#### camel-mustache, camel-chunk - potential breaking change
-With the default `MemoryAggregationRepository` (without optimistic locking) the spool files of all exchanges of a group are now kept until the group completes and the aggregated exchange is done, so more disk space can be used in the spool directory than before. For example `UseLatestAggregationStrategy` with a large `completionSize` now keeps a spool file for every exchange of the group, although only the last body is used. A group that never completes keeps its spool files until the ag [...]
+The Exchange header constants in `MustacheConstants` and `ChunkConstants` have been renamed to follow the Camel naming convention used across the rest of the component catalog (so that they are handled consistently by `DefaultHeaderFilterStrategy`, like the other template components). The Java field names are unchanged; only the header string values have changed.
-With optimistic locking, or a persistent aggregation repository, the spool file of an exchange is released when the exchange has been added to the repository (a persistent repository has read the body at that time), and only the spool file of the exchange that completes a group is kept until the aggregated exchange is done.
+`MustacheConstants`:
-### camel-sql - JdbcAggregationRepository with optimistic locking
+
+| Constant | Previous value | New value |
+| --- | --- | --- |
+| `MustacheConstants.MUSTACHE_RESOURCE_URI` | `MustacheResourceUri` | `CamelMustacheResourceUri` |
+| `MustacheConstants.MUSTACHE_TEMPLATE` | `MustacheTemplate` | `CamelMustacheTemplate` |
-With optimistic locking, `JdbcAggregationRepository` (and `ClusteredJdbcAggregationRepository`, `PostgresAggregationRepository` and `ClusteredPostgresAggregationRepository`) now fails with an `OptimisticLockingException`, so that the aggregator retries, when a message was aggregated on a group that another thread or Camel instance completed meanwhile. Prior to Camel 4.23 the completed group was stored again together with the new message, so its messages were sent a second time, or a new [...]
+`ChunkConstants`:
-A new group now starts with a random positive version instead of `1`, so that a version read from an earlier group of the same correlation key never matches it. The `version` column must therefore be a 64-bit integer, as in the documented `version BIGINT NOT NULL`. Groups stored before the upgrade keep their version.
+
+| Constant | Previous value | New value |
+| --- | --- | --- |
+| `ChunkConstants.CHUNK_RESOURCE_URI` | `ChunkResourceUri` | `CamelChunkResourceUri` |
+| `ChunkConstants.CHUNK_TEMPLATE` | `ChunkTemplate` | `CamelChunkTemplate` |
-### Variable Receive
+Both components read these headers only when `allowTemplateFromHeader=true`. Because the old names sat outside the `Camel` namespace, `DefaultHeaderFilterStrategy` did not strip them, so such a header arriving from an untrusted sender reached the producer; with the `Camel` prefix the headers are now filtered at the component boundary, so the template or resource can only come from the route. For that reason the old names should not simply be restored.
-When an EIP with `variableReceive` stores a message into a variable that already holds a message, the header variables of the previous message (`header:myVar.*`) are now removed first. Previously a header that the new message did not have kept its old value, so the body and the header variables of the variable could come from different messages. This applies to exchange, global, route and group variables.
+Routes that reference the constants (for example `setHeader(MustacheConstants.MUSTACHE_TEMPLATE, …)`) are unaffected. Routes that set the header by its literal string name, or that use `allowTemplateFromHeader=true` with the old header names, must switch to the new `Camel`\-prefixed names.
-### Weighted Load Balancer EIP
+#### camel-pqc - Bouncy Castle 1.86 (Breaking change)
-The distribution ratios of the weighted load balancer are now validated when the route starts. A negative ratio, ratios that are all `0`, or ratios whose sum is greater than `2147483647` now fail the route at startup with an `IllegalArgumentException`. Previously such a route started, but sending to it could hang the caller, spin a CPU, or send every message to the same endpoint.
+Camel now uses Bouncy Castle 1.86, which removes the legacy implementations of several post-quantum algorithms from the `BCPQC` provider.
-### Resequencer EIP - stream resequencing and route stop
+**Picnic removed.** Bouncy Castle 1.86 no longer ships Picnic, so the `PICNIC` value of the `signatureAlgorithm` option, the `PQCSignatureAlgorithms.PICNIC` constant and `PQCDefaultPicnicMaterial` have been removed. Routes signing with Picnic must move to another signature algorithm, such as `MLDSA` or `SLHDSA`.
-When a route with the stream resequencer stops, a caller that is blocked because the resequencer is full (`capacity`) now fails with a `java.util.concurrent.RejectedExecutionException`. Prior to Camel 4.23 such a caller stayed blocked, also after the route was stopped.
+**Classic McEliece and FrodoKEM use the `BC` provider.** `CMCE` and `FRODO` are now served by the Classic McEliece and FrodoKEM implementations of the `BC` provider (JCA names `CMCE` and `FrodoKEM`) instead of `BCPQC`. That implementation has no `mceliece348864` or `frodokem640` parameter sets: the `parameterSpec` option rejects them, and the default parameter sets of the key lifecycle managers changed from `mceliece348864` to `mceliece460896` and from `frodokem640aes` to `frodokem976aes`.
-### Saga EIP - compensation and completion failures
+**Stored keys must be generated again.** The `BC` provider rejects the algorithm identifier of Classic McEliece and FrodoKEM keys generated by the removed `BCPQC` implementations, and Picnic keys can no longer be read at all. Keys of these algorithms held by a key lifecycle manager, a key store or the registry have to be regenerated, and the peers they are shared with updated.
-When a saga in `AUTO` completion mode fails and its compensation then fails as well, the exchange now keeps the exception that caused the compensation, and the compensation failure (a `RuntimeCamelException` with the message `Unable to compensate all required steps of the saga <id>`) is added to it as a suppressed exception. Prior to Camel 4.23 that `RuntimeCamelException`, wrapped in a `java.util.concurrent.CompletionException`, replaced the original exception. An `onException` or `doCa [...]
+**`parameterSpec` for `DILITHIUM`, `SPHINCSPLUS` and `KYBER`.** These algorithms generate ML-DSA, SLH-DSA and ML-KEM keys, so `parameterSpec` now takes the standardized parameter-set names, for example `ML-DSA-65`, `SLH-DSA-SHA2-128S` or `ML-KEM-768`. The `dilithium2`, `dilithium3` and `dilithium5` names are no longer accepted, while `kyber512`, `kyber768`, `kyber1024` and SPHINCS+ names such as `sha2-128s` still are. With Bouncy Castle 1.85 a `DILITHIUM` or `SPHINCSPLUS` endpoint config [...]
-When the completion of a saga fails, the exchange now gets the `RuntimeCamelException` with the message `Unable to complete all required steps of the saga <id>` as is. Prior to Camel 4.23 it was wrapped in a `java.util.concurrent.CompletionException`.
+Code that creates key material itself has to follow the same move: the `CMCEParameterSpec`, `FrodoParameterSpec`, `KyberParameterSpec`, `DilithiumParameterSpec`, `SPHINCSPlusParameterSpec` and `PicnicParameterSpec` classes of `org.bouncycastle.pqc.jcajce.spec` no longer exist. Use `CMCEParameterSpec`, `FrodoKEMParameterSpec`, `MLKEMParameterSpec`, `MLDSAParameterSpec` and `SLHDSAParameterSpec` of `org.bouncycastle.jcajce.spec` with the `BC` provider instead.
-With the in-memory saga service, a saga whose compensation or completion could not be done after all the retries now has the status `FAILED`, instead of `COMPENSATED` or `COMPLETED`: compensating or completing it again fails, instead of reporting success. When the in-memory saga service stops, it logs a warning with the ids of the sagas that are not finalized, since they will not be compensated or completed.
+#### camel-milo - potential breaking change
-### Tokenize language
+Since 4.16, the `samplingInterval` default of 0.0 was ignored and milo’s own `OpcUaMonitoredItem` default of 1000 ms was used. Now the parameter is used again, but the default is changed to 1000.0 to take the previous behaviour (starting with 4.16) into account. The same applies to a configured `requestedPublishingInterval` or data-change filter, which now take effect. The parameter `requestedPublishingInterval` is now part of the cache key, resulting in multiple clients for different va [...]
-- A message without a body (or a `source` that has no value) now has no tokens, the same as an empty body. Prior to Camel 4.23 the tokenizer failed with a `NullPointerException`.
+The parameter `dataChangeFilterDeadbandType` changes type from `UInteger` to `Integer`. This changes the public `MonitorFilterConfiguration` getter/setter and the endpoint-DSL builder method, so Java code passing a `UInteger` will no longer compile.
+
+### camel-a2a - webhook URL address classification
+
+Push notification webhook URLs are now classified by the address the host resolves to, using the same rules whether the host is written as an IP literal or as a name. Previously a few ranges were recognised only in literal form, and host names were partly classified by how they were spelled.
+
+Webhook URLs are now rejected when the host resolves into any of the following, in addition to the loopback, wildcard, link-local and site-local ranges that were already rejected:
+
+- IPv6 unique local addresses, `fc00::/7`
-- `skipFirst` now also skips the first token in `xml` mode and in pair mode (`endToken`). Prior to Camel 4.23 the option was ignored in those modes.
+- IPv4-compatible IPv6 addresses, `::a.b.c.d`, when the embedded IPv4 address is itself non-global
-- In pair mode with `group` and `includeTokens`, the grouped pairs are now joined without a delimiter (as in `xml` mode), unless `groupDelimiter` is set. Prior to Camel 4.23 the start token was inserted between them, so a group of `<a>1</a>` and `<a>2</a>` became `<a>1</a><a><a>2</a>`. Without `includeTokens` the start token is still used as the delimiter between the grouped values.
+- NAT64 addresses under the well-known prefix `64:ff9b::/96`, when the embedded IPv4 address is itself non-global
-- A pair with the same start and end token is now refused when the route is created. Prior to Camel 4.23 it silently had no tokens.
+- 6to4 addresses under `2002::/16`, when the embedded IPv4 address is itself non-global
+
+- The shared address space used for carrier-grade NAT, `100.64.0.0/10`
-### Context reload now re-applies placeholder based component options
+NAT64 and 6to4 addresses carrying a globally routable IPv4 address remain allowed, so an IPv6-only deployment can still reach public webhook endpoints through a translation prefix.
-When a context reload is triggered, for example by one of the vault components detecting that a secret was rotated, Camel now also re-applies the `camel.component.`, `camel.dataformat.` and `camel.language.` options whose configured value is a property placeholder, and notifies any bean implementing the new `org.apache.camel.spi.SecretRotationAware` SPI. Previously only the property placeholders and the routes were reloaded, so a rotated secret never reached a component option that had b [...]
+In the other direction, host names are no longer rejected on the basis of their spelling. Names beginning with `fc` or `fd`, such as `fcm.googleapis.com`, were previously refused because those are the leading hex digits of the IPv6 unique local prefixes; they are now resolved and classified like any other name.
-Re-applying such an option removes the component and resolves it again, as it already does when the option changes in a watched properties file. The component is stopped either way, and what comes back depends on how it was registered: a component auto-detected from the classpath is replaced by a new instance, while a component registered as a bean is the same instance, re-configured and started again. A component that holds a connection will therefore close it on reload.
+Set `allowLocalWebhookUrls=true` to permit loopback targets during local development. That option is unchanged and still does not permit any of the ranges above.
-Only options whose value is a placeholder are affected, and only when running with Camel Main, Camel Spring Boot or Camel Quarkus. If a component must not be stopped on reload, configure it programmatically rather than with a placeholder based property.
+### camel-ai-observability (GenAI observability)
+
+LangChain4j, OpenAI, and Spring AI chat (`spring-ai-chat`) producers now emit GenAI observability data (OpenTelemetry span attributes and Micrometer metrics) when `camel-opentelemetry2` and/or `camel-micrometer` is on the classpath. Disable globally with `camel.aiObservability.enabled=false` (default is enabled). Camel Main also exposes the same setting via `main.configure().aiObservability().withEnabled(false)`.
+
+When a non-NOOP `ObservationRegistry` is bound in the Camel registry, GenAI client calls are recorded as Micrometer Observations (`gen_ai.client.operation`). Camel then skips the `camel-telemetry` CLIENT span and the direct `gen_ai.client.operation` timer. Traces and the operation timer appear only if the registry has tracing and meter handlers respectively. Token usage counters still use `MeterRegistry`. Applications without an `ObservationRegistry` bean keep the previous OpenTelemetry [...]
+
+`GenAiUsage` token fields (`inputTokens`, `outputTokens`) are `Long` so OpenAI and other providers that report `long` token counts are recorded without lossy casts.
+
+OpenAI streaming chat sets `stream_options.include_usage=true` only when GenAI observability is enabled, adding a final chunk with token usage for span/metric recording.
+
+OpenAI `embeddings`, `moderation`, and `responses` producers emit GenAI spans with the same attribute keys as `chat-completion`. Moderation records model metadata only (no token usage). Embeddings records input tokens when the API returns usage.
+
+LangChain4j components also expose request model names on new exchange headers (`CamelLangChain4j*RequestModel`). The response model header (`CamelLangChain4j*ResponseModel`) is set when the underlying client exposes it (for example langchain4j-chat); the agent and embeddings producers omit it when unavailable. See [AI Observability](../components/next/others/ai-observability.md) for metric names and span attributes.
+
+### camel-ai-tool
+
+#### route tools receive the caller’s context but a clean message
+
+Route tools invoked by an agent (`camel-langchain4j-agent`, `camel-openai`, `camel-spring-ai-chat`) now run on an exchange that carries the calling exchange’s **properties** and **variables** — so a tool route can be guarded on the caller’s identity, for example `exchangeProperty.subject` — but with a **clean message**: the tool route receives only its own arguments (as headers), not the caller’s body or inbound headers.
+
+`camel-langchain4j-agent` previously copied the whole calling exchange, so its tool routes also saw the caller’s body and inbound headers, and a tool that set no body returned the caller’s body to the model. A tool route that read the caller’s body or a caller header must now obtain that data another way (for example an exchange variable or property). The tool exchange also now runs in its own unit of work and with its own exchange id instead of the caller’s, so a tool route’s `onComplet [...]
+
+`camel-openai` and `camel-spring-ai-chat` previously created a fresh exchange and did not propagate the caller’s context at all; they now do, which is what makes a tool route guarded on `exchangeProperty.subject` work under those runtimes.
+
+#### new AiToolResult.AuthorizationDenied result variant (SPI)
+
+`org.apache.camel.component.ai.tool.AiToolResult` is a sealed interface and gained a new variant, `AiToolResult.AuthorizationDenied`, returned when an `ai-tool` route’s `authorizationPolicy` denies a call. Code that consumes `AiToolResult` and handles its variants exhaustively — for example an AI adapter whose final branch casts to `AiToolResult.ExecutionError` — must add a branch for `AuthorizationDenied` and relay its `message()` to the model as a refusal (do not rethrow). The in-tree [...]
+
+### camel-alibaba-eventbridge
+
+#### CloudEvents 1.0 specification validation enabled by default
+
+The `camel-alibaba-eventbridge` producer now enables `validateEventSpec` by default (`validateEventSpec=true`) for Map payloads. This validates CloudEvents 1.0 specification constraints, requiring `specversion="1.0"`, valid RFC 3339 / ISO-8601 timestamps for `time`, and non-blank event identifiers (`id`).
+
+Existing routes that produce Map bodies with non-standard specification versions or empty `id` fields should either update their payload maps to conform to CloudEvents 1.0 or explicitly disable specification validation:
+
+```text
+alibaba-eventbridge:putEvents?validateEventSpec=false&...
+```
+
+#### 3-level hierarchical event validation and fail-closed cloud validation
+
+The component introduces fine-grained multi-bus and source-scoped event validation (`validateEventSource`, `validateEventType`, and `allowedEventSources`) with cached metadata in `EventSourceCache`.
+
+When cloud validation is enabled (`validateEventSource=true` or `validateEventType=true`), validation operates fail-closed: if the Alibaba Cloud EventBridge API is unreachable or returns an error, the producer will fail fast by throwing an exception rather than silently permitting unvalidated messages.
+
+### camel-archetypes
+
+The Camel Maven archetypes now generate a `README.md` instead of the previous `ReadMe.txt`, with the content rewritten in Markdown and the documentation links updated. Each generated project also gets an `AGENTS.md` file with guidance for AI coding assistants, pointing at the Apache Camel LLM index (`/llms.txt`), the Camel CLI and the Camel MCP server.
+
+The `camel-archetype-api-component` archetype also generates its readme again: the file was declared in the wrong file set and was therefore silently skipped.
+
+### camel-as2
+
+The AS2 server no longer attaches the configured `mdnUserName` / `mdnPassword` / `mdnAccessToken` credentials to an asynchronous MDN unless the delivery address names a host the operator has authorised.
-Components implementing `SecretRotationAware`, such as `camel-jdbc`, `camel-sql`, and `camel-sql-stored`, will now soft-evict their connection pool(s) on every context reload — not only on vault-detected secret rotations. This includes JMX-triggered reloads, `camel cmd reload`, and dev-mode file-watcher reloads.
+The delivery address comes from the `Receipt-Delivery-Option` header of the received AS2 message, so it is chosen by the sender. A new option lists the hosts an asynchronous MDN may be delivered to:
-### Languages - less than with two null values, and a source from a variable
+```text
+as2://server/listen?asyncMdnAllowedHosts=partner.example,partner2.example
+```
-- The `<` operator (in the Simple language and the Java DSL `isLessThan`) is now `false` when both sides are `null`, as the `>` operator already was. Prior to Camel 4.23, `${header.a} < ${header.b}` was `true` when neither header existed. The `⇐` and `>=` operators are unchanged and are `true` in that case.
+- When `asyncMdnAllowedHosts` is set, an asynchronous MDN whose delivery address names a host outside the list is refused, and the credentials are attached only for a host on the list.
-- A language that reads its input from a `source` of `variable:name` now fails with `NoSuchVariableException` when the variable does not exist, as it does with `NoSuchHeaderException` for `header:name`. From Camel 4.4 to 4.22 a missing variable was used as a `null` input. This also applies to a `source` without a prefix, as a plain name refers to a variable (`source="myVar"`), and to the `source` option of the `xslt`, `xslt-saxon` and `xquery` endpoints.
+- When it is not set, the MDN is still delivered to the sender-supplied address, as before, but **no credentials are attached** and a warning naming the option is logged.
-### ClusteredRoutePolicy - routes are started and stopped on the policy thread
+Deployments that rely on authenticating to a partner’s asynchronous MDN endpoint must add that partner’s host to `asyncMdnAllowedHosts`.
-When the leadership changes, `ClusteredRoutePolicy` now starts and stops its routes on its own thread, instead of on the thread that fires the leadership event while it holds the lock of the cluster view. This fixes a deadlock between a leadership change that is starting routes and a CamelContext stop or a route removal. The thread only exists while there is a leadership change to apply, and exits when idle, so a policy per route (`ClusteredRoutePolicyFactory`) does not keep a thread per [...]
+Two further checks are applied to the delivery address regardless of the option: the scheme must be `http` or `https`, and an address with no explicit port now uses 80 for `http` (443 for `https`) rather than being passed to the socket as `-1`.
-Most cluster services fire leadership events from their own threads, but some fire them on the calling thread, for example when a view starts or a listener is added. In all cases the routes are now started and stopped on the policy thread, shortly after the event. Code that fires the event itself, for example a custom `CamelClusterView` in a test, can no longer expect the routes to be started or stopped when the event returns, and should wait for the route status instead. Likewise, `isLe [...]
+`https` delivery is supported when the AS2 endpoint has `sslContextParameters` configured: the manager builds an `SSLSocket` from it, defaults the port to 443, and verifies the delivery host against the certificate the peer presents. When no `sslContextParameters` is configured an `https` address is refused (fail-closed) rather than written in cleartext to the TLS port.
### Apache Avro trusted packages
@@ -272,95 +517,16 @@ If you use `camel-avro-rpc`, Camel automatically trusts `org.apache.avro`, which
Do not use `*`, as it disables Avro’s class-loading protection.
-### Rest DSL - consumes and produces from the binding mode of the rest configuration
-
-When a verb has `type` or `outType` and the binding mode is `json`, `xml` or `json_xml`, the verb’s `consumes` and `produces` are set to the matching media types if they are not already set. This now also happens when the binding mode is only set with `restConfiguration()`, as it already did when it is set on the `rest` or the verb. With `clientRequestValidation` enabled, such a verb now rejects a request with another `Content-Type` (415) or `Accept` (406) header.
-
-### Rest DSL - client validation, verb ids and inlined routes
-
-- `clientResponseValidation` now also validates the response when the binding mode is `off`, the response has no body, or binding was skipped because of an error code (`skipBindingOnErrorCode`). Before, the response was only validated after the body was marshalled.
-
-- The headers of a `responseMessage` are only required on the responses with that code (or on the responses of the `default` response message when the code has none). Before, the headers of all the response messages were required on every response.
-
-- A verb with `type` gets a body parameter that is required (unless the body parameter, whatever its name, is declared with `required=false`). With `clientRequestValidation` enabled, a request without a body is now rejected (400), as the body was already marked as required in the OpenAPI specification.
-
-- Two verbs with the same `id` now fail with a duplicate route id error. Before, the second verb silently got a generated route id. A verb with the same `id` as a route that is not a rest verb (such as the `direct` route it calls) still gets a generated route id, as before.
-
-- A `direct` route that more than one rest service calls is no longer inlined (with `inlineRoutes` enabled, which is the default). It stays a route of its own, and the rest services call it. Before, its outputs were inlined into all the rest services, which then shared the same EIP definitions.
-
-
-### CamelEvent JSON serialization
-
-`CamelEvent` now provides `asJSon()` and `toJSon(int indent)` with default implementations that return a minimal JSON map (`type`, optional `timestamp`, and `message`). Camel’s built-in event classes override these methods to include structured metadata such as exchange, route, and exception details.
-
-Custom `CamelEvent` implementations continue to compile without changes. Override the new methods only if you need richer JSON output than the default `type`/`timestamp`/`message` map.
-
-The Event developer console now exposes the full structured JSON payload in the `details` field of each event entry, while keeping the existing flat `type`, `timestamp`, `exchangeId`, and `message` fields for backwards compatibility.
-
-### JSON data formats - marshal a body that is already JSON text
-
-`marshal` with a JSON data format (`marshal: json`, with Jackson, Jackson 3, Gson, JSON-B or Fastjson) now writes a body that is already the JSON text as it is, instead of serializing it as a Java object:
-
-- a file, an `InputStream` (or stream cache) and a `byte[]` are written as they are; before, they were serialized as objects (with Jackson the stream and the file failed with "No serializer found" and the bytes became a Base64 string)
-
-- a `String` whose text is a JSON object or array (it starts with `{` and ends with `}`, or `[` and `]`) is written as it is; before, it was written as one JSON string, `"{\"sku\": …}"`. Any other `String` is still written as a JSON string (`"hello"`).
-
-
-POJOs, maps and lists are marshalled as before. A route that relied on a JSON `String` being encoded as a JSON string literal can wrap the value in an object, or set the body to the quoted text.
-
-### Intercept Send To Endpoint EIP
-
-The interceptors of `interceptSendToEndpoint` are now registered by each route while it is running, on an endpoint that is wrapped once:
-
-- Each route uses its own interceptor. Before, the endpoint was wrapped by the interceptor of one of the routes (which one depended on the order of an unordered set), and all the routes used that one.
-
-- Removing a route no longer breaks the other routes that send to the intercepted endpoint (they failed with `RejectedExecutionException` when the route whose interceptor wrapped the endpoint was removed).
-
-- The interception is kept when the `CamelContext` is restarted.
-
-- The interceptor of a stopped route is no longer used.
-
-- Interceptors from two ``RouteBuilder`s for the same endpoint are both used, each by the routes of its own `RouteBuilder``. Before, only the one that wrapped the endpoint first was used.
-
-- `mockEndpoints` together with an `interceptSendToEndpoint` on the same endpoint now both run, in a fixed order: the interceptors of the route that is sending first, and then the mock. Before, only the one that wrapped the endpoint first was used.
-
-- When an interceptor applies to several routes (such as one defined in a `RouteBuilder` with several routes), the `CamelInterceptedRouteId` and `CamelInterceptedParentEndpointUri` exchange properties are those of the route that sends to the endpoint. Before, they were always those of the first route of the `RouteBuilder`.
-
-
-The `org.apache.camel.processor.InterceptSendToEndpointCallback` class is deprecated, as it is no longer used.
-
-### Route templates
-
-- When both the route template (`configure`) and the `TemplatedRouteBuilder` (`configure`) have a configurer, then both are now called (the template first). Prior to Camel 4.23 only the configurer of the template was called.
-
-- Two routes created from a template with the same `prefixId` and a hardcoded node id are now reported as a duplicate id. Prior to Camel 4.23 they were accepted, and both processors had the same id at runtime.
-
-- A hardcoded node id in a route template no longer clashes with the same id in a regular route, as the ids of the route created from the template are prefixed.
-
-- A bean bound by `TemplatedRouteBuilder.bean` or in a `templatedRoute` is now used instead of a `templateBean` with the same name, which is no longer created. Prior to Camel 4.23 the template bean replaced it when both had the same type, and was used when the route looked the bean up by the type of the template bean (such as `process("myBean")`). When the same `RouteTemplateContext` is reused for several `addRouteFromTemplate` calls, the template beans bound for the first route are no [...]
-
-
-#### A route id that is already used (Breaking change)
-
-Creating a route from a route template (`TemplatedRouteBuilder`, `templatedRoute`, `addRouteFromTemplate`, or a Kamelet endpoint with a route id) with the id of an existing route that was not created from the same template (a regular route, or a route from another template or Kamelet) now fails with `FailedToCreateRouteFromTemplateException`. For a Kamelet endpoint this exception is wrapped in a `FailedToCreateKameletException`. Prior to Camel 4.23 the existing route was removed and repl [...]
-
-An existing route that was created from the same template is still replaced, as before. This is how the route of a Kamelet endpoint with a route id is created again when its parent route is updated (for example by a route reload), and how a route from a template is updated with other parameters.
-
### camel-aws2-ddb
The `aws2-ddb:application-json` data type transformer no longer overwrites a `CamelAwsDdbReturnValues` header that is already set on the message. Previously the transformer always replaced it with its own default (`ALL_OLD` for `PutItem` and `DeleteItem`, `ALL_NEW` for `UpdateItem`), so there was no way to select a different `ReturnValue` through the transformer. The defaults are unchanged when the header is absent.
If a route sets `CamelAwsDdbReturnValues` before the transformer runs and relies on it being discarded, remove the header instead.
-### Error registry
-
-- An error is only recorded as handled when the failure processor has handled it. Prior to Camel 4.23 an error was recorded as handled whenever an `onException`, dead letter channel or `doCatch` ran for it, also with `handled(false)` or when the `doCatch` threw again.
-
-- The error registry records every failure of an exchange: the failures of the parts of a split or multicast, a failure after an error that was handled by a `doCatch`, and a failure in `onCompletion`. Prior to Camel 4.23 it kept only one entry per exchange, so such failures replaced or hid each other.
-
-
### camel-aws2-s3
+#### Message headers not evaluated as Simple expressions
+
The producer no longer evaluates the S3 object key or bucket name taken from a message header as a Simple expression. `AWS2S3Utils.determineKey()` and `determineBucketName()` evaluate the Simple language only for the values configured on the endpoint (`keyName` and `bucketName`); a key supplied through the `CamelAwsS3Key` header, or a bucket name supplied through the `CamelAwsS3OverrideBucketName` header, is now used literally. The `CamelAwsS3Key` header carries message content — for exa [...]
Configured dynamic keys and buckets are unchanged:
@@ -382,7 +548,7 @@ A header that carries a literal `${…}` string is now used as the object key
A configured `keyName` or `bucketName` whose Simple expression resolves to `null` now fails with an `IllegalArgumentException` at the producer, instead of passing a `null` key/bucket on to the AWS SDK.
-### camel-aws2-s3 - objects in progress in the consumer
+#### In-flight objects skipped by consumer
With `fileName` set, the consumer now skips the object while an exchange of an earlier poll is still processing it, as it already did when listing the bucket (with `deleteAfterRead=false` it is consumed again once its exchange is done). The objects of a poll that a stopping consumer does not process are no longer kept in the `inProgressRepository`, so they are consumed when the route is started again.
@@ -390,1343 +556,1325 @@ With `fileName` set, the consumer now skips the object while an exchange of an e
The `batchSeparator` option (default `,`), which splits a `String` body into the messages of the `sendBatchMessage` operation, was used as a regular expression: a separator such as `|` split the body into single characters, and `.` sent no message at all. It is now a plain string. A route that escaped a separator to work around this (for example `batchSeparator=\|`) must now use the separator itself (`batchSeparator=|`). The same applies to escape sequences, which the regular expression [...]
+### camel-azure-eventgrid
+
+The `CamelAzureEventGridDataVersion` header (`EventGridConstants.DATA_VERSION`) has been removed. The component publishes events in the CloudEvents schema, which has no `dataVersion` attribute (that field belongs to the legacy Event Grid event schema), so the header was read but never applied to the published event. Remove any use of that header; there is no CloudEvents equivalent.
+
### camel-azure-eventhubs
The producer now leaves the Camel-internal headers (`Camel*`) out of the `EventData` application properties by default. The upgrade guides for 4.14.9, 4.18.4 and 4.22.0 already announced this, but the filter was not installed, so those releases still copied every header. Configure a custom `headerFilterStrategy` on the component to change which headers are sent.
A route that consumes from one Event Hub and produces to another no longer fails, or ignores the producer configuration, because of the `CamelAzureEventHubsPartitionKey` and `CamelAzureEventHubsPartitionId` headers that the consumer sets. Such a route used to fail with `Both partitionKey and partitionId are set` for every event with a partition key, and for every event when `partitionKey` was configured, and a configured `partitionId` was replaced by the partition the event was received [...]
-### camel-cloudevents - data of the application-cloudevents+json data type (Breaking change)
-
-The `application-cloudevents+json` data type now writes the body according to the `datacontenttype` of the event (CloudEvents JSON format, section 3.1): with a declared JSON content type (a `Content-Type` or `CamelCloudEventDataContentType` header with a `json` subtype or `+json` suffix) a JSON scalar body is now nested too (`"data":42` instead of `"data":"42"`), while without a declared content type only a JSON object or array is nested, as before; with any other content type a JSON obj [...]
-
-### camel-consul - readTimeout and writeTimeout
+### camel-azure-storage-blob and camel-azure-storage-datalake
-The `readTimeout` and `writeTimeout` options (also on the Consul cluster service) set the connect timeout of the Consul client instead of its read and write timeouts. So the client always used the default read and write timeouts of its HTTP client (10 seconds), and the connect timeout was `writeTimeout` when it was set, otherwise `readTimeout`, otherwise `connectTimeout`. Each option now sets its own timeout: a request whose answer takes longer than a configured `readTimeout` now fails, [...]
+#### Local download directory path resolution
-### camel-cm-sms - GSM 03.38 detection
+Local downloads configured with `fileDir` now resolve existing filesystem path segments before checking that the destination remains inside the configured directory. Downloads through a symbolic link that resolves outside `fileDir` are rejected. Valid nested download paths continue to work.
-A message that contains `<`, `>`, `¤` or a form feed, and otherwise only GSM 03.38 characters, is now sent in the GSM encoding (160 characters, or 153 per part) instead of as unicode (70, or 67 per part), so it may be sent in fewer parts.
+#### In-flight blobs skipped by consumer
-### camel-couchbase
+The consumer no longer consumes a blob again while an exchange of an earlier poll is still processing it, which happened with an asynchronous route (for example `to("seda:…")`), so the next polls now skip such a blob, and no longer download it again. With `deleteAfterRead=false` and `moveAfterRead=false` the blob is consumed again by a later poll once its exchange is done, as before. A listed blob that no longer exists when it is downloaded (for example deleted by another consumer after [...]
-The `connectTimeout` option is now applied. It previously sat inside a condition that tested `queryTimeout`, so setting it on its own had no effect and the documented default of 30000 ms never reached the SDK - connections used the Couchbase SDK’s own default of 10 seconds instead. Deployments that relied on that 10 second behaviour without setting the option should now set `connectTimeout=10000` explicitly.
+### camel-barcode - text outside ISO-8859-1
-`queryTimeout` is unchanged: it is still only applied when set to something other than its default, because the documented 2500 ms default is much shorter than the SDK’s 75 seconds and applying it unconditionally would cut short queries that currently succeed.
+The barcode data format wrote the text in ISO-8859-1 (the ZXing default), so every character that ISO-8859-1 cannot represent (such as Japanese, Cyrillic, Greek or an emoji) was written as `?`. Such a text is now written in UTF-8, with an ECI segment that tells the reader the character set. A reader without ECI support sees the UTF-8 bytes instead of the `?` characters, so it must decode them as UTF-8. Text that ISO-8859-1 can represent is written as before, byte for byte, and a `CHARACT [...]
-The consumer now reports a failed exchange through its exception handler, which logs a warning naming the endpoint, as `TimerConsumer` does. Previously the consumer discarded the outcome of routing entirely and went on to the next poll as if the exchange had been delivered.
+### camel-bean - parameter values in the method name
-This is not a change to error handling. An exchange that failed while being routed has already passed through the route’s error handler, which logs the exhausted failure, and `BridgeExceptionHandlerToErrorHandler` deliberately falls back to its logging handler for such an exchange rather than bridging it a second time. What changes is that the consumer itself no longer stays silent.
+A parameter value in the method name that is a Simple expression, such as `bean(MyBean.class, "process(${body})")` or `to("bean:foo?method=check(${header.ETag})")`, is now passed to the method as-is. Previously, when the value was a String that started and ended with the same quote (single or double), the quotes were removed, and a value that was the text `null` was passed as a Java `null`. For example the `ETag` value `"33a64df5"` was passed as `33a64df5`.
-#### useView=true with fullDocument=false
+Quoted String parameters such as `process('World')` still have their quotes removed, and the parameter `null` still passes `null`, as before. An expression that evaluates to `null` also still passes `null`. If a method relied on the old behavior for a value from an expression, then it must remove the quotes, or check for the text `null`, itself.
-With `useView=true` and `fullDocument=false` the message body is now the value the view emitted for the row, or `null` when the view emitted no value. It used to be a `java.util.Optional` holding that value. A route that unwrapped the `Optional` itself must now use the body directly.
+### camel-bindy - fixed-length records with characters outside the BMP
-#### consumerProcessedStrategy=delete
+Since Camel 3.1 a fixed-length record is read by counting code points (or graphemes with `@FixedLengthRecord(countGrapheme = true)`), but it was written by counting UTF-16 chars, so a field with a character outside the Basic Multilingual Plane (such as an emoji) was written one padding character short and the following fields were read shifted. Marshal now pads and clips each field with the same count as unmarshal, and the record `length` is checked with that count too. A field with such [...]
-With `consumerProcessedStrategy=delete` the consumer now removes a document once its exchange has completed successfully. It used to remove every document of a poll while building the exchanges, before any of them was handed to the route, so the document was gone even when its exchange failed, and also when it was never handed to the route at all, because the consumer was stopping or the poll returned more rows than `maxMessagesPerPoll`.
+### camel-caffeine, camel-ehcache - the aggregation repositories keep completed exchanges for recovery
-A document whose exchange fails, and a document that was not handed to the route, are now kept and consumed again by a later poll. A route that fails for the same document every time therefore receives it on every poll; handle the failure in the route (for example with a dead letter channel or a handled `onException`) so that the exchange completes and the document is removed. While the route runs, the document is still in the bucket. A failure to remove the document is reported through [...]
+`CaffeineAggregationRepository` and `EhcacheAggregationRepository` implement `RecoverableAggregationRepository`, but like the Infinispan repository before 4.23 they had no recovery store: `remove` deleted the completed exchange, `confirm` removed the exchange id from a cache keyed by correlation key, and `scan` returned the correlation keys of the aggregations still in progress. The recovery task therefore sent aggregations that were still in progress (marked `CamelRedelivered`, and to t [...]
-If the route hands the exchange over to another thread (for example `seda` with `waitForTaskToComplete=Never`, or an asynchronous producer), the document is removed when that exchange completes, which can be after the next poll. Until its exchange has completed or failed, a document is skipped by later polls of the same consumer, so it is not delivered twice, in the same way as the in-progress repository of the file and aws2-s3 consumers. A skipped document does not count towards `maxMes [...]
+A completed exchange is now kept in the same cache under a `camel-recovery:<exchange id>` key until it is confirmed, which is what `scan` reports and `recover` reads. `getKeys` reports only the aggregations in progress.
-A view or SQL++ query that returns several rows for one document (for example a view that emits one row per element of an array in the document) now delivers only the first of these rows with `consumerProcessedStrategy=delete`: the document is in progress from its first row on, so its other rows are skipped, and once that exchange has completed the document is removed. Previously the first row removed the document while the poll was built, and the next row of the same document failed to [...]
+Routes that set `useRecovery=false` are unaffected. Routes that left recovery enabled, which is the default, no longer see aggregations in progress sent by the recovery task, and a completed exchange whose processing failed is now recovered. The cache now also holds one entry per completed and not yet confirmed exchange; those entries are removed on confirmation. A cache with a size limit or an expiry applies it to these entries as well.
-### camel-smpp - received exchanges now come from the consumer
+### camel-cassandraql - the aggregation repository keeps completed exchanges for recovery
-Exchanges for received `deliver_sm` and `data_sm` messages are now created through `Consumer#createExchange(boolean)` instead of on the endpoint, so that the configured `ExchangeFactory` sees them. Alert notifications already worked this way. Two consequences:
+`CassandraAggregationRepository` (and `NamedCassandraAggregationRepository`) implement `RecoverableAggregationRepository` with recovery enabled by default, but had no recovery store: `remove` deleted the completed exchange, `confirm` deleted the aggregation in progress that had the confirmed exchange id, and `scan` returned the exchange ids of the aggregations still in progress. The recovery task therefore sent aggregations that were still in progress (marked `CamelRedelivered`) and then [...]
-- `Exchange#getFromRouteId()` is now set on received messages, where it was previously `null`, and exchange pooling applies to them.
-
-- In transceiver mode - an `smpp` producer with `messageReceiverRouteId` - the consumer belongs to the receiver route rather than to the SMPP endpoint, so `Exchange#getFromEndpoint()` now reports that route’s endpoint (for example `direct://messageReceiver`) instead of the SMPP endpoint. This matches what alert notifications already did. The exchange pattern is unchanged: the SMPP endpoint’s pattern is still applied explicitly.
-
+A completed exchange is now kept in the same table, under the aggregation key `camel-recovery:<exchange id>`, until it is confirmed, which is what `scan` reports and `recover` reads. `getKeys` reports only the aggregations in progress. No change of the table is needed.
-`SmppEndpoint#createOnAcceptDeliverSmExchange` and `SmppEndpoint#createOnAcceptDataSm` are deprecated. They are no longer used by the component; build such an exchange through the consumer instead.
+Routes that set `useRecovery=false` are unaffected. Routes that left recovery enabled, which is the default, no longer see aggregations in progress sent by the recovery task, and a completed exchange whose processing failed is now recovered. The table now also holds one row per completed and not yet confirmed exchange; those rows are deleted on confirmation. A time to live (`ttl`) applies to these rows as well.
-#### 8-bit messages are split by their length in bytes
+### camel-cli-connector
-With an 8-bit alphabet (`alphabet=4`, or an 8-bit data coding), the producer now decides whether to split a message by the length in bytes of the body as it is sent, instead of the number of characters of the body read as a String. A body of at most 140 characters but more than 140 bytes (for example text with multi-byte characters, or binary data) is now sent as several segments; with `splittingPolicy=TRUNCATE` it is truncated to 140 bytes, and with `splittingPolicy=REJECT` it is reject [...]
+The ~/.camel file handling moved from `LocalCliConnector` to the new `FileCliConnectorTransport`, so the protected `task()`, `actionTask()`, `statusTask()` and `traceTask()` methods were removed from `LocalCliConnector`. Subclasses that only override `sigterm()` are not affected.
-### camel-console
+The thread of the file transport (`LocalCliConnector` in its name) is now a daemon thread, as the threads of the WebSocket transport already were. Before, it kept the JVM alive when the application failed to start, for example a Spring Boot application whose port was in use: Camel had not started, so it never stopped the connector. An application that only kept running because of this thread now exits; keep it running on purpose, for example with `camel.main.run-controller=true` for a Sp [...]
-The `context` developer console no longer counts routes created by Kamelets in its `routesTotal` and `routesStarted` statistics (nor in the `Routes:` line of its text output). A Kamelet is implemented as a route inside the Kamelet, and such routes are not registered with JMX by default, so the `route` developer console never listed them; the counts now agree with that list. This affects consumers of the context status, such as the Camel JBang status document (`~/.camel/<pid>-status.json` [...]
+### camel-cm-sms - GSM 03.38 detection
-The `route-topology` developer console (used by `camel cmd route-topology` and the Camel TUI diagram) no longer includes routes created by Kamelets, as these are an implementation detail of the Kamelet and were already hidden from the route console. Set the `kamelets=true` option (or `--kamelets` on the CLI) to include them.
+A message that contains `<`, `>`, `¤` or a form feed, and otherwise only GSM 03.38 characters, is now sent in the GSM encoding (160 characters, or 153 per part) instead of as unicode (70, or 67 per part), so it may be sent in fewer parts.
-The route topology no longer reports a send from an `onException` clause as a call between routes. Such a send, and the dead letter uri of a dead letter channel, is now an error path: each edge has a `kind` field, `call` as before or `error`, and an error path also says what sends (`via`: `errorHandler` or `onException`) and what happens to the failure (`handling`: `handled`, the message ends there as with a dead letter channel; `continued`, the route goes on after it; or `notHandled`, t [...]
+### camel-coap
-The `inflight` and `blocked` developer consoles now carry a `nodeSource` field per entry, saying where the node the exchange sits at is in the source (such as `orders.camel.yaml:18`). It is `null` when message history or source location is disabled. Existing fields are unchanged.
+The CoAP consumer now answers a failed exchange with `5.00 Internal Server Error`, and no longer returns the exception’s message to the client.
-The `capacity` option of the `trace`, `receive`, `event` and `sql-trace` developer consoles, set from configuration (such as `camel.devConsole.trace.capacity`), is now applied. Prior to Camel 4.23 Camel Main set it after the console had started, so a capacity larger than the default broke the console (`Queue full` or `ArrayIndexOutOfBoundsException`), and the documented range was not checked. A capacity outside that range (50-1000 for `trace` and `receive`, 25-1000 for `event` and `sql-t [...]
+Previously the consumer did not check whether the exchange had failed: a route failure was answered with `2.05 Content` and whatever body the message held when the route failed. When the response could not be built once the route had completed, for example because the body could not be converted to `byte[]`, the exception’s message was sent to the client as the payload of a `5.00 Internal Server Error` response.
-### Error handler - redelivery options of onException
+A new `muteException` consumer option controls the payload of the error response, and it defaults to `true`, the same default as the HTTP consumers and the `camel-knative`, `camel-mina`, `camel-cxf` and `camel-grpc` consumers: the payload is empty. A route that relies on the exception’s message reaching the client must opt back in explicitly:
-An `onException` that sets some of the redelivery options (such as `maximumRedeliveries`) now inherits the options it does not set from the error handler, as documented. Prior to Camel 4.23 (since Camel 3.17) the options it did not set were reset to their defaults: for example with `errorHandler(defaultErrorHandler().redeliveryDelay(0))` and `onException(IOException.class).maximumRedeliveries(3)`, the redeliveries were delayed 1 second each and not 0.
+```text
+coap://0.0.0.0:5683/my/resource?muteException=false
+```
-### Error handler - asynchronous delayed redelivery while stopping
+For the Rest DSL, set it with `restConfiguration().endpointProperty("muteException", "false")`.
-With `asyncDelayedRedelivery` and `allowRedeliveryWhileStopping=false`, stopping the route (or Camel) now rejects a redelivery that is waiting for its delay, as it already did without `asyncDelayedRedelivery`: the exchange fails with a `RejectedExecutionException` (and goes to the dead letter channel, if one is configured) within a second. Prior to Camel 4.23 the stop waited for the whole redelivery delay (or until the shutdown timeout) and the message was then redelivered.
+#### Producer
-### camel-management
+When the CoAP server does not answer a `GET`, `POST`, `PUT` or `DELETE` request (the request timed out or was rejected), the producer now fails the exchange with a `CamelExchangeException`. Before, the exchange continued as if the request had succeeded, with the request body as its body. The `CamelCoapMethod` header is now also accepted in lower case, and an unknown method fails the exchange with an `IllegalArgumentException` instead of sending nothing.
-The thread pool MBeans of a source that creates several thread pools (such as the timeout checker and the optimistic locking pools of the Aggregate EIP) had the same name, so only the first one was registered. For a source that is not an EIP, a name or a static service, the `SourceId` attribute is now the name of the thread pool, which is also added to the MBean name: `AggregateProcessor(0x1b2c3d4e)(AggregateTimeoutChecker)` instead of `AggregateProcessor(0x1b2c3d4e)`. This also applies [...]
+### camel-console
-The JMX `browse` operation of the `DefaultInflightRepository` MBean and the `listAwaitThreads` data of the `DefaultAsyncProcessorAwaitManager` MBean gained a `nodeSource` column, saying where the node is in the source (such as `orders.camel.yaml:18`), next to the existing `nodeId`. It is `null` when message history or source location is disabled. Clients that read the row by item name are unaffected; a client that assumes a fixed number of columns should be reviewed.
+#### Kamelet routes in context and route-topology consoles
-`InflightRepository.InflightExchange` and `AsyncProcessorAwaitManager.AwaitThread` gained a `getNodeSource()` method for the same value. Both are `default` methods returning `null`, so existing implementations continue to compile.
+The `context` developer console no longer counts routes created by Kamelets in its `routesTotal` and `routesStarted` statistics (nor in the `Routes:` line of its text output). A Kamelet is implemented as a route inside the Kamelet, and such routes are not registered with JMX by default, so the `route` developer console never listed them; the counts now agree with that list. This affects consumers of the context status, such as the Camel JBang status document (`~/.camel/<pid>-status.json` [...]
-A CamelContext name (or management name) with `, = : " * ?` or a line feed made the CamelContext fail to start with JMX. These characters are now replaced with `_` in the management name, the `context` key of the object names (the `CamelId` attribute keeps the name). A CamelContext whose management name is already the `context` key of another CamelContext now gets the next free management name, or fails to start with a fixed management name pattern; before, both started and the second on [...]
+The `route-topology` developer console (used by `camel cmd route-topology` and the Camel TUI diagram) no longer includes routes created by Kamelets, as these are an implementation detail of the Kamelet and were already hidden from the route console. Set the `kamelets=true` option (or `--kamelets` on the CLI) to include them.
-The `Redeliveries` statistic now also counts a redelivery attempt that succeeds, and it is only counted where the redelivery happened. For a processor it is the number of redelivery attempts of that processor. For a route it is the number of exchanges that were redelivered by a processor of that route, and for the CamelContext the number of exchanges that were redelivered. Before, only redelivery attempts that failed were counted (so a processor that succeeded on its second redelivery re [...]
+The route topology no longer reports a send from an `onException` clause as a call between routes. Such a send, and the dead letter uri of a dead letter channel, is now an error path: each edge has a `kind` field, `call` as before or `error`, and an error path also says what sends (`via`: `errorHandler` or `onException`) and what happens to the failure (`handling`: `handled`, the message ends there as with a dead letter channel; `continued`, the route goes on after it; or `notHandled`, t [...]
-The constructor of `org.apache.camel.management.InstrumentationInterceptStrategy` (used internally by `JmxManagementLifecycleStrategy`) now takes a map of `InstrumentationInterceptStrategy.WrappedProcessor` values and the `Route` whose processors it instruments, which must not be `null`.
+The `inflight` and `blocked` developer consoles now carry a `nodeSource` field per entry, saying where the node the exchange sits at is in the source (such as `orders.camel.yaml:18`). It is `null` when message history or source location is disabled. Existing fields are unchanged.
-#### mbeansLevel=ContextOnly
+The `capacity` option of the `trace`, `receive`, `event` and `sql-trace` developer consoles, set from configuration (such as `camel.devConsole.trace.capacity`), is now applied. Prior to Camel 4.23 Camel Main set it after the console had started, so a capacity larger than the default broke the console (`Queue full` or `ArrayIndexOutOfBoundsException`), and the documented range was not checked. A capacity outside that range (50-1000 for `trace` and `receive`, 25-1000 for `event` and `sql-t [...]
-With `mbeansLevel=ContextOnly` the components are no longer registered as MBeans (like the endpoints, thread pools and most services, which were not registered at this level already). Prior to Camel 4.23 an MBean was registered for every component. Use `RoutesOnly` (or `Default`) to keep the component MBeans. The CamelContext, health check and route controller MBeans are still registered.
+#### Variables dev console JSON response shape
-### camel-mybatis - a String or byte\[\] body is one parameter (Breaking change)
+The `variables` dev console (`/q/dev/variables`) no longer returns a JSON object keyed by each variable repository’s id. It now returns a fixed shape, so the response has a documented, authoritative OpenAPI schema like the other dev consoles (see the `/q/dev/api` OpenAPI document):
-With `statementType=Insert`, `Update` or `Delete`, a `String` body (or input header) is now passed to the statement as one parameter, also when it contains commas or is blank, and so is a `byte[]`. MyBatis wraps an array parameter into a parameter map, so the statement refers to the `byte[]` as `#{array}`. Prior to Camel 4.23 the String was split at each comma and the statement ran once for each part (once for each byte of a `byte[]`, and not at all for a blank String). Collections, iter [...]
+Before:
-### camel-mybatis, camel-sql - onConsume does not run for a failed or rollback only exchange (Breaking change)
+```json
+{
+ "global": [ { "key": "foo", "type": "java.lang.String", "value": "bar" } ]
+}
+```
-The camel-mybatis consumer no longer runs the `onConsume` statements for a row whose exchange failed or was marked rollback only: the row is consumed again by the next poll, so a row that always fails is now processed at every poll. Handle the exception in the route (for example with `onException(…).handled(true)`) to consume the row anyway. The camel-sql consumer now runs `onConsumeFailed` instead of `onConsume` for a rollback only exchange (no statement when `onConsumeFailed` is not s [...]
+After:
-### camel-groovy
+```json
+{
+ "repositories": [
+ { "id": "global", "variables": [ { "key": "foo", "type": "java.lang.String", "value": "bar" } ] }
+ ]
+}
+```
-A `GroovyShellFactory` is now looked up in the registry once per `CamelContext`, when the first groovy expression is evaluated, instead of on every evaluation. A factory bound to the registry after that point is no longer used; bind it before the context starts.
+Each repository is now an entry in the `repositories` array carrying its own `id`, rather than the id being a dynamic top-level JSON key. Anything that parses this console’s raw JSON directly (custom tooling, or scripts calling the dev console HTTP endpoint) must be updated to the new shape. The `camel get variable` CLI command has already been updated accordingly.
-The `exchangeProperties`, `exchangeProperty`, `variables`, `variable` and `attachments` script variables are now read from the exchange the first time the script uses them instead of being copied before the script runs. A script that changes a property or variable through `exchange` and then reads one of these variables for the first time now sees its own change where it previously saw the state from before the script ran.
+### camel-consul - readTimeout and writeTimeout
-Groovy scripts now have a `message` variable for the current message (`exchange.getMessage()`), the name the other script languages and the Camel 4 API use; `request` and `in` stay as its older names. A `GroovyShellFactory` that provided its own global variable named `message` is now hidden by the exchange variable, like the other exchange variable names.
+The `readTimeout` and `writeTimeout` options (also on the Consul cluster service) set the connect timeout of the Consul client instead of its read and write timeouts. So the client always used the default read and write timeouts of its HTTP client (10 seconds), and the connect timeout was `writeTimeout` when it was set, otherwise `readTimeout`, otherwise `connectTimeout`. Each option now sets its own timeout: a request whose answer takes longer than a configured `readTimeout` now fails, [...]
-The Groovy script compiler now runs the ``org.apache.camel.spi.CompilePostProcessor`s on a compiled class that has class-level annotations, with a new instance of the class, as the Java DSL loader does for `.java`` sources. The processors in the registry are used when there are any (the Camel CLI registers processors that also handle the Spring and Quarkus annotations); otherwise built-in processors for the Camel annotations are used. So in every runtime (camel-main, Spring Boot, Quarkus [...]
+### camel-core - Core Engine and Lifecycle
-The Camel-annotation compile post-processors that camel-kamelet-main used internally are now public classes in camel-support: `org.apache.camel.support.compile.BindToRegistryCompilePostProcessor`, `TypeConverterCompilePostProcessor` and `EventNotifierCompilePostProcessor`.
+#### http and https resources are now resolved with a timeout
-A lazy `@BindToRegistry` class from a compiled `.java` or `.groovy` source (`lazy = true`, or `camel run --lazy-bean` in the Camel CLI) is now bound with the name from the annotation, or else the simple class name, the same as an eager `@BindToRegistry` class. Before, the bean was bound with the fully qualified class name and the annotation value was ignored, so a class in a package, or with a name in the annotation, was not found by the expected name.
+Loading a resource from an `http:` or `https:` location - a Groovy script, an XSLT stylesheet, a Velocity template, or anything else resolved through `ResourceHelper` - previously used the JDK defaults, which are to wait indefinitely for both the connection and every read. A server that accepted the connection and then stopped answering would stall `CamelContext` startup with no way to bound the wait.
-### camel-hashicorp-vault - secret refresh
+Such a resource is now read with a 10 second connect timeout and a 30 second read timeout, and fails with a `java.net.SocketTimeoutException` instead of hanging. The read timeout applies per read rather than to the transfer as a whole, so a large resource arriving slowly is unaffected as long as data keeps coming.
-The secret refresh task now checks a secret used as `hashicorp:myengine:mysecret` in its own engine, and names it `myengine:mysecret` in `HashicorpVaultPropertiesFunction.getSecrets()` and in the updates of the task (secrets of the `secret` engine keep their names). Before, it checked `mysecret` in the `secret` engine, so an update of a secret in any other engine never triggered a reload. The first check now also compares the version in Vault with the version the property was resolved wi [...]
+Both values can be changed, in milliseconds, and `0` restores the previous wait-forever behaviour:
-### camel-djl (Breaking change)
+```properties
+camel.resource.http.connect-timeout = 10000
+camel.resource.http.read-timeout = 30000
+```
-DJL library dependency has been upgraded to 0.37+ Object detection with this version is now reporting coordinates of spotted elements with absolute values instead of a value fraction between 0 and 1. If you do not manipulate the result directly you will be fine as the internal DJL Image converter has been updated. you are impacted if you use the provided result in your own code.
+#### Internal processor advices
-### camel-dynamic-router
+When a `CamelInternalProcessorAdvice` fails in its `before` method, then the `after` method is now executed for the advices whose `before` was already executed. Previously they were skipped, which could leave the exchange counted as inflight and its unit of work not done. The same now happens when the debugger skips over a processor.
-The `dynamic-router-control` endpoint no longer takes the subscription `predicate`, or the `expressionLanguage` used to compile it, from the incoming control message. A control message that supplies either is now rejected with an `IllegalArgumentException`.
+An exception thrown from the `after` method of an advice no longer replaces the exception the exchange has already failed with. Instead, it is added as a suppressed exception to the existing exception.
-The predicate is compiled and then evaluated against every exchange on the channel, so letting the control message choose both the language and the expression means the sender of that message decides what runs inside the Camel process. Only enable this when control messages can only come from a trusted source:
+#### Stream caching deletes spooled file after other onCompletions
-```java
-from("kafka:subscriptions")
- .unmarshal().json(DynamicRouterControlMessage.class)
- .to("dynamic-router-control:subscribe?allowPredicateFromMessage=true");
-```
+When stream caching spools a message body to disk, the temporary file is deleted by an on completion (`Synchronization`) of the exchange. This on completion now has the order `Ordered.LOWEST`, instead of the default order `0`, so it runs after the other on completions of the exchange. The file is therefore deleted later than before, never earlier. On completions with the same order (such as the disconnect of the FTP and SMB consumers, and the close of a JPA `EntityManager`) still run in [...]
-The option is annotated `security = "insecure:dev"`, so with `camel.main.profile = prod` the default policy for that category is `fail`, and an endpoint that sets `allowPredicateFromMessage=true` will not start unless you relax `camel.security.insecureDevPolicy`.
+The `onCompletion` EIP in the default mode (`modeAfterConsumer`) now uses the order `Ordered.LOWEST - 1`, so it runs just before the file is deleted, and its copy of the exchange holds its own reference to a spooled body. An onCompletion can therefore read a spooled body, also with `parallelProcessing`. Previously it failed with a `NoSuchFileException`, and a parallel onCompletion stopped at the first step that read the body. As a side effect, an on completion with the order `Ordered.LOW [...]
-Two alternatives avoid the flag entirely. A control message may still name a `predicateBean`, which selects a `Predicate` that the route author bound in the registry; that path is unchanged. The control endpoint may also carry `predicate` and `expressionLanguage` as URI parameters, in which case every subscription made through that endpoint uses the route author’s expression. Subscription parameters that the control message does not carry now fall back to the values configured on the endpoint.
+#### Context reload now re-applies placeholder based component options
-The `dynamic-router` endpoint gained an `allowedSchemes` option, an optional comma-separated allow-list of component schemes that a subscription destination may resolve to. It is unset by default, which allows any scheme, matching the previous behaviour.
+When a context reload is triggered, for example by one of the vault components detecting that a secret was rotated, Camel now also re-applies the `camel.component.`, `camel.dataformat.` and `camel.language.` options whose configured value is a property placeholder, and notifies any bean implementing the new `org.apache.camel.spi.SecretRotationAware` SPI. Previously only the property placeholders and the routes were reloaded, so a rotated secret never reached a component option that had b [...]
-### camel-management - JMX tabular data
+Re-applying such an option removes the component and resolves it again, as it already does when the option changes in a watched properties file. The component is stopped either way, and what comes back depends on how it was registered: a component auto-detected from the classpath is replaced by a new instance, while a component registered as a bean is the same instance, re-configured and started again. A component that holds a connection will therefore close it on reload.
-Some tabular data returned by the JMX MBeans had a key that was not unique, so the operation failed with `KeyAlreadyExistsException`. The tabular data of the Choice EIP and doTry EIP `extendedInformation` and of `listTasks` of the task manager registry now have an `index` item as their key, the exchange factories of `listStatistics` are keyed by `url` and `routeId`, and endpoints that only differ in a secret (which is masked) are shown once. The `listEndpointServices` operation of the en [...]
+Only options whose value is a placeholder are affected, and only when running with Camel Main, Camel Spring Boot or Camel Quarkus. If a component must not be stopped on reload, configure it programmatically rather than with a placeholder based property.
-The notification types advertised by the event notifier MBean (`getNotificationInfo`) are now the types that `JmxNotificationEventNotifier` sends, which is the simple class name of the event (such as `ExchangeCompletedEvent`), and the notification class is `javax.management.Notification`. Before, the advertised types used a `org.apache.camel.management.event.` prefix and several events were missing.
+Components implementing `SecretRotationAware`, such as `camel-jdbc`, `camel-sql`, and `camel-sql-stored`, will now soft-evict their connection pool(s) on every context reload — not only on vault-detected secret rotations. This includes JMX-triggered reloads, `camel cmd reload`, and dev-mode file-watcher reloads.
-### camel-exec
+#### Languages - less than with two null values, and a source from a variable
-`allowControlHeaders` is now annotated `security = "insecure:dev"`. With `camel.main.profile = prod` the default policy for that category is `fail`, so an endpoint or component that sets `allowControlHeaders=true` will not start unless you relax `camel.security.insecureDevPolicy`.
+- The `<` operator (in the Simple language and the Java DSL `isLessThan`) is now `false` when both sides are `null`, as the `>` operator already was. Prior to Camel 4.23, `${header.a} < ${header.b}` was `true` when neither header existed. The `⇐` and `>=` operators are unchanged and are `true` in that case.
+
+- A language that reads its input from a `source` of `variable:name` now fails with `NoSuchVariableException` when the variable does not exist, as it does with `NoSuchHeaderException` for `header:name`. From Camel 4.4 to 4.22 a missing variable was used as a `null` input. This also applies to a `source` without a prefix, as a plain name refers to a variable (`source="myVar"`), and to the `source` option of the `xslt`, `xslt-saxon` and `xquery` endpoints.
+
-When the flag is `false` (the default), any remaining `CamelExecCommand*`, `CamelExecExitValues`, or `CamelExecUseStderrOnEmptyStdout` headers are ignored and a WARN is logged once per exec endpoint. Those headers never overrode the URI without the flag; they were just silent before.
+#### ClusteredRoutePolicy - routes are started and stopped on the policy thread
-### camel-syslog - text outside US-ASCII
+When the leadership changes, `ClusteredRoutePolicy` now starts and stops its routes on its own thread, instead of on the thread that fires the leadership event while it holds the lock of the cluster view. This fixes a deadlock between a leadership change that is starting routes and a CamelContext stop or a route removal. The thread only exists while there is a leadership change to apply, and exits when idle, so a policy per route (`ClusteredRoutePolicyFactory`) does not keep a thread per [...]
-The syslog data format and the `SyslogMessage` type converter decoded every byte of a message as one ISO-8859-1 character, so any text outside US-ASCII (for example the UTF-8 that RFC 5424 specifies for MSG and for structured data values) came out as two to four wrong characters. The text is now decoded with the charset of the exchange (the `CamelCharsetName` header or exchange property, which the `encoding` option of camel-netty and camel-mina sets), and UTF-8 when none is set. A MSG th [...]
+Most cluster services fire leadership events from their own threads, but some fire them on the calling thread, for example when a view starts or a listener is added. In all cases the routes are now started and stopped on the policy thread, shortly after the event. Code that fires the event itself, for example a custom `CamelClusterView` in a test, can no longer expect the routes to be started or stopped when the event returns, and should wait for the route status instead. Likewise, `isLe [...]
-US-ASCII messages are parsed as before. A route that repaired the wrongly decoded text itself must stop doing so.
+#### CamelEvent JSON serialization
-### camel-barcode - text outside ISO-8859-1
+`CamelEvent` now provides `asJSon()` and `toJSon(int indent)` with default implementations that return a minimal JSON map (`type`, optional `timestamp`, and `message`). Camel’s built-in event classes override these methods to include structured metadata such as exchange, route, and exception details.
-The barcode data format wrote the text in ISO-8859-1 (the ZXing default), so every character that ISO-8859-1 cannot represent (such as Japanese, Cyrillic, Greek or an emoji) was written as `?`. Such a text is now written in UTF-8, with an ECI segment that tells the reader the character set. A reader without ECI support sees the UTF-8 bytes instead of the `?` characters, so it must decode them as UTF-8. Text that ISO-8859-1 can represent is written as before, byte for byte, and a `CHARACT [...]
+Custom `CamelEvent` implementations continue to compile without changes. Override the new methods only if you need richer JSON output than the default `type`/`timestamp`/`message` map.
-### camel-barcode - the hint maps are read-only (Breaking change)
+The Event developer console now exposes the full structured JSON payload in the `details` field of each event entry, while keeping the existing flat `type`, `timestamp`, `exchangeId`, and `message` fields for backwards compatibility.
-The maps returned by `BarcodeDataFormat.getWriterHintMap()` and `getReaderHintMap()` are now read-only views, so changing them throws an `UnsupportedOperationException`. Such changes were lost when the data format started (again), since the hints are computed at start. Use `addToHintMap` and `removeFromHintMap` instead.
+#### Property placeholders in pollEnrich
-### camel-bindy - fixed-length records with characters outside the BMP
+Camel 4.22 stopped resolving property placeholders (`{{…}}`) on the _per-message evaluated_ recipient for `toD` and `enrich`, and said that aligning `pollEnrich` was deferred to a follow-up. This is that follow-up: a `{{…}}` token that appears only in the value produced at runtime by the `pollEnrich` expression is now treated as a literal part of the endpoint URI instead of being expanded.
-Since Camel 3.1 a fixed-length record is read by counting code points (or graphemes with `@FixedLengthRecord(countGrapheme = true)`), but it was written by counting UTF-16 chars, so a field with a character outside the Basic Multilingual Plane (such as an emoji) was written one padding character short and the following fields were read shifted. Marshal now pads and clips each field with the same count as unmarshal, and the record `length` is checked with that count too. A field with such [...]
+Like `toD` and `enrich`, `pollEnrich` resolves its static endpoint URI at build time, so a placeholder belongs there:
-### camel-hl7 - character sets from MSH-18
+```java
+.pollEnrich("file:{{inbox}}", 5000)
+```
-The HL7 data format now maps the MSH-18 values `8859/6`, `8859/7`, `8859/8` and `8859/9` to ISO-8859-6 .. ISO-8859-9, `8859/15` to ISO-8859-15, and `GB 18030-2000` to GB18030, as in HL7 table 0211 (and as camel-mllp already does). Before, the first five fell back to the charset of the exchange (UTF-8 by default), and `GB 18030-2000` failed with `UnsupportedEncodingException`. Messages with these MSH-18 values are now read and written in the named charset, and unmarshal sets `CamelCharset [...]
+`recipientList`, `routingSlip` and `dynamicRouter` are unchanged. Their recipient is supplied entirely at runtime and may legitimately carry a placeholder that comes from configuration, so they continue to resolve `{{…}}` in the computed recipient.
-### camel-ldif - modrdn and moddn records
+#### Circular reference through optional property placeholder is an error
-A `changetype: modrdn` record with a `newsuperior` line now moves the entry under the new superior, as RFC 2849 defines; before, the entry was only renamed in place. A `changetype: moddn` record without `newsuperior` now renames the entry in place; before, it was moved directly under the root (which servers normally refuse).
+A property placeholder that refers back to itself through an optional placeholder, such as `timeout={{?timeout:5000}}`, or two optional placeholders that refer to each other (`a={{?b}}` and `b={{?a}}`), now fail with the same `Circular reference detected` error as a circular reference through required placeholders. Before, resolving such a placeholder never returned, and the thread (for example the one starting the `CamelContext`) kept running at full CPU without any log. No configuratio [...]
-### camel-servlet and camel-jetty - String response in the charset of the Content-Type
+To take a value from somewhere else and otherwise a default, use another key for the override, such as `timeout={{?timeout.override:5000}}`.
-The servlet and Jetty consumers converted a `String` response body with the charset of the exchange (UTF-8 by default) when the response is chunked (the default), and also when it is not chunked and its `Content-Type` is not text (for example `application/json`), even when the `Content-Type` declared another charset (for example `text/plain; charset=ISO-8859-1`). Such a body is now written in the charset that the `Content-Type` declares, so the bytes match the header. Responses without a [...]
+#### Failed route reload restores previous routes
-#### A response that is not chunked and has a text Content-Type
+When a route file is reloaded in dev mode (`camel run --dev`, or the route watcher reload strategy in general) and the new content fails to load, the routes that ran before are restored right away, without the routes of the failed file, and a WARN says so. Before, the previous routes stayed stopped until the next successful reload, so a mistake in one file left the application without routes. The failed file loads again on its next save. The `CamelContextReloadFailure` event and the relo [...]
-A `String` response body that is not chunked (`chunked=false` or the `CamelHttpChunked` header) and has a text `Content-Type` (one that contains `text` or `html`) was written in the charset of the exchange (`CamelCharsetName`, which the consumer sets from the request charset, else UTF-8), which also replaced the charset that the `Content-Type` declared (`text/plain; charset=ISO-8859-1` was sent as `text/plain;charset=UTF-8`). Such a body is now written in the charset that the `Content-Ty [...]
+A project whose routes are all in one file is covered too: the content that last loaded is kept in memory, so the broken save goes back to the version that was running, and the log says how many routes came from it. The file on disk is untouched; its next save is loaded as usual.
-### camel-platform-http-vertx - String response in the charset of the Content-Type
+#### Exchange cut off by route stop or reload logged as WARN
-A `String` response body was always written as UTF-8, even when the response `Content-Type` declared another charset (for example `text/plain; charset=ISO-8859-1`, set by the route or kept from the request). It is now written in the charset that the `Content-Type` declares, so the bytes match the header. Responses without a charset in the `Content-Type`, or with UTF-8, are written as before, and so are bodies that are not a `String`. A client that ignored the declared charset and read su [...]
+When a route is stopped or reloaded (for example a save in `camel run --dev`) while an exchange is in flight, and the graceful shutdown times out, the exchange is cut off. The error handler logged this as a failed delivery: an ERROR with "Exhausted after delivery attempt", the message history and the stack trace of the `RejectedExecutionException`. It is now one line at WARN, "Exchange cut off …: its route is being stopped or reloaded" (or "the CamelContext is being stopped"), as nothin [...]
-### camel-undertow - String bodies in the charset of the Content-Type
+#### RouteStoppingException for exchange cut off by stop
-The Undertow consumer (response) and producer (request) always wrote a `String` body as UTF-8, even when the `Content-Type` declared another charset (for example `text/plain; charset=ISO-8859-1`). A `String` body is now written in the charset that the `Content-Type` declares. Bodies that are not a `String`, and messages whose `Content-Type` declares no charset, are sent as before (UTF-8 by default). A peer that ignored the declared charset and read such a message as UTF-8 must now use th [...]
+An exchange cut off because its route, or the CamelContext, is being stopped (a route stop, a route reload in dev mode, or the graceful shutdown timing out) now fails with the new `org.apache.camel.RouteStoppingException` instead of a plain `RejectedExecutionException`. It extends `RejectedExecutionException`, so an `onException(RejectedExecutionException.class)` or a catch of it still matches; a real rejection, a thread pool or a queue that is full, stays a plain `RejectedExecutionExcep [...]
-#### The charset parameter of the Content-Type in any case
+A `direct` producer that was waiting for a consumer when a forced stop interrupted it now sets a `RouteStoppingException` (with the `InterruptedException` as its cause) instead of a `DirectConsumerNotAvailableException`.
-The `charset` parameter of a `Content-Type` was only recognized in lower case. A request with `Content-Type: text/plain; Charset=ISO-8859-1` did not set `CamelCharsetName` (so its body was read as UTF-8), and a `String` body with such a `Content-Type` was written as UTF-8. The parameter name is now matched case-insensitively (RFC 9110), as in the other HTTP components, on the consumer (request and response) and on the producer.
+A `seda` or `disruptor` producer waiting for the reply (InOut, or `waitForTaskToComplete`) that is interrupted while its route or the CamelContext is being stopped now sets a `RouteStoppingException` (with the `InterruptedException` as its cause). Before, it set an `ExchangeTimedOutException` (or, without a timeout, the `InterruptedException`), although the timeout had not passed. An interruption at any other time sets the `InterruptedException` instead of an `ExchangeTimedOutException`. [...]
-### camel-undertow - WebSocket endpoints apply the security provider, allowed roles and handlers
+Such a cut-off is not recorded in the error registry, as nothing in the route failed; set `camel.errorRegistry.includeRouteStopping=true` to record it as well, for example to see how often stops cut off work that a consumer which does not roll back may lose.
-WebSocket endpoints (`ws://` and `wss://`) now apply the `UndertowSecurityProvider` (the `securityConfiguration` or `securityProvider` option), the `allowedRoles` option, and the `handlers` and `accessLog` options, as HTTP endpoints do. Previously these options had no effect on WebSocket endpoints. They apply to the upgrade request: a client that the security provider rejects, or that connects to an endpoint with `allowedRoles` but no security provider, now gets the same status code as o [...]
+#### Stopping or removing all routes is one graceful shutdown
-All the endpoints of a WebSocket path share its connections. The settings of the consumer apply to the path, including the messages sent by producers on that path, and keep applying while the consumer is stopped; a path that only has producers applies their settings. This also applies to the `oauthProfile` option: while the consumer is stopped, upgrade requests to its path are still validated. A connection that was opened before these settings applied does not receive the messages of the [...]
+`RouteController.stopAllRoutes()` and `removeAllRoutes()` (which a route reload in dev mode uses) stopped the routes one at a time, each as its own graceful shutdown. A route that consumes from another route, such as over `direct`, was then stopped as soon as its own exchanges had completed, while the route sending to it could still have work for it (a split, a loop). Those exchanges waited for the stopped route until the shutdown timeout, and were cut off. All the routes are now stopped [...]
-A WebSocket client that connected without satisfying the configured security provider or allowed roles is now rejected: it must authenticate, or the option must be removed from the WebSocket endpoint.
+#### RoutesLoader.updateRoutes runs one call at a time
-### camel-netty-http - String bodies in the charset of the Content-Type
+Concurrent `RoutesLoader.updateRoutes` calls on one CamelContext now run one at a time instead of failing with `ConcurrentModificationException`. A route whose exchange calls `updateRoutes` while another `updateRoutes` call replaces that route now makes the stop wait until the shutdown timeout, after which the route is forced to stop.
-The Netty HTTP consumer (response) and producer (request) wrote a `String` body in the charset of the exchange (`CamelCharsetName`, UTF-8 by default), even when the `Content-Type` declared another charset (for example `text/plain; charset=ISO-8859-1` set by the route). A `String` body is now written in the charset that the `Content-Type` declares. Bodies that are not a `String`, and messages whose `Content-Type` declares no charset, are sent as before. Also, the `charset` parameter of a [...]
+#### Recursive file watcher watches newly created directories
-### camel-netty-http - the roles of a security constraint are matched by role name
+The file watcher reload strategy (`camel run --dev`, the route watcher reload strategy with a recursive directory) registered the directory tree once at start: a directory created afterwards, such as `src/main/java/com/acme` for a Java class added to a running project, was never watched and its files never reloaded. A directory created under a watched one is now registered as it appears, with the files already in it reloaded. The watcher also ignores the compile work directory (`camel.ma [...]
-The roles of a `SecurityConstraintMapping` inclusion are a comma-separated list of role names, and an authenticated user is now accepted only when one of their roles is equal to one of those names. The comparison is case-sensitive, whitespace around each name and blank entries are ignored, and a value of `*` still accepts any role. A roles value that uses another separator, such as `admin;guest` or `admin guest`, must be changed to `admin,guest`.
+#### Type of bean created by script or builder is optional
-### camel-snmp - GET\_NEXT (walk)
+The `type` (class name) of a bean definition — `bean` under `beans`, `templateBean` of a route template, `bean` of a templated route — is no longer declared as required. It was required since the attribute also selected how the bean is created; that moved to `scriptLanguage` in Camel 4.1, and a bean created by a script (`scriptLanguage` and `script`) or a builder (`builderClass`) needs no class name: the runtime registers it as the type of the object the script or builder returns, as the [...]
-A `GET_NEXT` walk now ends at the end of the agent’s MIB view (`endOfMibView`, or `noSuchName` for SNMPv1) and at the end of the requested subtree by comparing OIDs (`1.3.6.1.4.1.20…` is no longer taken as part of `1.3.6.1.4.1.2`). Before, a walk that reached the end of the MIB view requested the same OID again forever. A walk whose request times out now fails with a `TimeoutException`, like `GET`, instead of returning the entries read so far (an empty list for an agent that does not an [...]
+The XML schemas (`camel-spring.xsd`, `camel-xml-io.xsd`) and the YAML schema no longer require `type`, so Spring XML and the YAML validator (`camel validate`) now accept what the runtime already ran. A bean that is neither scripted nor built still needs a `type`, and the error for a missing one is now an `IllegalArgumentException` naming the bean instead of a `NullPointerException`.
-### camel-plc4x - failed writes and reads
+#### Bean whose class has builder() method is created via builder
-A `plc4x` producer with `autoReconnect=true` whose reconnect fails now fails the exchange with the `PlcConnectionException`. Before, it logged "Unable to reconnect, skipping request" and the exchange completed as if the values had been written. A failed write also keeps the message of the exchange (it was removed before), so that a redelivery writes the same values again.
+A bean declaration (`bean` under `beans` in YAML and XML, `templateBean` of a route template, `camel.beans.` in Camel Main, and a `#class:` value in property binding) whose class has no public no-arg constructor but a public static `builder()` or `newBuilder()` method is now created via that builder: the properties are set on the builder and the bean is created with the builder’s `build()` method (or its single public no-arg method that returns the type). This makes a class built by Lomb [...]
-The `plc4x` polling consumer (for example `pollEnrich`) now returns an exchange that has the exception when the connection or the read fails, instead of an exchange with an empty `Map` body, and it returns `null` when the PLC does not answer within the timeout of `receive(timeout)` or `receiveNoWait()`, as other polling consumers do. With `pollEnrich` the exception fails the exchange (unless `aggregateOnException` is enabled). A route that polls a PLC periodically and should go on while [...]
+Such a declaration previously failed, as there was no constructor to call, so no working declaration changes behaviour: a class that has a public no-arg constructor is still created with the constructor, and `builderClass`, `factoryMethod` and `constructors` are used when given. `builderMethod` can now be set without `builderClass`, to name the method of an inferred builder.
-### camel-reactive-streams - stopping a consumer
+A bean whose class has neither a public no-arg constructor nor a builder now fails with a message naming the ways it can be created (its constructors for `constructors`, its static factory methods for `factoryMethod`, or a builder class of its own), instead of the `NoSuchMethodException` or `IllegalAccessException` of the reflection call, and an unknown property of a bean created through its builder names the properties the builder and the bean accept. `camel validate` and the `camel_val [...]
-Stopping a `reactive-streams` consumer now routes the items it already received from the stream before the route stops, waiting up to the `shutdownAwaitTermination` of the `ExecutorServiceManager` (10 seconds by default). Before, these items were dropped, and after a restart the consumer could stop requesting items. A route that synchronously stops itself from one of its own exchanges now waits for that timeout; stop it asynchronously instead (for example with the Control Bus `async=true [...]
+`PropertyBindingSupport.setPropertiesOnTarget` now reports an unknown property with the property name and value, as it rethrew the `PropertyBindingException` with its null cause since 4.21, which surfaced as `NullPointerException: e`.
-### camel-reactive-streams - suspending a consumer
+#### Graceful shutdown waits for parallel onCompletion tasks
-The `reactive-streams` consumer is now suspendable: suspending its route (route controller, JMX) and a route policy such as `ThrottlingInflightRoutePolicy` suspend it instead of stopping it, and a graceful shutdown suspends it before stopping it. It then requests no more items and holds the items it has already received, without waiting for them, and routes them in order when it is resumed (or stopped). Before, the consumer was stopped (the route status was `Stopped` instead of `Suspende [...]
+With `onCompletion().parallelProcessing()`, stopping or suspending a route (and stopping `CamelContext`) now waits for the onCompletion tasks that are running or queued in its thread pool, up to the shutdown timeout, just as it waits for the inflight exchanges. Previously the shutdown did not wait for them, and when the thread pool was shut down, the queued tasks were dropped and the running ones were interrupted.
-### camel-vertx - request/reply over the event bus
+An onCompletion with `parallelProcessing` that synchronously stops its own route now waits for itself until the shutdown timeout occurs, and the route is then stopped forcibly. Stop the route asynchronously instead, for example from a separate thread or with the Control Bus `async=true` option.
-When a `vertx` consumer receives a message that expects a reply and the route fails, the sender now gets a failure reply (a `ReplyException` with failure type `RECIPIENT_FAILURE`, failure code 500 and the message `Exchange processing failed`; the exception of the route is not sent to the sender). Before, the consumer replied with the message body as if the route had succeeded, which usually echoed the request back. A route that ends without a body now replies with an empty (`null`) body [...]
+#### Debugger waitForAttach option suspends message processing
-### camel-slack - the consumer reads every new message
+With `camel.debug.waitForAttach=true` the backlog debugger now suspends the processing of messages at startup until a debugger is attached, as the option documents. Previously the option only set a flag, and messages were processed straight away. An application that has this option set now waits at startup until a debugger attaches.
-When more messages than `maxResults` (default 10) were posted to the channel since the previous poll, the consumer routed only the most recent `maxResults` of them and skipped the older ones. It now reads the following pages of the conversation history in the same poll, so a poll can route more than `maxResults` messages, with one request per `maxResults` messages. For a busy channel, raise `maxResults` to keep the number of requests within the Slack rate limits. If the request for a fol [...]
+#### Event notifier exchange sent and redelivery events
-### camel-rocketmq - a message whose route failed is consumed again
+An event notifier now receives the `ExchangeSentEvent` also when it does not want the `ExchangeSendingEvent` (with `ignoreExchangeSendingEvents=true`, or when `isEnabled` only accepts the sent event). Previously the sent event was only emitted when some event notifier had accepted the sending event.
-The consumer acknowledged a message (`CONSUME_SUCCESS`) whenever the processor returned, also when the route failed: a failed route sets the exception on the exchange instead of throwing it, so the message was lost. The consumer now answers `RECONSUME_LATER` for a failed exchange (or one marked rollback only), and RocketMQ redelivers the message with an increasing delay (up to the maximum reconsume times of the consumer group, 16 by default, then it goes to the dead letter queue of the g [...]
+The `ignoreExchangeRedeliveryEvents` option on an event notifier is now used to ignore the `ExchangeRedeliveryEvent`. Previously the redelivery event was ignored by the `ignoreExchangeFailedEvents` option instead, and `ignoreExchangeRedeliveryEvents` had no effect.
-### camel-dapr - pub/sub consumer acknowledges an event after the exchange
+An event notifier that is added after `CamelContext` has been started is now started (and it is stopped when it is removed).
-The pub/sub consumer acknowledged every event with `SUCCESS` as soon as the exchange was handed to the route, also when the route then failed, so Dapr dropped events whose processing failed. The consumer now answers when the exchange is done: `SUCCESS` when it completed, and `RETRY` when it failed (or was marked rollback only), so that Dapr redelivers the event. A route that fails for an event, and relied on the event being dropped, now receives it again; handle the exception in the rout [...]
+#### Scheduled poll consumer configuration
-### camel-jooq - an entity whose exchange failed is not deleted
+The `delay`, `initialDelay`, `timeUnit` and `useFixedDelay` of a scheduled poll consumer that are changed while the consumer is stopped (such as using JMX) are now used when the consumer is started again. Previously the values from the first start were kept.
-With `consumeDelete=true` (the default) the consumer deleted every entity of a poll after the batch, also the entities whose exchange failed (a failed route sets the exception on the exchange instead of throwing it), so those rows were lost. The consumer now deletes only the entities whose exchange completed successfully; an entity whose exchange failed (or was marked rollback only), or that was not processed because the route was stopping (when a graceful shutdown starts in the middle o [...]
+When a backoff (`backoffMultiplier`) finishes, the error counter of the consumer (used by the health checks and JMX) is no longer reset to 0. It is reset when a poll succeeds. The number of skipped polls is the same as before.
-### Components and Language removal
+#### Properties component locations validation
-#### camel-csimple, camel-csimple-joor and csimple-maven-plugin
+A properties location with an unknown (or misspelled) resolver, such as `Classpath:app.properties` or `C:\app.properties` (use `file:` for a file path), now fails when Camel is started. Previously the location was silently ignored. The supported resolvers are `classpath:`, `file:` and `ref:`. Mark the location as optional (`;optional=true`) or set `ignoreMissingLocation=true` to ignore it.
-The `csimple` (compiled simple) language was deprecated in 4.19. Use the `simple` language instead.
+A `;` in the path of a location (such as `file:/opt/a;b/app.properties`) is now kept as part of the path. Previously the path was cut off at the `;` (only `;optional=true` is an option of a location).
-#### camel-archetype-spring
+#### ThrottlingExceptionRoutePolicy
-The Maven archetype `camel-archetype-spring` was deprecated in 4.17. Use spring boot instead.
+`ThrottlingExceptionRoutePolicy.setKeepOpen(true)` now opens the circuit immediately and synchronously (the consumer is suspended before the setter returns) rather than waiting for the next `onExchangeDone()` callback. This is the intended behaviour and makes the `keepOpen` toggle deterministic, but callers that previously relied on the setter being inert until an exchange arrived must be aware of the change. Setting `keepOpen` back to `false` remains deferred: the half-open timer attemp [...]
-#### camel-catalog-lucene
+#### Route reload
-The maven plugin was deprecated in 4.12. The catalog now has built-in suggestions (see `camel-catalog` below).
+Dev-mode route reloading now finds changed files by scanning the watched folder on an interval and comparing each file’s modification time and length with the previous scan, instead of using the JDK `WatchService`. A scan reports all the files of one save together, which is what a reload needs: a route is built with the properties of the moment, so a route and a property saved together must be reloaded together. It also removes the macOS penalty, where Java has no native file notificatio [...]
-#### camel-digitalocean
+A dot directory under the watched folder is no longer scanned. `.camel-jbang`, where `camel run` keeps the properties of the run it is doing, was reloading the routes whenever it was written, and `.git` or `.idea` were walked on every scan for nothing. A route file inside a dot directory is therefore no longer watched.
-The component camel-digitalocean was deprecated in 4.21. The java library used has been unmaintained for several years and there is no replacement.
+`FileWatcherResourceReloadStrategy.setPollTimeout` is now how often the folder is scanned. Its default is unchanged at 2000 milliseconds, so on Linux and Windows a change is noticed within two seconds rather than immediately, and on macOS within two seconds rather than up to ten. A new `setStableTimeout` (default 200 milliseconds) leaves a file that was only just modified for the next scan, so a save still being written is not reloaded half-finished.
-#### camel-hazelcast-atomicvalue
+### camel-core - Enterprise Integration Patterns (EIPs)
-The component `camel-hazelcast-atomicvalue` was deprecated in 4.19.0.
+#### Aggregate EIP - optimistic locking retry delay
-In hazelcast 5.5+, the CP subsystem is only available in the enterprise edition of hazelcast. `hazelcast-pncounter` is a partial replacement.
+When optimistic locking is enabled without configuring an `optimisticLockRetryPolicy`, the retry delay between attempts is now capped at 1 second, which is the documented default of `maximumRetryDelay`. Prior to Camel 4.23 the delay was not capped in that case and doubled on every attempt, so after a few failed attempts an exchange could wait minutes or hours before trying again. To keep an uncapped delay, configure an `optimisticLockRetryPolicy` with `maximumRetryDelay` set to `0`.
-#### camel-headersmap
+#### Circuit Breaker EIP
-The component camel-headersmap was deprecated in 4.21. The default `CaseInsensitiveMap` in camel-core uses a custom O(1) hash table with zero-allocation lookups and header key deduplication, making the external cedarsoftware `java-util` dependency unnecessary. Simply remove the `camel-headersmap` dependency from your project — the core implementation now provides equivalent or better performance.
+The exchange property `CamelCircuitBreakerResponseRejected` is now also set inside the `onFallback`, in both `camel-resilience4j` and `camel-microprofile-fault-tolerance`: `true` when the call was not attempted because the breaker was open or the bulkhead was full, `false` when the call was made and failed or timed out. Prior to Camel 4.23 the property was only set when there was no fallback and was absent inside the fallback, so a fallback that tested it for `null` must now test for `tr [...]
-#### camel-iec60870
+#### Convert Body, Convert Header and Convert Variable EIPs
-`camel-iec60870` was deprecated in 4.21. The library used to implement it NeoScada is no more maintained since 2021. There are no alternatives in Java with compatible license.
+When a charset is configured, such as `convertBodyTo(String.class, "UTF-8")`, then the conversion now uses that charset also when the message has a `CamelCharsetName` header. Previously the header took precedence, so the configured charset was ignored. The header is kept on the message unchanged.
-#### camel-irc
+The `CamelCharsetName` exchange property is now also restored when the conversion fails. Previously the configured charset was left on the exchange, where the error handler would use it.
-The component camel-irc was deprecated in 4.21. The library used had no stable release since 2007. There is no Java library very active for this protocol.
+#### Aggregate EIP - completion timeout with optimistic locking
-#### camel-ironmq
+When the aggregator uses optimistic locking together with `completionTimeoutExpression`, a group now records its completion timeout in the `CamelAggregatedTimeout` exchange property of the aggregated exchange stored in the aggregation repository, and a group only completes by timeout when it has this property. This prevents the timeout of an already completed group from completing a new group for the same correlation key.
-The component camel-ironmq was deprecated in 4.21. The official library used has been unmaintained since 2017 All the other client libraries (in other languages) are unmaintained since the same amount of time. The whole iron-io GitHub organization has almost no activity.
+A group that was persisted in the aggregation repository before the upgrade does not have this property, so it does not complete by timeout until another exchange that has a completion timeout arrives for the group. A custom `AggregationRepository` that does not keep exchange properties never completes a group by timeout. This only affects optimistic locking combined with `completionTimeoutExpression`.
-#### camel-joor
+#### Aggregate EIP - stream caching with spooling to disk
-The language `joor` was deprecated in 4.3. The language `java` can be used in-place. It was a renaming. Joor is used underneath for `java` expression.
+When stream caching spools message bodies to disk, the aggregator now keeps the spool files of the bodies it aggregates until the aggregated exchange is done. Prior to Camel 4.23 a spool file was deleted as soon as the incoming exchange was done, so the aggregated exchange could fail to read the bodies with a `NoSuchFileException`.
-#### camel-json-patch
+With the default `MemoryAggregationRepository` (without optimistic locking) the spool files of all exchanges of a group are now kept until the group completes and the aggregated exchange is done, so more disk space can be used in the spool directory than before. For example `UseLatestAggregationStrategy` with a large `completionSize` now keeps a spool file for every exchange of the group, although only the last body is used. A group that never completes keeps its spool files until the ag [...]
-The `camel-json-patch` was deprecated in 4.19. The library it uses is not actively maintained and this module does not work with Jackson 3.
+With optimistic locking, or a persistent aggregation repository, the spool file of an exchange is released when the exchange has been added to the repository (a persistent repository has read the body at that time), and only the spool file of the exchange that completes a group is kept until the aggregated exchange is done.
-#### camel-langchain4j-tools
+#### Variable Receive
-The `camel-langchain4j-tools` component was deprecated in 4.19. Use `camel-ai-tool` to define tools and `camel-langchain4j-agent` for tool-calling with LangChain4j models.
+When an EIP with `variableReceive` stores a message into a variable that already holds a message, the header variables of the previous message (`header:myVar.*`) are now removed first. Previously a header that the new message did not have kept its old value, so the body and the header variables of the variable could come from different messages. This applies to exchange, global, route and group variables.
-Migrate your tool definition routes from `langchain4j-tools:` to `ai-tool:`:
+#### Weighted Load Balancer EIP
-```java
-// Before
-from("langchain4j-tools:weather?tags=weather&description=Get weather¶meter.city=string")
- .setBody(constant("{\"city\": \"Paris\", \"temp\": \"22C\"}"));
+The distribution ratios of the weighted load balancer are now validated when the route starts. A negative ratio, ratios that are all `0`, or ratios whose sum is greater than `2147483647` now fail the route at startup with an `IllegalArgumentException`. Previously such a route started, but sending to it could hang the caller, spin a CPU, or send every message to the same endpoint.
-// After
-from("ai-tool:weather?tags=weather&description=Get weather¶meter.city=string")
- .setBody(constant("{\"city\": \"Paris\", \"temp\": \"22C\"}"));
-```
+#### Resequencer EIP - stream resequencing and route stop
-Use `langchain4j-agent` with matching tags to invoke tools:
+When a route with the stream resequencer stops, a caller that is blocked because the resequencer is full (`capacity`) now fails with a `java.util.concurrent.RejectedExecutionException`. Prior to Camel 4.23 such a caller stayed blocked, also after the route was stopped.
-```java
-from("direct:chat")
- .to("langchain4j-agent:assistant?agent=#myAgent&tags=weather");
-```
+#### Saga EIP - compensation and completion failures
-Add the `camel-ai-tool` dependency to your project:
+When a saga in `AUTO` completion mode fails and its compensation then fails as well, the exchange now keeps the exception that caused the compensation, and the compensation failure (a `RuntimeCamelException` with the message `Unable to compensate all required steps of the saga <id>`) is added to it as a suppressed exception. Prior to Camel 4.23 that `RuntimeCamelException`, wrapped in a `java.util.concurrent.CompletionException`, replaced the original exception. An `onException` or `doCa [...]
-```xml
-<dependency>
- <groupId>org.apache.camel</groupId>
- <artifactId>camel-ai-tool</artifactId>
-</dependency>
-```
+When the completion of a saga fails, the exchange now gets the `RuntimeCamelException` with the message `Unable to complete all required steps of the saga <id>` as is. Prior to Camel 4.23 it was wrapped in a `java.util.concurrent.CompletionException`.
-#### camel-leveldb
+With the in-memory saga service, a saga whose compensation or completion could not be done after all the retries now has the status `FAILED`, instead of `COMPENSATED` or `COMPLETED`: compensating or completing it again fails, instead of reporting success. When the in-memory saga service stops, it logs a warning with the ids of the sagas that are not finalized, since they will not be compensated or completed.
-`camel-leveldb` was deprecated in 4.18. `leveldb` library is no more maintained and it exists several alternatives for file-based database nowadays.
+#### Intercept Send To Endpoint EIP
-#### camel-reactive-executor-tomcat
+The interceptors of `interceptSendToEndpoint` are now registered by each route while it is running, on an endpoint that is wrapped once:
-The `camel-reactive-executor-tomcat` component has been deprecated in 4.22. It is now removed.
+- Each route uses its own interceptor. Before, the endpoint was wrapped by the interceptor of one of the routes (which one depended on the order of an unordered set), and all the routes used that one.
+
+- Removing a route no longer breaks the other routes that send to the intercepted endpoint (they failed with `RejectedExecutionException` when the route whose interceptor wrapped the endpoint was removed).
+
+- The interception is kept when the `CamelContext` is restarted.
+
+- The interceptor of a stopped route is no longer used.
+
+- Interceptors from two ``RouteBuilder`s for the same endpoint are both used, each by the routes of its own `RouteBuilder``. Before, only the one that wrapped the endpoint first was used.
+
+- `mockEndpoints` together with an `interceptSendToEndpoint` on the same endpoint now both run, in a fixed order: the interceptors of the route that is sending first, and then the mock. Before, only the one that wrapped the endpoint first was used.
+
+- When an interceptor applies to several routes (such as one defined in a `RouteBuilder` with several routes), the `CamelInterceptedRouteId` and `CamelInterceptedParentEndpointUri` exchange properties are those of the route that sends to the endpoint. Before, they were always those of the first route of the `RouteBuilder`.
+
-Its cross-thread `ThreadLocal` cleanup relied on reflective access to the private `Thread.threadLocals` field, which is denied by the JDK module system since JDK 17 and is incompatible with virtual threads. Without that cleanup, this executor is functionally identical to the built-in `DefaultReactiveExecutor`.
+The `org.apache.camel.processor.InterceptSendToEndpointCallback` class is deprecated, as it is no longer used.
-To migrate, remove the `camel-reactive-executor-tomcat` dependency from your project. Camel will automatically use the default reactive executor.
+#### Circuit breaker fallback recovery recorded as handled
-#### camel-reactive-executor-vertx
+The error registry (`camel get errors`, the error dev console) recorded a call that failed inside a `circuitBreaker` and was answered by its `onFallback` as an error that was not handled, one per call, since the breaker runs the call on a copy of the exchange whose failure is reported before the fallback runs, and the breaker did not report the recovery. The breaker now emits the failure-handling and failure-handled events around the fallback, as `doCatch` does, and the registry marks th [...]
-The `camel-reactive-executor-vertx` component was deprecated in 4.21. The component has been in an experimental state for a long time and no user feedback has been received to justify continued maintenance.
+#### Claim Check EIP - Exchange copies get their own claim check repository
-#### camel-splunk
+The Claim Check EIP keeps its claim checks in a repository that belongs to the exchange. The javadoc of `ClaimCheckProcessor` already says that the repository is "not shared among Exchanges", but a copy of an exchange used the same repository instance as the exchange it was copied from. This only happened when the exchange had used the Claim Check before the copy was made, because the repository is created on first use. The exchanges created by the Splitter, Multicast, Recipient List and [...]
-The `camel-splunk` component was deprecated in 4.19. The Splunk Java SDK it depends on is no longer actively maintained.
+Such a copy now gets its own copy of the repository. It starts with the claim checks of the parent, so a part can still get what the parent stored, but what a part stores, removes, pushes or pops is no longer visible to the parent or to the other parts. After a Multicast or Recipient List, the parent continues with the repository of the result exchange (the exchange that the aggregation strategy returned), as it already did for the other exchange properties.
-Users who only need to **send events to Splunk** can migrate to `camel-splunk-hec`, which uses the Splunk HTTP Event Collector (HEC) over standard HTTPS with no dependency on the Splunk Java SDK.
+#### Splitter EIP unwraps Exchange parts
-However, `camel-splunk-hec` is a **producer-only** component. The following `camel-splunk` capabilities have no equivalent in `camel-splunk-hec`:
+The Splitter EIP now unwraps parts of type `org.apache.camel.Exchange`, the same way it already unwrapped parts of type `org.apache.camel.Message`. When splitting a body of type `List<Exchange>`, as produced by the camel-kafka batching consumer (`batching=true`) and by the grouped exchange aggregation strategy, each child exchange now carries the body and the headers of the corresponding part. Previously the child body was the part `Exchange` itself, with no headers.
-- **Consumer (search)**: normal searches, real-time searches, and saved-search execution are not supported.
-
-- **TCP streaming**: the `tcp` producer publish type (raw socket streaming to a Splunk TCP input) is not available.
-
-- **SUBMIT and STREAM publish types**: only HEC-based ingestion is supported.
-
+Code that read the part from the child body must be updated, for example when performing a Kafka manual commit after a split:
-If your routes only produce events to Splunk (using the `submit` or `stream` publish types), switching to `camel-splunk-hec` is straightforward — configure the HEC token, index, sourceType, and source on the endpoint. If your routes consume (search) data from Splunk, there is currently no direct replacement within Apache Camel, and you will need to use the Splunk REST API directly or keep using `camel-splunk` until it is removed.
+```java
+// before
+KafkaManualCommit manual = exchange.getMessage().getBody(Exchange.class)
+ .getMessage().getHeader(KafkaConstants.MANUAL_COMMIT, KafkaManualCommit.class);
-> **Note**
-> `camel-splunk-hec` is NOT deprecated and remains actively maintained.
+// now
+KafkaManualCommit manual = exchange.getMessage().getHeader(KafkaConstants.MANUAL_COMMIT, KafkaManualCommit.class);
+```
-#### camel-threadpoolfactory-vertx
+The message of the part is copied into the child exchange, so the exchanges in the original list are left untouched and remain usable after the split, for example by the batching consumer that owns them. Exchange properties of the part are not carried over to the child exchange, as is already the case for `Message` parts.
-The component camel-threadpoolfactory-vertx was deprecated in 4.21. The component has been in an experimental state for a long time and no user feedback has been received to justify continued maintenance.
+#### Idempotent Consumer repository lifecycle on route stop
-#### camel-zeebe
+Stopping a route with an Idempotent Consumer (for example with `stopRoute` on the route controller, over JMX, or when a supervising route controller restarts the route) used to stop the idempotent repository as well. The in-memory repositories clear their data when stopped: `MemoryIdempotentRepository`, and a `KeyValueIdempotentRepository` over a `MemoryKeyValueRepository`, which clears the whole store. A repository that other routes were still using was therefore wiped, and so was the d [...]
-`camel-zeebe` component was deprecated in 4.19 and has a straightforward replacement with `camel-camunda`. It is removed in 4.23.
+The repository is now only stopped when the route is removed or when `CamelContext` is stopped. A route that is stopped and started again therefore keeps the message ids that its in-memory repository has seen, and a repository backed by a remote store keeps its connection while the route is stopped. To forget the ids, clear the repository with `IdempotentRepository.clear()` (or the `clear` JMX operation of the Idempotent Consumer).
-### camel-core - MemoryIdempotentRepository and MemoryAggregationRepository deprecated
+#### Saga step of already ended saga fails
-`MemoryIdempotentRepository` and `MemoryAggregationRepository` are deprecated in favor of the new `KeyValueIdempotentRepository` and `KeyValueAggregationRepository` adapters wrapping a `MemoryKeyValueRepository`. The new classes delegate to the `KeyValueRepository` SPI introduced in 4.23, which provides a uniform key-value abstraction that can be backed by any store (in-memory, Redis, JDBC, etc.).
+Since 4.22, the `InMemorySagaService` removes a saga once it is completed or compensated, for example after its timeout, or after `saga:complete` for a `MANUAL` saga. A saga step with propagation `REQUIRED` on an exchange of such a saga then started a new saga of its own and completed it, and a step with propagation `SUPPORTS` ran outside of any saga, although the saga of the exchange had already ended.
-#### Java DSL
+Such a step now fails with `IllegalStateException` (`Cannot begin: saga <id> is not active or not known`), as it did before 4.22 and as it does while the saga is still being completed or compensated. A step with propagation `MANDATORY` fails as before.
-To migrate from `MemoryIdempotentRepository`:
+The check applies to any `CamelSagaService` that returns no coordinator for the saga id of the exchange. For example, a custom saga service that reads the `Long-Running-Action` header, and receives the id of a saga it does not know, now fails such a step instead of starting a new saga.
-```java
-// Before
-IdempotentRepository repo = MemoryIdempotentRepository.memoryIdempotentRepository();
+#### inheritErrorHandler attribute on circuitBreaker and failoverLoadBalancer is String
-// After (simple — defaults to in-memory)
-IdempotentRepository repo = new KeyValueIdempotentRepository();
+`CircuitBreakerDefinition.inheritErrorHandler` and `FailoverLoadBalancerDefinition.inheritErrorHandler` are now declared as `String` instead of `Boolean`, the same way nearly every other scalar attribute in the Camel model is declared. This allows a property placeholder to be used, which is resolved when the route starts:
-// After (explicit — useful when sharing a store or using a custom KeyValueRepository)
-IdempotentRepository repo = new KeyValueIdempotentRepository(new MemoryKeyValueRepository());
+```yaml
+- route:
+ from:
+ uri: direct:start
+ steps:
+ - circuitBreaker:
+ inheritErrorHandler: "{{myInheritFlag}}"
+ steps:
+ - to:
+ uri: mock:a
```
-To migrate from `MemoryAggregationRepository`:
+Before this change the value was converted to a `Boolean` while the route was being loaded, so `inheritErrorHandler: "{{myInheritFlag}}"` silently evaluated to `false` instead of resolving the placeholder.
-```java
-// Before
-AggregationRepository repo = new MemoryAggregationRepository();
+The accessors changed accordingly:
-// After (simple — defaults to in-memory)
-AggregationRepository repo = new KeyValueAggregationRepository();
+- `ProcessorDefinition.getInheritErrorHandler()` and `setInheritErrorHandler(…)` now use `String` instead of `Boolean`, and so do the overrides on `CircuitBreakerDefinition` and the accessors on `FailoverLoadBalancerDefinition`. Use `CamelContextHelper.parseBoolean(camelContext, getInheritErrorHandler())` where a `CamelContext` is available to resolve the value.
+
-// After (explicit — useful when sharing a store or using a custom KeyValueRepository)
-AggregationRepository repo = new KeyValueAggregationRepository(new MemoryKeyValueRepository());
-```
+The fluent builder `CircuitBreakerDefinition.inheritErrorHandler(boolean)` and the `failover(…)` methods on `LoadBalanceDefinition` are unchanged, and a `CircuitBreakerDefinition.inheritErrorHandler(String)` overload was added for placeholders. Routes written in XML, YAML or the Java DSL do not need any change; the `inheritErrorHandler` attribute in the XML schema is now `xs:string` so a placeholder validates.
-#### XML DSL
+#### toD now passes the raw URI to useRawUri() components
-If you define the repository as a bean in XML, a simple one-to-one replacement is sufficient since the adapters default to an in-memory backing store:
+Components that override `useRawUri()` to return `true` (such as `kamelet`, `master`, and `webhook`) now receive the original, un-encoded URI when the endpoint is resolved dynamically via `toD`, exactly as they already did via the static `to` DSL.
-For idempotent consumers:
+Before this change, `toD` passed the URL-encoded (normalised) form to such components, causing parameter values containing special characters (`%`, `+`, `?`, `=`, `@`, `|`) to arrive double-encoded at the component.
-```xml
-<!-- Before -->
-<bean name="myRepo" type="org.apache.camel.support.processor.idempotent.MemoryIdempotentRepository"/>
+This is a bug fix (CAMEL-24747). Routes that relied on `toD` passing the encoded form to a `useRawUri()` component will now see the original raw value instead. For all other components (`useRawUri()` returns `false`), behaviour is unchanged.
-<!-- After -->
-<bean name="myRepo" type="org.apache.camel.support.KeyValueIdempotentRepository"/>
-```
+#### Recipient List releases producers of recipients not sent to
-For aggregation repositories:
+The Recipient List acquires a producer for every recipient before it starts sending. When it completes before it has sent to every recipient (for example with `stopOnException` or a `timeout`), it now releases the producers of the recipients it did not send to. Previously these producers were never released: a pooled (non-singleton) producer was not returned to its pool, and with `cacheSize(-1)` the prototype endpoint and its producer were never stopped.
-```xml
-<!-- Before -->
-<bean name="myRepo" type="org.apache.camel.processor.aggregate.MemoryAggregationRepository"/>
+With `parallelProcessing`, a recipient whose task had not started yet when the Recipient List completed is now skipped instead of being sent to afterwards. As before, recipients that had already started keep running.
-<!-- After -->
-<bean name="myRepo" type="org.apache.camel.support.KeyValueAggregationRepository"/>
-```
+### camel-core - Error Handling
-To use a custom `KeyValueRepository` (e.g. a shared store), define the backing store separately:
+#### Error handler - onException when the exception changes during redelivery
-```xml
-<bean name="kvStore" type="org.apache.camel.support.MemoryKeyValueRepository"/>
-<bean name="myRepo" type="org.apache.camel.support.KeyValueIdempotentRepository">
- <constructors>
- <constructor value="#kvStore"/>
- </constructors>
-</bean>
-```
+When a redelivery attempt fails with a different exception than the previous attempt, the error handler now uses the `onException` that matches the new exception. If no `onException` matches it, the error handler’s own settings apply, for example moving the message to the dead letter channel.
-The `idempotentRepository` and `aggregationRepository` attributes in the route DSL remain unchanged — they still reference the bean by its name.
+Prior to Camel 4.23 the error handler kept using the `onException` matched by the earlier exception, including its `handled`, `continued`, redelivery and `onRedelivery` settings. So a new exception with no `onException` of its own could be routed and handled by the earlier exception’s `onException`, and was not seen by the caller or the dead letter channel.
-The deprecated classes continue to work but will be removed in a future release.
+The redelivery counter is not reset when the exception changes, so the new `onException` measures its `maximumRedeliveries` against the attempts already made. A route whose `onException(IOException.class)` allows 5 redeliveries and which fails 4 times before the exception changes leaves the new policy a counter of 4, so an `onException(IllegalArgumentException.class).maximumRedeliveries(2)` is already exhausted and the message goes to the dead letter channel on the next failure.
-### camel-core - endpoint URI normalization is now order-independent
+#### Error registry
-`URISupport.normalizeUri()` computes the endpoint registry cache key so that two logically identical endpoint URIs (differing only in query parameter order) resolve to a single shared `Endpoint`. A fast-path optimization only re-encoded query parameter values when the parameter keys were **not** already in alphabetical order, so two semantically identical URIs could normalize to two different strings whenever a value needed encoding (for example a colon in a `host:port` value) - dependin [...]
+- An error is only recorded as handled when the failure processor has handled it. Prior to Camel 4.23 an error was recorded as handled whenever an `onException`, dead letter channel or `doCatch` ran for it, also with `handled(false)` or when the `doCatch` threw again.
+
+- The error registry records every failure of an exchange: the failures of the parts of a split or multicast, a failure after an error that was handled by a `doCatch`, and a failure in `onCompletion`. Prior to Camel 4.23 it kept only one entry per exchange, so such failures replaced or hid each other.
+
-Normalization is now always order-independent. As part of the fix, the encoding applied when rebuilding the query string is also less aggressive: characters that are legal unescaped in a URI query per RFC 3986 (`:`, `/`, `,`, `'`, etc. - for example a MIME type such as `produces=application/json`, or a `host:port` value) are no longer percent-encoded, as long as no key or value in the query needs a percent escape. A value with `=` or (for example `secretKey=abc/def==`) needs one, and the [...]
+#### Error handler - redelivery options of onException
-Code that asserts a literal, fully-normalized endpoint URI string containing one of those characters in a query value may need to update the expected string to the form described above.
+An `onException` that sets some of the redelivery options (such as `maximumRedeliveries`) now inherits the options it does not set from the error handler, as documented. Prior to Camel 4.23 (since Camel 3.17) the options it did not set were reset to their defaults: for example with `errorHandler(defaultErrorHandler().redeliveryDelay(0))` and `onException(IOException.class).maximumRedeliveries(3)`, the redeliveries were delayed 1 second each and not 0.
-### camel-core - double && in endpoint URIs
+#### Error handler - asynchronous delayed redelivery while stopping
-An endpoint URI containing `&&` is no longer rejected with `Invalid uri syntax: Double && marker found`. An empty query parameter, such as from `delay=250&&period=500`, is now ignored, so the URI is the same as `delay=250&period=500`. The old check also rejected a `&&` in the path of an endpoint, for example `language:simple:${header.a} == 1 && ${header.b} == 2`, which now works.
+With `asyncDelayedRedelivery` and `allowRedeliveryWhileStopping=false`, stopping the route (or Camel) now rejects a redelivery that is waiting for its delay, as it already did without `asyncDelayedRedelivery`: the exchange fails with a `RejectedExecutionException` (and goes to the dead letter channel, if one is configured) within a second. Prior to Camel 4.23 the stop waited for the whole redelivery delay (or until the shutdown timeout) and the message was then redelivered.
-### camel-core - masking of sensitive values in endpoint URIs
+#### Error handler predicates that throw an exception
-`URISupport.sanitizeUri()`, which masks secrets in endpoint URIs shown in logs, events, JMX names and error messages, now masks some values it used to miss, so the masked form of a URI can differ from earlier releases:
+When an `onWhen`, `handled`, `continued` or `retryWhile` predicate of `onException` (or `retryWhile` of the error handler) throws an exception during error handling, then the error handler now logs this at `WARN` level and regards the predicate as `false`:
-- option names are matched ignoring dashes, so `access-key` is masked like `accessKey`
-
-- a `RAW(…)` or `RAW{…}` value is masked up to the bracket that ends it, also when the value contains that bracket
-
-- the userinfo password of every URI in a text is masked, not only the last one
+- A failing `onWhen` means the `onException` does not match, so another `onException` (or the error handler itself) handles the exception instead. Previously the exception from the predicate escaped from the error handler.
-- the `Unknown parameters=[…]` message of an endpoint that cannot be created masks the values of sensitive parameters
+- A failing `handled`, `continued` or `retryWhile` means the exchange is not handled, not continued and not redelivered. The exchange is still processed by the `onException` outputs (or sent to the dead letter channel), and the original exception is kept as the exception, with the exception from the predicate attached as a suppressed exception. Previously the exception from the predicate replaced the original exception, and the `onException` outputs were skipped.
-The keywords added with `camel.main.additionalSensitiveKeywords` (or `URISupport.addSanitizeKeywords()`) now apply to every matching parameter, not only the first one, and they are added to the keywords configured earlier instead of replacing them. The keywords apply to the whole JVM and cannot be removed.
+#### Error handler onPrepareFailure that throws an exception
-`SensitiveUtils.maskUserInfoCredentials()`, used when masking log messages, uses the same userinfo rule: the userinfo ends at the last `@` before the path, so a password may contain `@`, and an `@` in the query of a URI is no longer taken as the end of a password.
+When the `onPrepareFailure` processor of the Dead Letter Channel or the Default Error Handler throws an exception, then the exchange is no longer sent to the dead letter queue (or failure processor) with that exception set on it. Instead, the exchange is not delivered, and with the Dead Letter Channel the new exception is handled according to `deadLetterHandleNewException` (by default `true`, so the exchange completes and a `WARN` is logged). With `deadLetterHandleNewException=false`, or [...]
-### camel-core - spaces inside quoted values are kept
+#### Error registry handled flag
-When a list of values is split, such as the parameters of a simple function (for example `${list(' a ','b')}`), the arguments of `camel-exec`, or the values of a `camel-sql` IN query, the spaces inside a quoted value were removed unless it was the last value. They are now kept for every value, so `${list(' a ',' b ')}` gives `" a "` and `" b "`, and the exec argument `"arg 0 "` is passed as \`arg 0 \` (with the trailing space). Spaces outside the quotes are still removed.
+The error registry (`ErrorRegistry`) now records whether an error was handled from the exchange itself. An exception that is processed by an `onException` without `handled(true)` is now recorded as not handled; previously any exception that was processed by an `onException` or a failure processor was recorded as handled.
-### camel-core - property placeholders in pollEnrich
+#### doTry, doCatch and doFinally enhancements
-Camel 4.22 stopped resolving property placeholders (`{{…}}`) on the _per-message evaluated_ recipient for `toD` and `enrich`, and said that aligning `pollEnrich` was deferred to a follow-up. This is that follow-up: a `{{…}}` token that appears only in the value produced at runtime by the `pollEnrich` expression is now treated as a literal part of the endpoint URI instead of being expanded.
+Route dumps now retain `doCatch` and `doFinally` blocks declared as properties of a `doTry` in YAML. Previously these blocks ran correctly but were omitted from the dumped route. If you compare or process route dumps, account for the previously missing exception-handling blocks in the output.
-Like `toD` and `enrich`, `pollEnrich` resolves its static endpoint URI at build time, so a placeholder belongs there:
+A `doTry` must have one or more `doCatch` or `doFinally` blocks, otherwise the route fails to start with `doTry must have one or more doCatch or doFinally blocks`. Previously such a `doTry` was accepted (which turned off the route error handler for its steps).
-```java
-.pollEnrich("file:{{inbox}}", 5000)
-```
+In the Java DSL, `onWhen` on a `doCatch` now only applies to that `doCatch`. Previously `onWhen` was set on every `doCatch` of the `doTry` (including the `doCatch` blocks of nested `doTry` blocks), so the `onWhen` of the last `doCatch` replaced the `onWhen` of the earlier `doCatch` blocks. Routes now behave as written.
-`recipientList`, `routingSlip` and `dynamicRouter` are unchanged. Their recipient is supplied entirely at runtime and may legitimately carry a placeholder that comes from configuration, so they continue to resolve `{{…}}` in the computed recipient.
+When an exception is thrown in a `doFinally` block while an exception from the `doTry` block is not handled, then the original exception is kept and the exception from the `doFinally` block is added as a suppressed exception. Previously the exception from the `doFinally` block was lost.
-### camel-core - a circular reference through an optional property placeholder is an error
+A nested `doTry` (or a `doTry` in a route called from a `doTry`) no longer ends the outer `doTry` block. Previously steps such as a `recipientList`, `multicast` or `split` after the nested `doTry` used the route error handler (such as redeliveries and the dead letter channel), instead of the `doCatch` of the outer `doTry`.
-A property placeholder that refers back to itself through an optional placeholder, such as `timeout={{?timeout:5000}}`, or two optional placeholders that refer to each other (`a={{?b}}` and `b={{?a}}`), now fail with the same `Circular reference detected` error as a circular reference through required placeholders. Before, resolving such a placeholder never returned, and the thread (for example the one starting the `CamelContext`) kept running at full CPU without any log. No configuratio [...]
+#### onException and doCatch configuration validated at route creation
-To take a value from somewhere else and otherwise a default, use another key for the override, such as `timeout={{?timeout.override:5000}}`.
+The `onWhen` predicate of an `onException` is now created when the route is created (as with `doCatch` and `onCompletion`), so an invalid `onWhen` expression now fails at startup, instead of when an exception occurs.
-### camel-support - property binding creates a nested list element at its index
+A class in `onException` or `doCatch` that is not an exception (such as `<exception>java.lang.String</exception>` in XML or YAML) now fails at startup. Previously it was accepted, and never matched any exception.
-When a property key goes through a list element that does not exist yet, such as `camel.beans.cluster.servers[1].host`, the element is now created at its index, and the list is padded with `null` up to that index, as a single key such as `names[3]=x` and an array property already did. Before, the new element was appended to the end of the list whatever its index was. So the keys of one element could end up on several elements, and a list of 11 or more nested elements lost some of them, b [...]
+#### bridgeErrorHandler no longer handles failed exchange twice
-A configuration that numbers its elements from 1, or leaves a gap, with one key per element, such as `servers[1].host=a` and `servers[2].host=b`, used to give a list without the gap (`[a, b]`). It now gives `[null, a, b]`. Number the elements from 0 without gaps, or make the code that uses the list skip `null` elements.
+With `bridgeErrorHandler=true`, an exchange that failed while being routed (and was already handled by the error handler of the route, such as an `onException` that does not mark it as handled) is no longer bridged to the error handler a second time. Previously the `onException` (and dead letter channel) of the route was invoked twice for the same failure, the second time with the message body replaced by the error message. The bridge error handler is only for errors that happen when the [...]
-The list key `last`, which was documented but failed with a `NumberFormatException`, now refers to the last element of a list (index 0 when the list is empty). Arrays still need a number.
+A query parameter named `hash` in an endpoint uri (such as `[http://host/path?hash=abc](http://host/path?hash=abc)`) is now kept as a regular parameter. Previously it was always removed (it is only used internally by the endpoint DSL to identify endpoints).
-### camel-core - XmlConverter SAX parser factory
+When both `bridgeErrorHandler=true` and `exceptionHandler` are configured on an endpoint, then `bridgeErrorHandler` is now used, as documented. Previously the `exceptionHandler` was used.
-`XmlConverter.createSAXParserFactory()` now also disables external parameter entities and external DTD loading:
+### camel-core - Languages and Expressions
-- `[http://xml.org/sax/features/external-parameter-entities](http://xml.org/sax/features/external-parameter-entities)` = `false`
-
-- `[http://apache.org/xml/features/nonvalidating/load-external-dtd](http://apache.org/xml/features/nonvalidating/load-external-dtd)` = `false`
-
+#### Simple language
-It previously set only `FEATURE_SECURE_PROCESSING` and `external-general-entities=false`, while `createDocumentBuilderFactory()` in the same class already blocked external resource resolution more thoroughly. Both factories are reachable from a converted message body — `toSAXSource` is a registered converter, and the SAXSource route is tried first for bodies reaching camel-xslt — so the two should not disagree.
+`${ }` may now hold a predicate, as the braces do in Jakarta EL, Groovy and a JavaScript template: `${body != null && body.size() > 0}` answers whether it matches, instead of being refused with _Operators go outside the function_. The form with the operators outside the braces (`${body} != null && ${body.size()} > 0`) means the same and is unchanged, and the ternary keeps working as before.
-Documents carrying an internal DTD subset still parse: `disallow-doctype-decl` is deliberately not set here, because that would reject input that parses today. Routes that genuinely need to resolve an external DTD or parameter entity through this converter must supply their own `SAXParserFactory`.
+An operator counts only when whitespace surrounds it outside quotes, so a name such as `${header.Content-Length}` and a pattern such as `${date:now:yyyy-MM-dd}` are read as they were. Only expressions that used to throw can now return a value: every one of the 804 distinct simple expressions in camel, camel-kamelets, camel-examples and camel-jbang-examples parses to what it parsed to before.
-### camel-core - type converter
+The simple language reads a `Map` with a dot as well as with a key: `${body.sku}` answers the `sku` entry of a map body when the map has no `sku()` method, the same value `${body[sku]}` gives. A method of the map still wins, so `${body.size}` calls `size()` as before, and a name that is neither a method nor a key still fails. Only expressions that used to throw can now return a value.
-Several bugs in the type converter have been fixed, and some of the fixes change behavior:
+The `range(max)` function now starts at 0, as documented and as `range` does in Python: `${range(5)}` returns `[0, 1, 2, 3, 4]` where it used to return `[1, 2, 3, 4]`. Routes that relied on the range starting at 1 must use `${range(1,5)}` instead. The two-argument form `range(min,max)` is unchanged.
-- Converting to a primitive type (such as `int.class`) now returns the matching wrapper type. Before, an `Integer` or `Long` value was returned as-is for any primitive type, so `convertTo(int.class, 5L)` returned a `Long`. For example, a bean method with an `int` parameter failed with `argument type mismatch` when the message body was a `Long`.
-
-- `tryConvertTo(boolean.class, value)` returns `null` instead of throwing an exception when the value cannot be converted.
-
-- When no type converter can convert a pair of types, the registry records a miss so it does not search for a converter again. Fallback type converters are now still tried for such a pair, because a fallback converter can convert depending on the value. Recorded misses are also cleared when a type converter or fallback type converter is added.
+A review of the simple language fixed a number of edge cases. These change what an existing expression returns:
+
+- `split` uses the separator as plain text, not as a regular expression: `${split(${body},'.')}` splits on dots (it used to return an empty array), and `${split(${body},'|')}` splits on the bar. A route that relied on a regular expression separator such as `'\s+'` must use `${body.split('\s+')}` instead.
-- When there is no type converter for the exact type of the value, the registry uses a type converter for a super type. This used to depend on the iteration order of an internal map, which could change between JVM restarts. The nearest super type now wins: the type hierarchy is walked breadth-first, interfaces are tried before the super class at each level, and `java.lang.Object` is tried last.
+- The elvis operator `?:` treats any numeric zero as falsy (such as `0L`, `0.0` or `BigDecimal.ZERO`), not only `0` as an `Integer`.
-- As a last resort (after the fallback type converters), the registry uses a type converter whose types are assignable to or from the requested types. When more than one type converter matched, this also depended on the iteration order of the internal map. The nearest one now wins (the fewest levels between its types and the requested types), and the class names of its types decide between equally near ones.
+- `++` and `--` keep decimals: `1.5` becomes `2.5` (it used to be `2.0`).
-- Converting a `String` to a `Number` now returns an `Integer` for all values within the `Integer` range (including `Integer.MAX_VALUE`, which returned a `Long` before), and supports exponent notation such as `1e5`.
+- `safeQuote` escapes double quotes, backslashes and control characters in the value, so the result is a valid JSON string. A `BigDecimal` is a number, so it is not quoted.
-- Converting a `BigDecimal`, or a `double` larger than a `long`, to `BigInteger` no longer loses precision.
+- `kindOfType` returns `object` for a `Map` (it used to return `array`).
-- A `String` or a `Number` can now be converted to `BigDecimal`. There was no such type converter before, so the conversion returned `null`: `${bodyAs(java.math.BigDecimal)}` was empty for a body of `"1000.01"`, and a bean method with a `BigDecimal` parameter could not be called with a `String` body. A `double` or `float` is converted from its decimal text, so `0.1` becomes `0.1`.
+- A name glued to a function prefix is an unknown function instead of being read as that function, such as `${headerfoo}` (which returned the header `foo`), `${uuidv7}` or `${exceptionInfo}`. Use `${header.foo}`.
-- Converting a `byte[]` to `char` no longer sign-extends bytes above 127.
+- A hidden file name has no extension: for `.bashrc` then `${file:name.ext}` is `null` (it used to be `bashrc`), and for `.route.yaml` then `${file:name.noext}` is `.route`. This comes from `FileUtil.onlyExt` and `FileUtil.stripExt`.
-- Converting a `String` to `ByteBuffer` now uses the charset from the `CamelCharsetName` header or exchange property (like the other converters), and falls back to the default charset.
+- The chain operator `~>` needs a space on both sides, as the other operators do, so `A~>B` is text.
-- Converting an array to a `Set` no longer returns a `List`.
+- Comparing two numbers of different types, such as a `Double` or `BigDecimal` header and an integer literal, no longer drops the decimals: `${header.amount} > 100` is `true` for a `BigDecimal` of `100.50` (it used to be `false`), `${header.price} == 2` is `false` for a `Double` of `2.5`, and `${header.price} range '1..2'` is `false` for `2.5`. The same applies to two `BigDecimal` or two `BigInteger` values, to a number compared with a numeric `String`, and to the Java DSL predicates s [...]
-- Enum conversion prefers a constant that matches exactly before matching case-insensitively.
+- Inside `${ }` the ternary `?` and `:` need whitespace around them, so `${bean:svc?method=at(10:30)}` is not a ternary.
-### camel-core - a failed route reload restores the previous routes
-
-When a route file is reloaded in dev mode (`camel run --dev`, or the route watcher reload strategy in general) and the new content fails to load, the routes that ran before are restored right away, without the routes of the failed file, and a WARN says so. Before, the previous routes stayed stopped until the next successful reload, so a mistake in one file left the application without routes. The failed file loads again on its next save. The `CamelContextReloadFailure` event and the relo [...]
-
-A project whose routes are all in one file is covered too: the content that last loaded is kept in memory, so the broken save goes back to the version that was running, and the log says how many routes came from it. The file on disk is untouched; its next save is loaded as usual.
-
-### camel-core - an exchange cut off by a route stop or reload is logged as one WARN line
+The simple catalog (`simple.json`) now spells these functions as they are written: `hostname` (was `hostName`), `exception.stacktrace` (was `exception.stackTrace`), `throwException(msg,type)` (was `throwException(type,msg)`, the order the function has always used), `not(exp)`, and `setAttachment(key,exp)`.
-When a route is stopped or reloaded (for example a save in `camel run --dev`) while an exchange is in flight, and the graceful shutdown times out, the exchange is cut off. The error handler logged this as a failed delivery: an ERROR with "Exhausted after delivery attempt", the message history and the stack trace of the `RejectedExecutionException`. It is now one line at WARN, "Exchange cut off …: its route is being stopped or reloaded" (or "the CamelContext is being stopped"), as nothin [...]
+#### Tokenize language
-### camel-core - RouteStoppingException for an exchange cut off by a stop
+- A message without a body (or a `source` that has no value) now has no tokens, the same as an empty body. Prior to Camel 4.23 the tokenizer failed with a `NullPointerException`.
+
+- `skipFirst` now also skips the first token in `xml` mode and in pair mode (`endToken`). Prior to Camel 4.23 the option was ignored in those modes.
+
+- In pair mode with `group` and `includeTokens`, the grouped pairs are now joined without a delimiter (as in `xml` mode), unless `groupDelimiter` is set. Prior to Camel 4.23 the start token was inserted between them, so a group of `<a>1</a>` and `<a>2</a>` became `<a>1</a><a><a>2</a>`. Without `includeTokens` the start token is still used as the delimiter between the grouped values.
+
+- A pair with the same start and end token is now refused when the route is created. Prior to Camel 4.23 it silently had no tokens.
+
-An exchange cut off because its route, or the CamelContext, is being stopped (a route stop, a route reload in dev mode, or the graceful shutdown timing out) now fails with the new `org.apache.camel.RouteStoppingException` instead of a plain `RejectedExecutionException`. It extends `RejectedExecutionException`, so an `onException(RejectedExecutionException.class)` or a catch of it still matches; a real rejection, a thread pool or a queue that is full, stays a plain `RejectedExecutionExcep [...]
+#### resolveResource option on expressions
-A `direct` producer that was waiting for a consumer when a forced stop interrupted it now sets a `RouteStoppingException` (with the `InterruptedException` as its cause) instead of a `DirectConsumerNotAvailableException`.
+Every expression has a new option `resolveResource` (default `false`). When `true` and the expression’s result is a String starting with `resource:`, the named resource is loaded and its content is the result, so a script can choose a file or a template per message and hand its content on:
-A `seda` or `disruptor` producer waiting for the reply (InOut, or `waitForTaskToComplete`) that is interrupted while its route or the CamelContext is being stopped now sets a `RouteStoppingException` (with the `InterruptedException` as its cause). Before, it set an `ExchangeTimedOutException` (or, without a timeout, the `InterruptedException`), although the timeout had not passed. An interruption at any other time sets the `InterruptedException` instead of an `ExchangeTimedOutException`. [...]
+```yaml
+- setBody:
+ expression:
+ groovy:
+ expression: "counter == 1 ? 'resource:file:order.json' : 'resource:file:order-bad-email.json'"
+ resolveResource: true
+```
-Such a cut-off is not recorded in the error registry, as nothing in the route failed; set `camel.errorRegistry.includeRouteStopping=true` to record it as well, for example to see how often stops cut off work that a consumer which does not roll back may lose.
+A name without a scheme, `resource:orderTemplate.json`, is a classpath resource. The loaded content is the final value and is not evaluated again. Nothing changes without the option: the `resource:` prefix on the expression text itself is resolved as before, and a returned value that happens to start with `resource:` stays as it is.
-### camel-core - stopping or removing all routes is one graceful shutdown
+#### Simple contains on collection and String compared with boolean
-`RouteController.stopAllRoutes()` and `removeAllRoutes()` (which a route reload in dev mode uses) stopped the routes one at a time, each as its own graceful shutdown. A route that consumes from another route, such as over `direct`, was then stopped as soon as its own exchanges had completed, while the route sending to it could still have work for it (a split, a loop). Those exchanges waited for the stopped route until the shutdown timeout, and were cut off. All the routes are now stopped [...]
+The `contains` operator of the simple language now type coerces each element of a collection, the same way it already did for an array. For example `${header.ids} contains '2'` is now `true` when the header is a `List` of the numbers 1, 2 and 3. With `ignoreCase` (the `~~` operator) an element of a collection must now be equal to the value (ignoring case), where previously it was enough for the element to contain the value as a substring, which was also not the case without `ignoreCase`.
-### camel-core - RoutesLoader.updateRoutes runs one call at a time
+A String is now only equal to a boolean when it is `true` or `false` (ignoring case). Previously any other String was equal to `false`, so `${body} == false` was `true` when the body was `hello`.
-Concurrent `RoutesLoader.updateRoutes` calls on one CamelContext now run one at a time instead of failing with `ConcurrentModificationException`. A route whose exchange calls `updateRoutes` while another `updateRoutes` call replaces that route now makes the stop wait until the shutdown timeout, after which the route is forced to stop.
+### camel-core - Message Headers and URIs
-### camel-core - the recursive file watcher watches directories created while it runs
+#### Message headers keep the case of their names
-The file watcher reload strategy (`camel run --dev`, the route watcher reload strategy with a recursive directory) registered the directory tree once at start: a directory created afterwards, such as `src/main/java/com/acme` for a Java class added to a running project, was never watched and its files never reloaded. A directory created under a watched one is now registered as it appears, with the files already in it reloaded. The watcher also ignores the compile work directory (`camel.ma [...]
+A header whose name is the name of a Camel constant in another case, such as `content-type` for `Exchange.CONTENT_TYPE` (`Content-Type`) or `camelfilename`, keeps the name it was set with, as it did in Camel 4.20 and older. From Camel 4.21 to 4.22 the header map stored such a header under the name of the constant, so a header set or received as `content-type` was sent on as `Content-Type`. Looking up a header is case-insensitive as before, and the first name a header is set with is the o [...]
-### camel-core, camel-resilience4j - a failure the circuit breaker’s fallback recovered from is recorded as handled
+#### Endpoint URI normalization is order-independent
-The error registry (`camel get errors`, the error dev console) recorded a call that failed inside a `circuitBreaker` and was answered by its `onFallback` as an error that was not handled, one per call, since the breaker runs the call on a copy of the exchange whose failure is reported before the fallback runs, and the breaker did not report the recovery. The breaker now emits the failure-handling and failure-handled events around the fallback, as `doCatch` does, and the registry marks th [...]
+`URISupport.normalizeUri()` computes the endpoint registry cache key so that two logically identical endpoint URIs (differing only in query parameter order) resolve to a single shared `Endpoint`. A fast-path optimization only re-encoded query parameter values when the parameter keys were **not** already in alphabetical order, so two semantically identical URIs could normalize to two different strings whenever a value needed encoding (for example a colon in a `host:port` value) - dependin [...]
-### camel-core - the type of a bean created by a script or a builder is optional
+Normalization is now always order-independent. As part of the fix, the encoding applied when rebuilding the query string is also less aggressive: characters that are legal unescaped in a URI query per RFC 3986 (`:`, `/`, `,`, `'`, etc. - for example a MIME type such as `produces=application/json`, or a `host:port` value) are no longer percent-encoded, as long as no key or value in the query needs a percent escape. A value with `=` or (for example `secretKey=abc/def==`) needs one, and the [...]
-The `type` (class name) of a bean definition — `bean` under `beans`, `templateBean` of a route template, `bean` of a templated route — is no longer declared as required. It was required since the attribute also selected how the bean is created; that moved to `scriptLanguage` in Camel 4.1, and a bean created by a script (`scriptLanguage` and `script`) or a builder (`builderClass`) needs no class name: the runtime registers it as the type of the object the script or builder returns, as the [...]
+Code that asserts a literal, fully-normalized endpoint URI string containing one of those characters in a query value may need to update the expected string to the form described above.
-The XML schemas (`camel-spring.xsd`, `camel-xml-io.xsd`) and the YAML schema no longer require `type`, so Spring XML and the YAML validator (`camel validate`) now accept what the runtime already ran. A bean that is neither scripted nor built still needs a `type`, and the error for a missing one is now an `IllegalArgumentException` naming the bean instead of a `NullPointerException`.
+#### Double && in endpoint URIs permitted
-### camel-core - a bean whose class has a builder() method is created via the builder
+An endpoint URI containing `&&` is no longer rejected with `Invalid uri syntax: Double && marker found`. An empty query parameter, such as from `delay=250&&period=500`, is now ignored, so the URI is the same as `delay=250&period=500`. The old check also rejected a `&&` in the path of an endpoint, for example `language:simple:${header.a} == 1 && ${header.b} == 2`, which now works.
-A bean declaration (`bean` under `beans` in YAML and XML, `templateBean` of a route template, `camel.beans.` in Camel Main, and a `#class:` value in property binding) whose class has no public no-arg constructor but a public static `builder()` or `newBuilder()` method is now created via that builder: the properties are set on the builder and the bean is created with the builder’s `build()` method (or its single public no-arg method that returns the type). This makes a class built by Lomb [...]
+#### Masking of sensitive values in endpoint URIs
-Such a declaration previously failed, as there was no constructor to call, so no working declaration changes behaviour: a class that has a public no-arg constructor is still created with the constructor, and `builderClass`, `factoryMethod` and `constructors` are used when given. `builderMethod` can now be set without `builderClass`, to name the method of an inferred builder.
+`URISupport.sanitizeUri()`, which masks secrets in endpoint URIs shown in logs, events, JMX names and error messages, now masks some values it used to miss, so the masked form of a URI can differ from earlier releases:
-A bean whose class has neither a public no-arg constructor nor a builder now fails with a message naming the ways it can be created (its constructors for `constructors`, its static factory methods for `factoryMethod`, or a builder class of its own), instead of the `NoSuchMethodException` or `IllegalAccessException` of the reflection call, and an unknown property of a bean created through its builder names the properties the builder and the bean accept. `camel validate` and the `camel_val [...]
+- option names are matched ignoring dashes, so `access-key` is masked like `accessKey`
+
+- a `RAW(…)` or `RAW{…}` value is masked up to the bracket that ends it, also when the value contains that bracket
+
+- the userinfo password of every URI in a text is masked, not only the last one
+
+- the `Unknown parameters=[…]` message of an endpoint that cannot be created masks the values of sensitive parameters
+
-`PropertyBindingSupport.setPropertiesOnTarget` now reports an unknown property with the property name and value, as it rethrew the `PropertyBindingException` with its null cause since 4.21, which surfaced as `NullPointerException: e`.
+The keywords added with `camel.main.additionalSensitiveKeywords` (or `URISupport.addSanitizeKeywords()`) now apply to every matching parameter, not only the first one, and they are added to the keywords configured earlier instead of replacing them. The keywords apply to the whole JVM and cannot be removed.
-### camel-core - Claim Check EIP - exchange copies get their own claim check repository
+`SensitiveUtils.maskUserInfoCredentials()`, used when masking log messages, uses the same userinfo rule: the userinfo ends at the last `@` before the path, so a password may contain `@`, and an `@` in the query of a URI is no longer taken as the end of a password.
-The Claim Check EIP keeps its claim checks in a repository that belongs to the exchange. The javadoc of `ClaimCheckProcessor` already says that the repository is "not shared among Exchanges", but a copy of an exchange used the same repository instance as the exchange it was copied from. This only happened when the exchange had used the Claim Check before the copy was made, because the repository is created on first use. The exchanges created by the Splitter, Multicast, Recipient List and [...]
+#### Spaces inside quoted values are kept
-Such a copy now gets its own copy of the repository. It starts with the claim checks of the parent, so a part can still get what the parent stored, but what a part stores, removes, pushes or pops is no longer visible to the parent or to the other parts. After a Multicast or Recipient List, the parent continues with the repository of the result exchange (the exchange that the aggregation strategy returned), as it already did for the other exchange properties.
+When a list of values is split, such as the parameters of a simple function (for example `${list(' a ','b')}`), the arguments of `camel-exec`, or the values of a `camel-sql` IN query, the spaces inside a quoted value were removed unless it was the last value. They are now kept for every value, so `${list(' a ',' b ')}` gives `" a "` and `" b "`, and the exec argument `"arg 0 "` is passed as \`arg 0 \` (with the trailing space). Spaces outside the quotes are still removed.
-### camel-core - Splitter unwraps Exchange parts
+#### Invalid time patterns in options are rejected
-The Splitter EIP now unwraps parts of type `org.apache.camel.Exchange`, the same way it already unwrapped parts of type `org.apache.camel.Message`. When splitting a body of type `List<Exchange>`, as produced by the camel-kafka batching consumer (`batching=true`) and by the grouped exchange aggregation strategy, each child exchange now carries the body and the headers of the corresponding part. Previously the child body was the part `Exchange` itself, with no headers.
+Numeric options such as `period`, `delay` or `timeout` accept a time pattern such as `5s` or `1h30m`. An invalid value is now rejected with an error when the endpoint is created. Previously it was silently turned into `0` (or only a part of it was used), so a typo such as `period=five` or `period=1m30` configured a period of `0` or `60000` without any warning. The unit is now case-insensitive (`5S` is 5 seconds) and a negative time pattern such as `-5s` is kept as a negative value. A tim [...]
-Code that read the part from the child body must be updated, for example when performing a Kafka manual commit after a split:
+#### Simple normalizeWhitespace turns tabs and new lines into space
-```java
-// before
-KafkaManualCommit manual = exchange.getMessage().getBody(Exchange.class)
- .getMessage().getHeader(KafkaConstants.MANUAL_COMMIT, KafkaManualCommit.class);
+The Simple function `${normalizeWhitespace()}` now turns every run of whitespace (including tabs and new lines) into a single space. Previously only runs of spaces were collapsed and a tab or new line was kept as-is.
-// now
-KafkaManualCommit manual = exchange.getMessage().getHeader(KafkaConstants.MANUAL_COMMIT, KafkaManualCommit.class);
-```
+#### Header names are matched in any case
-The message of the part is copied into the child exchange, so the exchanges in the original list are left untouched and remain usable after the split, for example by the batching consumer that owns them. Exchange properties of the part are not carried over to the child exchange, as is already the case for `Message` parts.
+Message headers are case-insensitive, and components now also match the header names they look for in any case:
-### camel-util - retainAll on the key set of the message headers ignores case
+- camel-jms, camel-sjms: a standard JMS header set with another case, such as `jmscorrelationid` or `JMSTYPE`, now sets the JMS header (such as the correlation id). Previously it was sent as a JMS property with that name.
+
+- camel-cxf: a `content-type` or `camelhttpresponsecode` header is used as the content type or response code of the CXF message, as `Content-Type` and `CamelHttpResponseCode` are.
+
+- camel-tracing, camel-telemetry, camel-netty-http: a header whose name starts with `Camel` in any case (such as `camelFoo`) is treated as a Camel header.
+
-`retainAll` on the key set of `CaseInsensitiveMap`, and so on `exchange.getMessage().getHeaders().keySet()`, now keeps a key when the given collection holds its name in any case, as lookups do. For example `headers.keySet().retainAll(List.of("accept"))` now keeps the `Accept` header. Prior to Camel 4.23 the names were compared case-sensitively, and such a call removed `Accept`. To keep headers by their exact name, remove the others explicitly, for example with `headers.keySet().removeIf( [...]
+### camel-core - Rest DSL
-### camel-core - Idempotent Consumer no longer stops its repository when the route is stopped
+#### Rest DSL response Content-Type
-Stopping a route with an Idempotent Consumer (for example with `stopRoute` on the route controller, over JMX, or when a supervising route controller restarts the route) used to stop the idempotent repository as well. The in-memory repositories clear their data when stopped: `MemoryIdempotentRepository`, and a `KeyValueIdempotentRepository` over a `MemoryKeyValueRepository`, which clears the whole store. A repository that other routes were still using was therefore wiped, and so was the d [...]
+Under json or xml binding, a response without a Content-Type header again takes it from the `produces` of the rest verb, as before Camel 4.18.4 and 4.22.0. Those releases used `application/json` (or `application/xml`) whenever the binding mode allowed it and marshalled the body, so a verb producing `text/plain` answered with a json-quoted body and a binary body failed. When `produces` lists several media types, the first json (or xml) type is used, otherwise the first one. Wildcards such [...]
-The repository is now only stopped when the route is removed or when `CamelContext` is stopped. A route that is stopped and started again therefore keeps the message ids that its in-memory repository has seen, and a repository backed by a remote store keeps its connection while the route is stopped. To forget the ids, clear the repository with `IdempotentRepository.clear()` (or the `clear` JMX operation of the Idempotent Consumer).
+#### Rest DSL - consumes and produces from the binding mode of the rest configuration
-### camel-core - a graceful shutdown waits for the parallel onCompletion tasks
+When a verb has `type` or `outType` and the binding mode is `json`, `xml` or `json_xml`, the verb’s `consumes` and `produces` are set to the matching media types if they are not already set. This now also happens when the binding mode is only set with `restConfiguration()`, as it already did when it is set on the `rest` or the verb. With `clientRequestValidation` enabled, such a verb now rejects a request with another `Content-Type` (415) or `Accept` (406) header.
-With `onCompletion().parallelProcessing()`, stopping or suspending a route (and stopping `CamelContext`) now waits for the onCompletion tasks that are running or queued in its thread pool, up to the shutdown timeout, just as it waits for the inflight exchanges. Previously the shutdown did not wait for them, and when the thread pool was shut down, the queued tasks were dropped and the running ones were interrupted.
+#### Rest DSL - client validation, verb ids and inlined routes
-An onCompletion with `parallelProcessing` that synchronously stops its own route now waits for itself until the shutdown timeout occurs, and the route is then stopped forcibly. Stop the route asynchronously instead, for example from a separate thread or with the Control Bus `async=true` option.
+- `clientResponseValidation` now also validates the response when the binding mode is `off`, the response has no body, or binding was skipped because of an error code (`skipBindingOnErrorCode`). Before, the response was only validated after the body was marshalled.
+
+- The headers of a `responseMessage` are only required on the responses with that code (or on the responses of the `default` response message when the code has none). Before, the headers of all the response messages were required on every response.
+
+- A verb with `type` gets a body parameter that is required (unless the body parameter, whatever its name, is declared with `required=false`). With `clientRequestValidation` enabled, a request without a body is now rejected (400), as the body was already marked as required in the OpenAPI specification.
+
+- Two verbs with the same `id` now fail with a duplicate route id error. Before, the second verb silently got a generated route id. A verb with the same `id` as a route that is not a rest verb (such as the `direct` route it calls) still gets a generated route id, as before.
+
+- A `direct` route that more than one rest service calls is no longer inlined (with `inlineRoutes` enabled, which is the default). It stays a route of its own, and the rest services call it. Before, its outputs were inlined into all the rest services, which then shared the same EIP definitions.
+
-### camel-jta, camel-spring - a transacted exchange that completes during a graceful shutdown is committed
+#### REST client request validation and binary bodies
-Since Camel 4.19, a transacted exchange (JTA or Spring transacted routes) that was in flight when a graceful shutdown (stopping `CamelContext` or a route) started was rolled back even when it completed within the shutdown timeout. It is now committed again. Only the forced shutdown after the timeout marks the in-flight transacted exchanges for rollback; with `shutdownNowOnTimeout=false` there is no forced shutdown, so an exchange completing after the timeout is committed.
+When `clientRequestValidation` is enabled and the REST service declares a required body, the incoming message body is no longer replaced with a `String` version of itself. That conversion corrupted binary payloads such as `application/octet-stream`. The body is still read to check that it is present, using stream caching so it stays re-readable, but it now keeps its original type.
-### camel-seda, camel-disruptor - a message that is not queued completes its own exchange
+#### required attribute on rest param and route template parameter is String
-When the SEDA producer does not add an InOnly message to the queue, because it is discarded (`discardWhenFull=true`) or adding it fails (the queue is full, the `offerTimeout` elapses, or the producer is interrupted), the on completions of the exchange now run when the exchange is done. The same applies to the Disruptor producer when the ring buffer is full (with `blockWhenFull=false`) or the Disruptor is not started. Previously they had been handed over to the copy of the exchange that w [...]
+`ParamDefinition.required` (the rest DSL `param`) and `RouteTemplateParameterDefinition.required` (the `templateParameter` of a route template) are now declared as `String` instead of `Boolean`, the same way nearly every other scalar attribute in the Camel model is declared. This allows a property placeholder to be used, which is resolved when the route starts:
-Now a discarded message is committed like any other message whose route completed (for example the file consumer moves or deletes the file), and a message that could not be added is rolled back, so the consumer can pick it up again.
+```yaml
+- routeTemplate:
+ id: myTemplate
+ parameters:
+ - name: greeting
+ required: "{{myRequiredFlag}}"
+ from:
+ uri: direct:start
+ steps:
+ - log:
+ message: "{{greeting}}"
+```
-### Component deprecation
+Before this change the value was converted to a `Boolean` while the route was being loaded, so `required: "{{myRequiredFlag}}"` silently evaluated to `false` instead of resolving the placeholder.
-#### camel-minio
+The accessors changed accordingly:
-The Minio GitHub repository has been archived on the 25th April 2026. The container images were removed from Docker Hub on September 2026.
+- `ParamDefinition.getRequired()` and `setRequired(…)` now use `String` instead of `Boolean`.
+
+- `RouteTemplateParameterDefinition.getRequired()` and `setRequired(…)` now use `String` instead of `Boolean`. `isRequired()` is unchanged and still returns `boolean`, but it does not resolve property placeholders — use `CamelContextHelper.parseBoolean(camelContext, getRequired())` where a `CamelContext` is available.
+
-MinIO is S3-compatible, so existing deployments can migrate to the `camel-aws2-s3` component by pointing it at the MinIO server, for example: `aws2-s3://mybucket?overrideEndpoint=true&uriEndpointOverride=http://localhost:9000&forcePathStyle=true&accessKey=…&secretKey=…`
+The fluent builder `ParamDefinition.required(Boolean)` is unchanged, and a `required(String)` overload was added for placeholders. Routes written in XML, YAML or the Java DSL do not need any change.
-### camel-sjms - request/reply completes the exchange once when the send fails
+### camel-core - Route Templates and Route Configurations
-When the send of an InOut message fails, the pending reply is now cancelled, so the request timeout no longer completes the exchange a second time with an `ExchangeTimedOutException` after it has already failed with the send exception. When the send fails after the request timeout, or the reply, has already completed the exchange (for example a send that blocks longer than `requestTimeout` and then fails), the exchange keeps the outcome of the timeout or the reply, and the send failure i [...]
+#### routeConfiguration named onCompletion fires once per exchange in Java DSL
-`org.apache.camel.component.sjms.reply.ReplyManager` has a new default method `boolean cancelCorrelationId(String)`, which `ReplyManagerSupport` implements. A custom `ReplyManager` implementation that does not override it keeps the previous behaviour.
+In the Java DSL, `routeConfiguration("myconfig").onCompletion()` previously set `routeScoped=false` unconditionally, which caused the `onCompletion` to be skipped when the opted-in route was called indirectly (for example via `direct:` from a REST DSL consumer route).
-### camel-sjms - suspending a route stops the consumer
+The behavior is now corrected: a named route configuration (`routeConfiguration("id")`) keeps `routeScoped=true` so that the `onCompletion` fires correctly regardless of which route is the actual consumer. A per-exchange deduplication key ensures the `onCompletion` fires exactly once per exchange, even when multiple routes opt in to the same named configuration, or when the opted-in route is called several times in the same exchange.
-A suspended sjms (or sjms2) consumer used to keep receiving and routing messages, also during a graceful shutdown and under route policies such as `ThrottlingInflightRoutePolicy`. It now stops the JMS connection of its listener container shortly after the suspend (the connection is stopped by another thread), and starts it again on resume. Messages that the JMS client has already prefetched are delivered after the resume. A connection factory that shares one connection and does not stop [...]
+If your application relied on the (broken) behavior where `onCompletion` was silently skipped for named configurations in indirect call chains, you may now observe it firing where it did not before.
-### camel-tika
+#### Route templates
-The Tika dependency has been upgraded from 3.x to 4.x. Tika 4 removed the `TikaConfig` class and XML configuration support in favor of `TikaLoader` and JSON configuration. Consequently, the deprecated `tikaConfig` and `tikaConfigUri` options have been removed. Use `tikaLoader` to provide an `org.apache.tika.config.loader.TikaLoader`, or `tikaConfigFile` to load a JSON configuration file. Applications using either removed option must migrate their Tika configuration; see the [Tika 4 migra [...]
+- When both the route template (`configure`) and the `TemplatedRouteBuilder` (`configure`) have a configurer, then both are now called (the template first). Prior to Camel 4.23 only the configurer of the template was called.
+
+- Two routes created from a template with the same `prefixId` and a hardcoded node id are now reported as a duplicate id. Prior to Camel 4.23 they were accepted, and both processors had the same id at runtime.
+
+- A hardcoded node id in a route template no longer clashes with the same id in a regular route, as the ids of the route created from the template are prefixed.
+
+- A bean bound by `TemplatedRouteBuilder.bean` or in a `templatedRoute` is now used instead of a `templateBean` with the same name, which is no longer created. Prior to Camel 4.23 the template bean replaced it when both had the same type, and was used when the route looked the bean up by the type of the template bean (such as `process("myBean")`). When the same `RouteTemplateContext` is reused for several `addRouteFromTemplate` calls, the template beans bound for the first route are no [...]
+
-### camel-main / camel-platform-http-main
+##### A route id that is already used (Breaking change)
-When `camel.server.staticSourceDir` is configured, static files from the file system are now resolved relative to that directory instead of first checking the process working directory. The configured directory is authoritative, and a path that resolves outside it is rejected. Classpath lookup remains unchanged.
+Creating a route from a route template (`TemplatedRouteBuilder`, `templatedRoute`, `addRouteFromTemplate`, or a Kamelet endpoint with a route id) with the id of an existing route that was not created from the same template (a regular route, or a route from another template or Kamelet) now fails with `FailedToCreateRouteFromTemplateException`. For a Kamelet endpoint this exception is wrapped in a `FailedToCreateKameletException`. Prior to Camel 4.23 the existing route was removed and repl [...]
-Applications that relied on a file in the process working directory taking precedence over the configured `staticSourceDir` should move that file into the configured directory. Applications without a configured `staticSourceDir` are unaffected.
+An existing route that was created from the same template is still replaced, as before. This is how the route of a Kamelet endpoint with a route id is created again when its parent route is updated (for example by a route reload), and how a route from a template is updated with other parameters.
-### camel-a2a - webhook URL address classification
+### camel-core - Security and JSSE
-Push notification webhook URLs are now classified by the address the host resolves to, using the same rules whether the host is written as an IP literal or as a name. Previously a few ranges were recognised only in literal form, and host names were partly classified by how they were spelled.
+#### XmlConverter SAX parser factory external entity disabling
-Webhook URLs are now rejected when the host resolves into any of the following, in addition to the loopback, wildcard, link-local and site-local ranges that were already rejected:
+`XmlConverter.createSAXParserFactory()` now also disables external parameter entities and external DTD loading:
-- IPv6 unique local addresses, `fc00::/7`
-
-- IPv4-compatible IPv6 addresses, `::a.b.c.d`, when the embedded IPv4 address is itself non-global
-
-- NAT64 addresses under the well-known prefix `64:ff9b::/96`, when the embedded IPv4 address is itself non-global
-
-- 6to4 addresses under `2002::/16`, when the embedded IPv4 address is itself non-global
+- `[http://xml.org/sax/features/external-parameter-entities](http://xml.org/sax/features/external-parameter-entities)` = `false`
-- The shared address space used for carrier-grade NAT, `100.64.0.0/10`
+- `[http://apache.org/xml/features/nonvalidating/load-external-dtd](http://apache.org/xml/features/nonvalidating/load-external-dtd)` = `false`
-NAT64 and 6to4 addresses carrying a globally routable IPv4 address remain allowed, so an IPv6-only deployment can still reach public webhook endpoints through a translation prefix.
-
-In the other direction, host names are no longer rejected on the basis of their spelling. Names beginning with `fc` or `fd`, such as `fcm.googleapis.com`, were previously refused because those are the leading hex digits of the IPv6 unique local prefixes; they are now resolved and classified like any other name.
+It previously set only `FEATURE_SECURE_PROCESSING` and `external-general-entities=false`, while `createDocumentBuilderFactory()` in the same class already blocked external resource resolution more thoroughly. Both factories are reachable from a converted message body — `toSAXSource` is a registered converter, and the SAXSource route is tried first for bodies reaching camel-xslt — so the two should not disagree.
-Set `allowLocalWebhookUrls=true` to permit loopback targets during local development. That option is unchanged and still does not permit any of the ranges above.
+Documents carrying an internal DTD subset still parse: `disallow-doctype-decl` is deliberately not set here, because that would reject input that parses today. Routes that genuinely need to resolve an external DTD or parameter entity through this converter must supply their own `SAXParserFactory`.
-### camel-ai-observability (GenAI observability)
+#### JSSE utility (SSLContextParameters) filter and SNI improvements
-LangChain4j, OpenAI, and Spring AI chat (`spring-ai-chat`) producers now emit GenAI observability data (OpenTelemetry span attributes and Micrometer metrics) when `camel-opentelemetry2` and/or `camel-micrometer` is on the classpath. Disable globally with `camel.aiObservability.enabled=false` (default is enabled). Camel Main also exposes the same setting via `main.configure().aiObservability().withEnabled(false)`.
+A filter (such as `cipherSuitesFilter` or `namedGroupsFilter`, or `camel.ssl.cipherSuitesExclude` and `camel.ssl.namedGroupsExclude`) with only exclude patterns now includes all the other available values. Previously it included nothing, which made every TLS handshake fail (for example `camel.ssl.namedGroupsExclude = X25519MLKEM768`, which is the documented way to disable the post-quantum named groups). A filter with no patterns at all still includes nothing.
-When a non-NOOP `ObservationRegistry` is bound in the Camel registry, GenAI client calls are recorded as Micrometer Observations (`gen_ai.client.operation`). Camel then skips the `camel-telemetry` CLIENT span and the direct `gen_ai.client.operation` timer. Traces and the operation timer appear only if the registry has tracing and meter handlers respectively. Token usage counters still use `MeterRegistry`. Applications without an `ObservationRegistry` bean keep the previous OpenTelemetry [...]
+On JVMs that do not provide their default signature schemes (such as JDK 25 and older) a `signatureSchemesFilter` (or `camel.ssl.signatureSchemesInclude`/`signatureSchemesExclude`) is no longer applied (a WARN is logged) and the defaults of the JVM are used. Previously an empty list of signature schemes was configured, which made every TLS handshake fail. Configure the signature schemes explicitly instead.
-`GenAiUsage` token fields (`inputTokens`, `outputTokens`) are `Long` so OpenAI and other providers that report `long` token counts are recorded without lossy casts.
+The SNI host names of the client parameters are now also set on the `SSLEngine` (used by components such as camel-netty). Previously they were only set on an `SSLSocket`.
-OpenAI streaming chat sets `stream_options.include_usage=true` only when GenAI observability is enabled, adding a final chunk with token usage for span/metric recording.
+#### Default TLS protocols and cipher suites of SSLContextParameters
-OpenAI `embeddings`, `moderation`, and `responses` producers emit GenAI spans with the same attribute keys as `chat-completion`. Moderation records model metadata only (no token usage). Embeddings records input tokens when the API returns usage.
+The default secure socket protocols filter of `SSLContextParameters` now also excludes `TLSv1` and `TLSv1.1` (so `TLSv1.2` is the minimum), and the default cipher suites filter also excludes the `3DES` cipher suites. The default filters of an `SSLServerSocket` are now applied over the default (enabled) protocols and cipher suites of the JVM, as they already were for an `SSLSocket` and `SSLEngine`. Previously they were applied over all the supported protocols and cipher suites, which enab [...]
-LangChain4j components also expose request model names on new exchange headers (`CamelLangChain4j*RequestModel`). The response model header (`CamelLangChain4j*ResponseModel`) is set when the underlying client exposes it (for example langchain4j-chat); the agent and embeddings producers omit it when unavailable. See [AI Observability](../components/next/others/ai-observability.md) for metric names and span attributes.
+To use an older protocol (not recommended) configure it explicitly using `secureSocketProtocols`.
-### camel-openai (LLM scheme alias)
+### camel-core - type converter
-The `camel-openai` component now registers the `llm` URI scheme alongside the existing `openai` scheme. Both schemes use the same component implementation and Maven artifact (`camel-openai`).
+Several bugs in the type converter have been fixed, and some of the fixes change behavior:
-- New routes should prefer `llm:chat-completion` (and other `llm:` operations) for discoverability.
+- Converting to a primitive type (such as `int.class`) now returns the matching wrapper type. Before, an `Integer` or `Long` value was returned as-is for any primitive type, so `convertTo(int.class, 5L)` returned a `Long`. For example, a bean method with an `int` parameter failed with `argument type mismatch` when the message body was a `Long`.
-- Existing routes using `openai:chat-completion` continue to work unchanged.
+- `tryConvertTo(boolean.class, value)` returns `null` instead of throwing an exception when the value cannot be converted.
-- Component configuration properties accept both prefixes: `camel.component.llm.` **and `camel.component.openai.`** create independent component instances when both are set.
+- When no type converter can convert a pair of types, the registry records a miss so it does not search for a converter again. Fallback type converters are now still tried for such a pair, because a fallback converter can convert depending on the value. Recorded misses are also cleared when a type converter or fallback type converter is added.
+
+- When there is no type converter for the exact type of the value, the registry uses a type converter for a super type. This used to depend on the iteration order of an internal map, which could change between JVM restarts. The nearest super type now wins: the type hierarchy is walked breadth-first, interfaces are tried before the super class at each level, and `java.lang.Object` is tried last.
+
+- As a last resort (after the fallback type converters), the registry uses a type converter whose types are assignable to or from the requested types. When more than one type converter matched, this also depended on the iteration order of the internal map. The nearest one now wins (the fewest levels between its types and the requested types), and the class names of its types decide between equally near ones.
+
+- Converting a `String` to a `Number` now returns an `Integer` for all values within the `Integer` range (including `Integer.MAX_VALUE`, which returned a `Long` before), and supports exponent notation such as `1e5`.
+
+- Converting a `BigDecimal`, or a `double` larger than a `long`, to `BigInteger` no longer loses precision.
+
+- A `String` or a `Number` can now be converted to `BigDecimal`. There was no such type converter before, so the conversion returned `null`: `${bodyAs(java.math.BigDecimal)}` was empty for a body of `"1000.01"`, and a bean method with a `BigDecimal` parameter could not be called with a `String` body. A `double` or `float` is converted from its decimal text, so `0.1` becomes `0.1`.
+
+- Converting a `byte[]` to `char` no longer sign-extends bytes above 127.
+
+- Converting a `String` to `ByteBuffer` now uses the charset from the `CamelCharsetName` header or exchange property (like the other converters), and falls back to the default charset.
+
+- Converting an array to a `Set` no longer returns a `List`.
+
+- Enum conversion prefers a constant that matches exactly before matching case-insensitively.
-Java packages, exchange headers (`CamelOpenAI*`), and the Maven artifact id are unchanged.
-
-See [LLM Component](../components/4.22.x/openai-component.md) for details.
+### camel-couchbase
-### camel-archetypes
+The `connectTimeout` option is now applied. It previously sat inside a condition that tested `queryTimeout`, so setting it on its own had no effect and the documented default of 30000 ms never reached the SDK - connections used the Couchbase SDK’s own default of 10 seconds instead. Deployments that relied on that 10 second behaviour without setting the option should now set `connectTimeout=10000` explicitly.
-The Camel Maven archetypes now generate a `README.md` instead of the previous `ReadMe.txt`, with the content rewritten in Markdown and the documentation links updated. Each generated project also gets an `AGENTS.md` file with guidance for AI coding assistants, pointing at the Apache Camel LLM index (`/llms.txt`), the Camel CLI and the Camel MCP server.
+`queryTimeout` is unchanged: it is still only applied when set to something other than its default, because the documented 2500 ms default is much shorter than the SDK’s 75 seconds and applying it unconditionally would cut short queries that currently succeed.
-The `camel-archetype-api-component` archetype also generates its readme again: the file was declared in the wrong file set and was therefore silently skipped.
+The consumer now reports a failed exchange through its exception handler, which logs a warning naming the endpoint, as `TimerConsumer` does. Previously the consumer discarded the outcome of routing entirely and went on to the next poll as if the exchange had been delivered.
-### camel-bean - parameter values in the method name
+This is not a change to error handling. An exchange that failed while being routed has already passed through the route’s error handler, which logs the exhausted failure, and `BridgeExceptionHandlerToErrorHandler` deliberately falls back to its logging handler for such an exchange rather than bridging it a second time. What changes is that the consumer itself no longer stays silent.
-A parameter value in the method name that is a Simple expression, such as `bean(MyBean.class, "process(${body})")` or `to("bean:foo?method=check(${header.ETag})")`, is now passed to the method as-is. Previously, when the value was a String that started and ended with the same quote (single or double), the quotes were removed, and a value that was the text `null` was passed as a Java `null`. For example the `ETag` value `"33a64df5"` was passed as `33a64df5`.
+#### useView=true with fullDocument=false
-Quoted String parameters such as `process('World')` still have their quotes removed, and the parameter `null` still passes `null`, as before. An expression that evaluates to `null` also still passes `null`. If a method relied on the old behavior for a value from an expression, then it must remove the quotes, or check for the text `null`, itself.
+With `useView=true` and `fullDocument=false` the message body is now the value the view emitted for the row, or `null` when the view emitted no value. It used to be a `java.util.Optional` holding that value. A route that unwrapped the `Optional` itself must now use the body directly.
-### camel-debezium-oracle (breaking change)
+#### consumerProcessedStrategy=delete
-The parameters `logMiningBufferEhcacheRollbacksConfig`, `logMiningBufferInfinispanCacheRollbacks` have been removed due to the upgrade of Debezium to 3.6.3.Final.
+With `consumerProcessedStrategy=delete` the consumer now removes a document once its exchange has completed successfully. It used to remove every document of a poll while building the exchanges, before any of them was handed to the route, so the document was gone even when its exchange failed, and also when it was never handed to the route at all, because the consumer was stopping or the poll returned more rows than `maxMessagesPerPoll`.
-### camel-docling
+A document whose exchange fails, and a document that was not handed to the route, are now kept and consumed again by a later poll. A route that fails for the same document every time therefore receives it on every poll; handle the failure in the route (for example with a dead letter channel or a handled `onException`) so that the exchange completes and the document is removed. While the route runs, the document is still in the bucket. A failure to remove the document is reported through [...]
-A `String` message body is no longer interpreted as a location by default. Previously the producer inspected the body and, when it started with `http://` or `https://`, handed it to Docling as a remote URL to fetch; when it started with `/` or contained `\`, it read it from the local filesystem; otherwise it converted it as document content.
+If the route hands the exchange over to another thread (for example `seda` with `waitForTaskToComplete=Never`, or an asynchronous producer), the document is removed when that exchange completes, which can be after the next poll. Until its exchange has completed or failed, a document is skipped by later polls of the same consumer, so it is not delivered twice, in the same way as the in-progress repository of the file and aws2-s3 consumers. A skipped document does not count towards `maxMes [...]
-The two location readings must now be enabled explicitly:
+A view or SQL++ query that returns several rows for one document (for example a view that emits one row per element of an array in the document) now delivers only the first of these rows with `consumerProcessedStrategy=delete`: the document is in progress from its first row on, so its other rows are skipped, and once that exchange has completed the document is removed. Previously the first row removed the document while the poll was built, and the next row of the same document failed to [...]
-- `allowUrlSource` (default `false`) - interpret a body starting with `http://` or `https://` as a URL.
-
-- `allowFilePathSource` (default `false`) - interpret a body starting with `/`, or containing `\`, as a local file path. This also covers the single directory-or-file `String` body accepted by the batch operations.
-
+### camel-crypto
-A route that passes the document itself in the body is unaffected. A route that passes a URL or a path in the body must set the matching option, otherwise the exchange fails with an `IllegalArgumentException` naming the option to enable.
+Three changes to `CryptoDataFormat`, none of which affects the format of data already written.
-The `CamelDoclingInputFilePath` header is unchanged and still accepts a path without any opt-in, as are `File`, `byte[]` and `InputStream` bodies and the explicit path collections (`List<String>`, `String[]`, `List<File>`, `File[]`) used by the batch operations.
+**A per-message initialization vector when inlining.** `marshal` used to throw `Inlining cannot be performed, as no initialization vector was specified` when `shouldInlineInitializationVector` was set without a statically configured vector — which pushed routes into reusing one vector for every message, the thing inlining exists to avoid. A fresh vector is now generated per message when none is supplied. Because the vector is written into the message, readers pick it up from the stream a [...]
-A new `inputBaseDirectory` option is also available. When set, every local input path - from the header, from a file path body, and from the batch operations - must resolve inside that directory once normalized. It is unset by default, which keeps the previous behaviour of accepting any path.
+**Authentication failures report uniformly.** A tampered message previously surfaced two distinguishable outcomes: `Given final block not properly padded` from the cipher, or `Expected mac did not match actual mac` from the MAC check. A caller able to submit ciphertext and observe which one came back can use that distinction to recover plaintext. Both now report `Message authentication failed`, and the message no longer includes the expected and computed MAC values — the computed one is [...]
-Additionally, a local input path that does not exist is now reported as a `File not found` `IOException` before Docling is invoked. Previously the size check silently skipped a path that resolved to nothing and the failure surfaced later, from the Docling process or API call.
+**The inlined vector length is bounded.** The length prefix is read from the message and used to size an allocation; a declared length outside 0–1024 is now rejected instead of attempted.
-The `CamelDoclingOutputFilePath` header, which selects the CLI output directory, is now normalized lexically (redundant separators and `.`/`..` segments are resolved) before it is passed to Docling; a header value without such segments is still used as given. A new `outputBaseDirectory` option additionally confines the header the same way `inputBaseDirectory` confines input paths - when set, an output path that resolves outside it, including an absolute path, is rejected with an `IOExcep [...]
+Not changed: the HMAC key is still derived from the same key material as the cipher. Separating them would change the MAC written into the message and so could not be read by earlier versions; that is tracked separately.
-### camel-azure-eventgrid
+### camel-crypto-pgp
-The `CamelAzureEventGridDataVersion` header (`EventGridConstants.DATA_VERSION`) has been removed. The component publishes events in the CloudEvents schema, which has no `dataVersion` attribute (that field belongs to the legacy Event Grid event schema), so the header was read but never applied to the published event. Remove any use of that header; there is no CloudEvents equivalent.
+The `pgp` data format verifies a message’s modification detection code only when the message is an OpenPGP symmetrically encrypted **integrity protected** data packet:
-### camel-hivemq
+```java
+if (pbe.isIntegrityProtected()) {
+ if (!pbe.verify()) {
+ throw new PGPException("Message failed integrity check");
+ }
+}
+```
-The `ssl` option is now marked `insecure:ssl`, so setting it to `false` in the configuration is reported by the [security policy](security-policy.md) check: a warning by default, and a startup failure with the `prod` profile or `camel.security.insecureSslPolicy = fail`.
+The older symmetrically encrypted data packet carries no such code, so a message using it skipped the check entirely. Because the packet type is chosen by whoever produced the message, that left the sender — or anyone able to rewrite the message in transit — deciding whether the check applied. The existing `integrity` option governs marshalling only and has no decrypt-side counterpart.
-This applies only to `camel-hivemq`: setting `ssl=false` on the other components that have an `ssl` option (such as `camel.component.netty.ssl = false`) is not reported, see the `camel-main` section about the security policy check below. To keep `camel.component.hivemq.ssl = false` under a `fail` policy, list it in `camel.security.allowedProperties`.
+A new `requireIntegrityProtection` option, **defaulting to `true`**, now rejects a message that is not integrity protected. Routes that must interoperate with a sender still emitting the legacy packet have to set `requireIntegrityProtection=false` explicitly.
-### camel-debezium-mongodb
+Note that `signatureVerificationOption` still defaults to `optional`, which accepts a message carrying no signature at all. Set it to `required` where the sender is expected to sign; the two options together are what give a decrypted message authenticity as well as confidentiality.
-The `mongodbSslInvalidHostnameAllowed` option is now marked `insecure:ssl`. The option turns off TLS hostname verification, so setting `camel.component.debezium-mongodb.mongodbSslInvalidHostnameAllowed = true` in the configuration is reported by the [security policy](security-policy.md) check: a warning by default, and a startup failure with the `prod` profile or `camel.security.insecureSslPolicy = fail`.
+### camel-cxf
-To keep the setting under a `fail` policy, list the property in `camel.security.allowedProperties`.
+The CXF consumer no longer describes an undeclared route failure in the SOAP fault returned to the caller.
-### camel-mongodb
+When a route consuming from `cxf:` failed with an exception the service contract does not declare, the exception’s message — or its class name, when it had no message — became the SOAP `faultstring`. A new `muteException` consumer option controls this, and it defaults to `true`, the same default the HTTP consumers carry (`camel-http-common` and therefore `camel-servlet` and `camel-jetty`, plus `camel-http`, `camel-platform-http`, and `camel-netty-http` and `camel-undertow` since 4.21.0).
-The `tlsAllowInvalidHostnames` option is now marked `insecure:ssl`. The option turns off TLS hostname verification, so setting `camel.component.mongodb.tlsAllowInvalidHostnames = true` in the configuration is reported by the [security policy](security-policy.md) check: a warning by default, and a startup failure with the `prod` profile or `camel.security.insecureSslPolicy = fail`.
+Muting applies **only to undeclared failures**. Faults the route raises deliberately are part of the service contract and are still returned in full:
-Only the option of `camel-mongodb` is reported, see the `camel-main` section about the security policy check below. To keep `camel.component.mongodb.tlsAllowInvalidHostnames = true` under a `fail` policy, list it in `camel.security.allowedProperties`.
+- a CXF `Fault` or `SoapFault` thrown by the route,
+
+- an exception annotated `@WebFault` (a fault the WSDL declares),
+
+- a `Throwable` or a `CxfPayload` carrying a `<soap:Fault>` set as the message body.
+
-### camel-kubernetes - trustCerts is marked insecure:ssl
+Only an exception that reaches `Exchange.getException()` without a `@WebFault` annotation is replaced, by a fault reading `Exchange processing failed`.
-The `trustCerts` option (shared by all 20 `camel-kubernetes` and `openshift` component endpoints via `KubernetesConfiguration`) is now marked `insecure:ssl`, so setting it to `true` is reported by the [security policy](security-policy.md) check: a warning by default, and a startup failure with the `prod` profile or `camel.security.insecureSslPolicy = fail`.
+Note that this includes framework failures, not just route exceptions. In particular, a `continuationTimeout` expiry previously returned `The OUT message was not received within: 5000 millis.` to the caller and now returns the generic fault; set `muteException=false` on that endpoint if the timeout detail is relied upon for diagnostics.
-For example, if you have:
+A route that relies on an undeclared exception’s message reaching the caller must opt back in explicitly:
-```properties
-camel.component.kubernetes-pods.trustCerts = true
+```text
+cxf://http://localhost:8080/service?serviceClass=com.example.MyService&muteException=false
```
-this will now be flagged. To keep this setting under a `fail` policy, list the property in `camel.security.allowedProperties`:
+#### A suspended consumer rejects new requests
-```properties
-camel.security.allowedProperties = camel.component.kubernetes-pods.trustCerts
-```
+The CXF consumers (`cxf` and `cxfrs`) are suspendable, so that a graceful shutdown keeps the CXF server running while the requests in flight complete, but a suspended consumer kept accepting and routing new requests: during a graceful shutdown (until the shutdown timeout), and while the route was suspended (route controller, JMX, route policies such as `ThrottlingInflightRoutePolicy`). A suspended consumer now rejects a new request with HTTP status 503 (Service Unavailable), like the HTT [...]
-### camel-main - security policy check matches component options by component
+### camel-dapr - pub/sub consumer acknowledges an event after the exchange
-The [security policy](security-policy.md) check matched an insecure option by its name only, so an option of one component that is marked insecure was also reported for any other component, data format or language with an option of the same name. For example `tls=false` was reported for every component because of the `tls` option of `camel-pinecone`.
+The pub/sub consumer acknowledged every event with `SUCCESS` as soon as the exchange was handed to the route, also when the route then failed, so Dapr dropped events whose processing failed. The consumer now answers when the exchange is done: `SUCCESS` when it completed, and `RETRY` when it failed (or was marked rollback only), so that Dapr redelivers the event. A route that fails for an event, and relied on the event being dropped, now receives it again; handle the exception in the rout [...]
-A property that configures a component, data format or language (`camel.component.<name>.<option>`, `camel.dataformat.<name>.<option>` and `camel.language.<name>.<option>`) is now only checked against the options of that component, data format or language. This means fewer properties are reported: a setting that was reported only because another component has an insecure option of the same name no longer triggers a warning, or a startup failure with the `prod` profile. Other properties, [...]
+### camel-datasonnet
-### camel-hazelcast
+#### DataWeave auto-conversion now fails fast on unsupported or malformed scripts
-`ReplicatedHazelcastAggregationRepository` now applies the same default `JavaSerializationFilterConfig` that the other repositories and the component endpoints have applied since 4.14.8/4.18.3/4.21.0, when it bootstraps its own `HazelcastInstance` (that is, when no `hazelcastInstance` is supplied). It overrides `doStart()` without calling `super.doStart()` and was therefore left out of that change.
+`camel-datasonnet` can auto-convert DataWeave 2.0 expressions to DataSonnet at route startup. Two aspects of that conversion are now stricter:
-The default whitelists the class name prefixes `java.`, `javax.`, `org.apache.camel.` and blacklists `java.net.`, and a user-supplied `JavaSerializationFilterConfig` is still respected and never overwritten.
+- **Unsupported semantic constructs:** Previously, when the DataWeave expression contained constructs that could not be auto-converted, the language emitted a `WARN` log and continued, yielding a partially-converted (and likely broken) expression. Starting with this release, such expressions throw `DataWeaveConversionException` at expression-creation time, failing the route startup with a clear error message.
+
+- **Syntactically malformed scripts:** Previously, a DataWeave script with syntax errors (e.g. a missing `}`) could pass the parser and produce a garbled or partial AST, leading to unpredictable runtime behaviour. The parser now throws `DataWeaveConversionException` for any syntactically invalid input, failing fast at startup instead of silently tolerating malformed scripts.
+
-Applications that aggregate classes outside the default whitelist through the replicated repository without supplying their own `hazelcastInstance` must now provide a `Config` with a `JavaSerializationFilterConfig` covering their class names.
+In both cases the exception is thrown at expression-creation time (route startup), not at message processing time. Users who relied on the previous lenient behaviour must fix the malformed or unconvertible expressions. Scripts with unsupported DataWeave constructs must be rewritten in DataSonnet directly, or moved to a `.ds` file.
-The same default is now also applied to the `ClientConfig` that Camel builds for `hazelcastMode=client` endpoints, when neither a referenced `ClientConfig` nor `hazelcastConfigUri` is supplied. Client mode previously behaved differently from node mode for an otherwise identical endpoint configuration.
+The conversion also follows the DataWeave semantics more closely, which changes the result of some scripts that were converted before. For example, a selector on a missing field now gives `null` (as in DataWeave) instead of failing, `default` applies to missing fields, and a field selector on an array selects the field of every element. With an XML input, a selector matches an element by its local name (whatever its namespace prefix), an empty element is `null`, and an element written to [...]
-Camel still uses a user-supplied `Config` or `ClientConfig` (a `hazelcastConfig` bean or a `hazelcastConfigUri` file) unchanged. It now logs a WARN when it starts a Hazelcast member or client from such a configuration that declares no `JavaSerializationFilterConfig`, unless a JVM-wide `jdk.serialFilter` is set. To remove the warning, declare a `java-serialization-filter` in the configuration, as described in the [Hazelcast component](../components/4.22.x/hazelcast-summary.md) documentation.
+#### `c.sortBy` sorts arrays of numbers and strings by the key function
-### camel-pubnub - consumers of a shared PubNub client
+The `c.sortBy(arr, f)` function of `camel.libsonnet` ignored the key function `f` for an array of numbers or strings, and sorted the values themselves. It now sorts by the key function, as documented (for example `c.sortBy([1, 3, 2], function(x) -x)` gives `[3, 2, 1]`). Arrays of objects are sorted as before.
-A PubNub client hands every message it receives to all its listeners. When several endpoints use the same client (a `pubnub` bean that is autowired or referenced), each consumer received the messages of the channels of the other consumers too, and every stop and start of a route added one more listener, so its messages were then received once more. A consumer now only receives the messages and presence events of its own channel, and removes its listener when it stops.
+### camel-debezium
-The endpoint now destroys the PubNub client only when it created it. A client from the registry is no longer destroyed when an endpoint stops, for example when a route that uses the client is removed while other routes still use it: the application that created the client is responsible for destroying it.
+#### mongodbSslInvalidHostnameAllowed marked insecure:ssl
-### camel-netty - NettyConverter.toByteArray returns a copy of the buffer’s readable bytes
+The `mongodbSslInvalidHostnameAllowed` option is now marked `insecure:ssl`. The option turns off TLS hostname verification, so setting `camel.component.debezium-mongodb.mongodbSslInvalidHostnameAllowed = true` in the configuration is reported by the [security policy](security-policy.md) check: a warning by default, and a startup failure with the `prod` profile or `camel.security.insecureSslPolicy = fail`.
-The `ByteBuf` to `byte[]` type converter (`NettyConverter.toByteArray`, also used when converting a Netty HTTP response body and by `camel-hl7`, `camel-lumberjack` and `camel-syslog`) now always returns a copy of exactly the buffer’s readable region (`readerIndex()`..`readableBytes()`).
+To keep the setting under a `fail` policy, list the property in `camel.security.allowedProperties`.
-Previously, for an array-backed (heap) buffer it returned the buffer’s whole backing array directly. That could include bytes outside the readable region and, for a pooled buffer, bytes belonging to other allocations; the returned array was also a live reference into a buffer that could later be recycled.
+#### Failed embedded engine reported
-If your code relied on mutating the returned `byte[]` to write through to the original `ByteBuf`, that no longer has any effect. The converter now behaves consistently for heap and direct, pooled and unpooled buffers.
+The Debezium consumers now register a `CompletionCallback` on the embedded engine. When the engine stops with an error - for example because the connector cannot reach the database, or the offset store cannot be read - the failure is passed to the consumer’s `ExceptionHandler`, and the consumer’s health check reports `DOWN` with that error.
-### camel-http, camel-http-common, camel-netty-http, camel-undertow, camel-vertx-http - property placeholders in HTTP URI override headers
+Previously the engine reported such failures only through its own logger, so the route stayed started and healthy while no longer receiving any change event. Deployments that use readiness or liveness probes will now see a Debezium route whose engine has died reported as `DOWN`, where it was previously reported as `UP`. The engine is still not restarted automatically.
-The HTTP producers no longer resolve property placeholders (`{{…}}`) in the message-supplied endpoint-URI override headers `CamelHttpUri` and `CamelRestHttpUri`. Those headers carry message content, while property placeholders are a route and configuration authoring feature resolved at build time on the endpoint URI written in the route. This is the same alignment 4.22 applied to `toD` and `enrich`.
+#### Consumer readiness during startup
-Placeholders written in the route’s endpoint URI continue to be resolved exactly as before:
+Debezium consumer health checks now retain the configured initial state (`DOWN` by default) until the embedded engine has started its connector tasks and enters its polling phase. Previously, they reported `UP` during startup as long as no engine failure had been reported. Readiness does not wait for a change event or for an initial snapshot to complete. To keep the previous optimistic startup behavior, configure `camel.health.initial-state=up`. Engine failures continue to report `DOWN` [...]
-```java
-.to("http://localhost/{{basePath}}")
-.to("netty-http:http://localhost/{{basePath}}")
-```
+### camel-docling
-A `{{…}}` token arriving in `CamelHttpUri` or `CamelRestHttpUri` is now treated as a literal part of the URI rather than being expanded. Routes that relied on that expansion must resolve the value before it reaches the header, or keep the placeholder in the route.
+A `String` message body is no longer interpreted as a location by default. Previously the producer inspected the body and, when it started with `http://` or `https://`, handed it to Docling as a remote URL to fetch; when it started with `/` or contained `\`, it read it from the local filesystem; otherwise it converted it as document content.
-The affected sites, all of which resolved a header-derived or endpoint-derived value per message:
+The two location readings must now be enabled explicitly:
-- `camel-http` - `HttpMethodHelper.createMethod`
-
-- `camel-http-common` - `HttpHelper.createURL`, `HttpHelper.createMethod`
-
-- `camel-netty-http` - `NettyHttpHelper.createURL`
-
-- `camel-undertow` - `UndertowHelper.createURL`, `UndertowHelper.createMethod`
+- `allowUrlSource` (default `false`) - interpret a body starting with `http://` or `https://` as a URL.
-- `camel-vertx-http` - `VertxHttpHelper.resolveHttpURI`
+- `allowFilePathSource` (default `false`) - interpret a body starting with `/`, or containing `\`, as a local file path. This also covers the single directory-or-file `String` body accepted by the batch operations.
-Where the value came from the endpoint rather than a header it was already resolved at build time, so removing the per-message resolution does not change those routes.
+A route that passes the document itself in the body is unaffected. A route that passes a URL or a path in the body must set the matching option, otherwise the exchange fails with an `IllegalArgumentException` naming the option to enable.
-### camel-iggy - breaking change
+The `CamelDoclingInputFilePath` header is unchanged and still accepts a path without any opt-in, as are `File`, `byte[]` and `InputStream` bodies and the explicit path collections (`List<String>`, `String[]`, `List<File>`, `File[]`) used by the batch operations.
-Client dependency has been upgraded to 0.9.0. The URI parameter `replicationFactor` has been removed. It was removed from Iggy API. It wasn’t used anyway in Iggy code. New parameter `iggyHeaderOptions` has been added. Each key is specific to the implementation chosen and there is no API or documentation for them. So providing the possibility to use it but you have to look to the internals of Iggy.
+A new `inputBaseDirectory` option is also available. When set, every local input path - from the header, from a file path body, and from the batch operations - must resolve inside that directory once normalized. It is unset by default, which keeps the previous behaviour of accepting any path.
-### camel-console - variables dev console JSON response shape
+Additionally, a local input path that does not exist is now reported as a `File not found` `IOException` before Docling is invoked. Previously the size check silently skipped a path that resolved to nothing and the failure surfaced later, from the Docling process or API call.
-The `variables` dev console (`/q/dev/variables`) no longer returns a JSON object keyed by each variable repository’s id. It now returns a fixed shape, so the response has a documented, authoritative OpenAPI schema like the other dev consoles (see the `/q/dev/api` OpenAPI document):
+The `CamelDoclingOutputFilePath` header, which selects the CLI output directory, is now normalized lexically (redundant separators and `.`/`..` segments are resolved) before it is passed to Docling; a header value without such segments is still used as given. A new `outputBaseDirectory` option additionally confines the header the same way `inputBaseDirectory` confines input paths - when set, an output path that resolves outside it, including an absolute path, is rejected with an `IOExcep [...]
-Before:
+### camel-dynamic-router
-```json
-{
- "global": [ { "key": "foo", "type": "java.lang.String", "value": "bar" } ]
-}
-```
+The `dynamic-router-control` endpoint no longer takes the subscription `predicate`, or the `expressionLanguage` used to compile it, from the incoming control message. A control message that supplies either is now rejected with an `IllegalArgumentException`.
-After:
+The predicate is compiled and then evaluated against every exchange on the channel, so letting the control message choose both the language and the expression means the sender of that message decides what runs inside the Camel process. Only enable this when control messages can only come from a trusted source:
-```json
-{
- "repositories": [
- { "id": "global", "variables": [ { "key": "foo", "type": "java.lang.String", "value": "bar" } ] }
- ]
-}
+```java
+from("kafka:subscriptions")
+ .unmarshal().json(DynamicRouterControlMessage.class)
+ .to("dynamic-router-control:subscribe?allowPredicateFromMessage=true");
```
-Each repository is now an entry in the `repositories` array carrying its own `id`, rather than the id being a dynamic top-level JSON key. Anything that parses this console’s raw JSON directly (custom tooling, or scripts calling the dev console HTTP endpoint) must be updated to the new shape. The `camel get variable` CLI command has already been updated accordingly.
-
-### camel-javascript
-
-The `js` language now shares one GraalJS `Engine` per language instance (a `Context` is still created per evaluation), so the engine is built when the `CamelContext` starts instead of on every evaluation.
-
-Values returned by a script are now converted to plain Java objects before the script’s `Context` is closed. Previously a JavaScript object, array, `Map`, `Set` or `Date` came back as a polyglot `Value` bound to a `Context` that had already been closed, and reading it failed. A script now returns a `LinkedHashMap` for an object or a JavaScript `Map`, an `ArrayList` for an array, a `LinkedHashSet` for a `Set` and a `java.time.Instant` for a `Date`. Code that handled the polyglot `Value` i [...]
-
-`JavaScriptHelper.newContext()` is deprecated: contexts are created by the language from its shared engine.
-
-### camel-javascript, camel-python - script variables use the Groovy names
-
-The `js` and `python` languages now bind the script variables with the names the `groovy` language uses: `camelContext`, `request`, `header`, `exchangeProperty`, `exchangeProperties` and `exception` are new, next to `exchange`, `exchangeId`, `message`, `body`, `headers`, `variable` and `variables`. In `js` and `python` the `context` and `properties` variables are deprecated in favour of `camelContext` and `exchangeProperties`; they still work. The new `python3` language binds only the Gr [...]
+The option is annotated `security = "insecure:dev"`, so with `camel.main.profile = prod` the default policy for that category is `fail`, and an endpoint that sets `allowPredicateFromMessage=true` will not start unless you relax `camel.security.insecureDevPolicy`.
-### camel-rest, camel-rest-openapi, camel-jbang - camel-http is the default REST client
+Two alternatives avoid the flag entirely. A control message may still name a `predicateBean`, which selects a `Predicate` that the route author bound in the registry; that path is unchanged. The control endpoint may also carry `predicate` and `expressionLanguage` as URI parameters, in which case every subscription made through that endpoint uses the route author’s expression. Subscription parameters that the control message does not carry now fall back to the values configured on the endpoint.
-When a REST producer (`rest:` in producer mode, or `rest-openapi` calling an operation of a contract) has no `componentName` (`producerComponentName`) and no `RestProducerFactory` component exists in the context or the registry yet, the default components are tried in the order `http`, `vertx-http`, `undertow`, `netty-http`; before, `vertx-http` came first. An application with both camel-http and camel-vertx-http on the classpath now calls through camel-http; set `componentName=vertx-htt [...]
+The `dynamic-router` endpoint gained an `allowedSchemes` option, an optional comma-separated allow-list of component schemes that a subscription destination may resolve to. It is unset by default, which allows any scheme, matching the previous behaviour.
-### camel-rest-openapi - path parameters are decoded
+### camel-exec
-The headers of the path parameters of a contract-first (`rest-openapi` consumer) operation now hold the decoded value, as with the Rest DSL: `/items/caf%C3%A9` sets the `id` header to `café`, not `caf%C3%A9`. Each path segment is decoded on its own (an encoded `/` stays in its parameter) and a `` ` stays a ` ``. A value with a malformed escape is kept as it is. Routes that decoded these headers themselves must no longer do so.
+`allowControlHeaders` is now annotated `security = "insecure:dev"`. With `camel.main.profile = prod` the default policy for that category is `fail`, so an endpoint or component that sets `allowControlHeaders=true` will not start unless you relax `camel.security.insecureDevPolicy`.
-### camel-openapi-java - allowable values of an array parameter
+When the flag is `false` (the default), any remaining `CamelExecCommand*`, `CamelExecExitValues`, or `CamelExecUseStderrOnEmptyStdout` headers are ignored and a WARN is logged once per exec endpoint. Those headers never overrode the URI without the flag; they were just silent before.
-The OpenAPI document generated from the Rest DSL now puts the allowable values of a parameter with `dataType("array")` on the items of the array (`items.enum`), as they restrict the values of the items. They were put on the array schema itself (`enum` next to `type: array`), which does not accept any array, so tools that validate requests or generate clients from the document rejected or mistyped the parameter.
+### camel-file and Remote File Components
-### camel-jbang
+#### camel-ftp, camel-sftp, camel-ftps, camel-mina-sftp, camel-azure-files, camel-smb
-The `--runtime` option of `camel run` has a new default value `jbang`, which is the existing in-process behaviour (the integration runs inside the Camel CLI JVM). The `main` (or `camel-main`) runtime now behaves like `spring-boot` and `quarkus`: the integration is exported to a temporary Camel Main project, built with Maven, and run in a separate JVM (the packaged runner JAR is started with `java`). This gives a JVM with the same classpath as an exported project, which resembles a produc [...]
+The remote-file consumers now ensure the path resolved for a polled file stays within the directory being polled. The file name that path is built from is reported by the remote server in its directory listing and is not guaranteed to be a single path segment, so a listing entry containing `../` sequences could previously resolve to a path outside the configured directory and be used as the operand for retrieving, deleting or renaming a file.
-Running a directory (`camel run .` or `camel run mycode`) is now the same as `--source-dir`: the route files in its subfolders are loaded too, and in `--dev` mode changed and new files are reloaded (before, the directory was expanded to the files directly in it, and in `--dev` mode `camel run .` reloaded nothing). A directory with a `pom.xml`, and the `spring-boot` and `quarkus` runtimes, still run the files directly in the directory.
+The containment check honours the existing `jailStartingDirectory` option (default `true`), consistent with the file producer and with the `localWorkDirectory` download path; set `jailStartingDirectory=false` to disable it. A file that resolves outside the configured directory is now skipped, and a warning is logged.
-Running an existing Maven project (`camel run pom.xml`) is unchanged, and still detects the runtime from the `pom.xml`. The other commands that take `--runtime` (such as `camel export`, `camel dependency list` and `camel version list`) accept `jbang` as an alias for `main`.
+Ordinary listings are unaffected, as a listed name is normally a single path segment, and a `../` that still resolves back inside the polled directory remains accepted. Two configurations can newly see files skipped: a server that reports names navigating above the polled directory, and a `fileName` expression (used when `useList=false`) that navigates above it. Set `jailStartingDirectory=false` if such a path is intended.
-The file watcher reload strategy (camel-support) now emits the `CamelContextReloadFailure` event when a single file fails to reload, with the file name as the event’s action; before, only a failed reload of the whole context emitted it. A listener of that event fires for these failures too. `camel run` uses it to print the report of `camel validate yaml` when a YAML route file does not load, at start and on a reload in `--dev` mode.
+#### camel-mina-sftp - the producer applies the charset and allowNullBody options
-The YAML that `camel init` writes (`camel init foo.yaml`, and the Integration and Kamelet templates), the bundled examples (`camel init --example`) and the routes the `camel_ai_pipeline_scaffold` and `camel_openapi_scaffold` MCP tools generate are now written in the canonical YAML DSL format, with an expression under `expression:` and a step as a map of its options (`setBody: {expression: {simple: {expression: "…"}}}`, `log: {message: "…"}`, `to: {uri: "…"}`). The compact notation the [...]
+The producer wrote a String body in the charset of the exchange (UTF-8 unless the exchange sets another one) and ignored the `charset` option of the endpoint, unless the exchange had been created by that endpoint (for example by a `ProducerTemplate` sending to it directly). It now writes the file in the configured `charset`, as camel-sftp does. A null body with `allowNullBody=true` now writes an empty file instead of failing. When `charset` is set, non-String bodies (such as `byte[]`, `I [...]
-`camel export` keeps a Groovy script that a route references as a resource (`resource:classpath:mapping.groovy` or `resource:file:mapping.groovy`, a mapping script used as the body of an expression) at the resources root, where the reference resolves in the exported project. Other Groovy files go to `src/main/resources/camel-groovy` as before, where they are compiled as scripts at startup.
+#### camel-file, camel-ftp, camel-smb, camel-mina-sftp and camel-azure-files
-`camel run` now looks up a `classpath:` or `file:` resource that is not found in the directories of the route files (the working directory first), the way it already did under `--source-dir`. A script next to the route is found as `resource:classpath:mapping.groovy`, the reference that also works in the project `camel export` writes, where before only `resource:file:mapping.groovy` worked in the CLI. A resource that exists nowhere fails as before, named as written.
+Downloads to a configured `localWorkDirectory` now resolve existing filesystem path segments before checking that the destination remains inside that directory. Downloads through a symbolic link that resolves outside the `localWorkDirectory` are rejected. Valid nested download paths continue to work.
-`camel run` adds `camel-groovy` as a dependency when a `.groovy` file is given, so the file is compiled without `--dep=camel-groovy`; before, the file was silently ignored unless the dependency was added. The dependency is also written to the run settings, so `camel export` includes it.
+#### camel-file - jailStartingDirectory resolves symbolic links
-With `--runtime=quarkus`, the Quarkus Platform resolved for a released Camel version is now cached for 7 days under `~/.camel/quarkus-extension-registries`, next to the Quarkus Extension Registry response, which is still fetched at most once a day. Only a platform that carries exactly the requested Camel version is cached; a `-SNAPSHOT` Camel version is never cached. `--fresh` clears both caches. A registry with an explicit port in `--quarkus-ext-registry` (or `camel.jbang.quarkusExtensi [...]
+With `jailStartingDirectory` enabled (the default), the file consumer and producer now resolve symbolic links when checking that a file stays within the starting directory. The consumer skips a file or (with `recursive=true`) a directory that is a link resolving outside of it, and the producer fails to write through such a link or a dangling link. Links resolving inside the starting directory work as before. Set `jailStartingDirectory=false` to keep following links to other directories ( [...]
-`camel validate source`, and the `camel_validate_source` and `camel_write_file` MCP tools, now check the routes of Java and XML DSL files as they check YAML routes: the endpoint URIs against the catalog (also those built with the endpoint DSL or from a constant), simple expressions, and a `to` whose URI holds `${...}` and should be a `toD`. A Java file used to be checked only by the compiler and an XML file only for being well formed, so a file that validated before can now report errors [...]
+#### camel-file, camel-ftp, camel-smb, camel-mina-sftp and camel-azure-files - a file whose download fails is retried by idempotent consumers
-`camel kubernetes run --cluster-type=<type>` now uses the given cluster type. Before, unless `--disable-auto` was set, the detected cluster type (OpenShift, Minikube or Kubernetes) replaced it, together with its image settings. The defaults of the cluster type still apply, also to an explicit type (Minikube: `--image-builder=docker` and, with the docker builder, `--image-push=false`; OpenShift: the current namespace as `--image-group`), but they no longer replace an `--image-builder` or [...]
+When the consumer cannot download a file (for example a FTP, SFTP or SMB transfer fails with a socket timeout or a connection reset), the file is now retried on the next poll also when the consumer is idempotent, which includes every consumer with `noop=true`. Consumers that are not idempotent already retried such a file. Previously the idempotent key, which is added when the file is polled (`idempotentEager=true`, the default), was kept, so the file was skipped until the application was [...]
-### camel-jbang (MCP servers)
+A poll in which the download of every file failed now counts as an idle poll, the same as a poll in which no read lock could be acquired. This affects `backoffIdleThreshold`, `sendEmptyMessageWhenIdle` (an empty message is sent) and `greedy` (the consumer does not poll again immediately).
-The Camel authoring tools for AI agents are now defined once, in `camel-jbang-core`, and exposed under the same `camel_` names by both MCP servers, `camel mcp` and `camel tui --mcp`: `camel_catalog_doc`, `camel_catalog_find`, `camel_validate_source`, `camel_get_files`, `camel_write_file`, `camel_run`, `camel_control`, `camel_get_log`, `camel_get_errors`, `camel_eval_expression` and `camel_error_diagnose`.
+#### camel-cluster - clustered routes stop when the file lock view is stopped, and the initial delay is honoured
-The `camel_write_file` tool, when an integration of the project is selected and runs in dev mode, waits up to eight seconds for the reload of the written file and answers with its outcome (`reload.status` reloaded, failed with the cause and the validator’s report, properties, or unknown), so an agent does not go on with a route that did not load. A write with no selected integration answers as before.
+When a file lock cluster view (`camel-file`) is stopped while this member is the leader, for example with the `stopView` JMX operation, the stop of the cluster service or the stop of the clustered route controller, the listeners are now told that the leadership is lost. The clustered routes (`ClusteredRoutePolicy`) and the `master` consumers are then stopped. Previously they kept running while the file lock was released, so another member could take the leadership and both members ran th [...]
-The `validate` argument of `camel_write_file` is gone: the write always validates the content and refuses an invalid file. A model given the switch turned it off on its own, and the file then failed to load.
+The `initialDelay` of a clustered route policy is now also honoured when the leadership is taken after the CamelContext has started (which is common with the file lock cluster service, as the lock is taken after a short delay). Previously the routes were then started right away.
-The authoring set has a new tool, `camel_edit_file`: it replaces one snippet of a file, given the exact text to find and what to put there, and validates and reloads the result as a write does. A model that rewrites a whole file to change one step corrupts the lines it did not mean to touch, so this is the tool for a change to an existing file; `camel_write_file` writes a new one. Several places of one file are changed in one call with its `edits` argument (a list of find and replace), s [...]
+The `acquireLockInterval` of the file lock cluster service must now be at least 1 millisecond.
-`camel_eval_expression` evaluates any language, not only the ones on the server’s own classpath: the component of a language such as `jsonpath`, `jq` or `xpath` is downloaded on first use, as `camel run` downloads what a route needs, and the answer names it in `downloaded`. A failing expression also carries the catalog’s syntax error and the position where it breaks.
+### camel-google-mail - messages whose exchange is in flight
-The `camel_run` tool, when no files are named, starts the project with `camel run --source-dir=.` instead of listing the directory’s files: the directory is watched, so a file added afterwards (a bean file, a Java class under `src/main/java`) is part of the app and reloaded in dev mode, and a `restart` starts the same way. Naming files keeps the previous behaviour. The `camel_control` tool gets a `reload` action, what `camel cmd reload` does.
+The `google-mail-stream` consumer no longer consumes a message again while an exchange of an earlier poll is still processing it, which happened with an asynchronous route (for example `to("seda:…")`) as the message is only marked as read when its exchange is done. The next polls now skip such a message (with `markAsRead=false` it is consumed again once its exchange is done).
-In the TUI MCP server the tools `tui_catalog_doc`, `tui_validate_source`, `tui_write_file`, `tui_get_files`, `tui_control`, `tui_get_log`, `tui_get_errors` and `tui_eval_expression` were renamed to the `camel_` names above; the `tui_` prefix is now reserved for the tools that only make sense in front of the screen. Update MCP clients, prompts and ACP permission lists that name them. `camel_eval_expression` no longer fails when no integration is selected but evaluates the expression in a [...]
+### camel-google-sheets - custom column names of a range that does not start at column A
-In `camel mcp` the `camel_catalog_doc` tool changed: it now takes the artifact `name` and `kind` (not a page name such as `kafka-component`) and returns the structured documentation with options and URI rules; `includeDoc=true` adds the AsciiDoc page the tool used to return on its own. `camel_error_diagnose` returns the same JSON fields as before. The new file, run and control tools are hidden by the `read-only` access level of the security layer; the server does not ask before writing a [...]
+The `google-sheets:application-x-struct` data type now maps the custom `columnNames` to the columns of the range by their position. For a range that does not start at column A every column got the first name, so with the Kamelet default `columnNames=A` and a range such as `B:E` the JSON keys change from `A` for every column (each value overwriting the previous one) to `A`, `C`, `D`, `E`. Ranges that start at column A are not affected.
-`camel-jbang-core` now depends on `camel-yaml-dsl-validator` for the source validation behind these tools.
+### camel-google-storage
-The older `camel mcp` tools that asked the same questions as the shared tools were removed, so a client no longer has two near-identical tools to pick from. Update MCP clients and prompts that name them:
+Local downloads configured with a plain `downloadFileName` directory now resolve existing filesystem path segments before checking that the destination remains inside that directory. Downloads through a symbolic link that resolves outside the configured directory are rejected. Valid object names using `/` as a pseudo-directory separator continue to work.
-
-| Removed tool | Use instead |
-| --- | --- |
-| `camel_catalog_component_doc`, `camel_catalog_dataformat_doc`, `camel_catalog_language_doc`, `camel_catalog_eip_doc` | `camel_catalog_doc` with the `kind` (`optionsFilter`, `includeOptions`, `includeHeaders`, `includeDoc`) |
-| `camel_catalog_component_maven` | `camel_catalog_doc`, which returns the Maven coordinates |
-| `camel_catalog_components`, `camel_catalog_dataformats`, `camel_catalog_languages`, `camel_catalog_eips` | `camel_catalog_find` with the `kind` (the EIP aliases such as `fan-out` and `dedup` match) |
-| `camel_validate_yaml_dsl`, `camel_validate_route` | `camel_validate_source`; an endpoint URI alone is checked by `camel_catalog_doc` with `endpoint` |
-| `camel_runtime_eval` | `camel_eval_expression` |
-| `camel_runtime_errors` | `camel_get_errors` |
-| `camel_runtime_stop` | `camel_control` with `action=stop` |
+The remote object name is untrusted input, so the consumer now also checks it whatever `downloadFileName` looks like. An absolute object name (one starting with `/` or `\`, or with a drive letter such as `C:`) and an object name with a `..` path segment are rejected, even when the name would normalize back inside the download directory (for example `a/../b.txt`). When the consumer lists the bucket, a rejected object is skipped and reported to the consumer’s exception handler, which logs [...]
-The shared catalog tools answer for the Camel version in use, or the `camelVersion` given; the `runtime` (`spring-boot`, `quarkus`) and `platformBom` arguments of the removed tools have no equivalent there. The `camel_build_integration` prompt names the shared tools now.
+The containment check is now also applied when `downloadFileName` is configured as a directory followed by an expression, such as `downloadFileName=/tmp/downloads/${file:name}`: the destination must stay within the static directory prefix configured before the first expression token (`/tmp/downloads` in the example). When `downloadFileName` is fully dynamic and has no static directory prefix (for example `downloadFileName=${file:name}`), a relative destination must stay within the workin [...]
-### camel-jbang (TUI)
+The consumer no longer consumes an object again while an exchange of an earlier poll is still processing it, which happened with an asynchronous route (for example `to("seda:…")`), so the next polls now skip such an object (with `deleteAfterRead=false` it is consumed again once its exchange is done). An object that no longer exists when its content is downloaded (for example deleted by another consumer after the listing) is now skipped instead of failing the poll.
-The F8 AI panel now sends only a core subset of its `tui_*` tools to local providers (Ollama, or any provider on `localhost`); the drawing, animation and automation tools are left out to keep the prompt small for local models. Hosted providers are unaffected. Use `/tools full` in the panel, or set `camel.tui.ai.tools=full`, to restore the previous behaviour. Requests to Ollama now also set `keep_alive` to 30 minutes and a `num_ctx` chosen once per model: `OLLAMA_CONTEXT_LENGTH` when set [...]
+### camel-groovy
-`camel tui --record` is now rejected when combined with `--web`. The recording configuration applies to the whole process, so a browser session served by `--web` would be recorded into the same `.cast` file as the local session. Previously the combination was accepted, but recording never produced any output, so run the two modes in separate processes instead.
+A `GroovyShellFactory` is now looked up in the registry once per `CamelContext`, when the first groovy expression is evaluated, instead of on every evaluation. A factory bound to the registry after that point is no longer used; bind it before the context starts.
-### camel-yaml-dsl - the canonical schema requires route:
+The `exchangeProperties`, `exchangeProperty`, `variables`, `variable` and `attachments` script variables are now read from the exchange the first time the script uses them instead of being copied before the script runs. A script that changes a property or variable through `exchange` and then reads one of these variables for the first time now sees its own change where it previously saw the state from before the script ran.
-A top-level `- from:` without `- route:` is the compact notation of a route, and the canonical schema (`camelYamlDsl-canonical.json`) no longer lists `from` among its top-level entries: a route is written under `route:`, as an XML route is always a `<route>`, and as Kaoto and Karavan write it. `camel validate yaml --canonical` now reports a top-level `from:` with the form to write, the way it reports the other compact shapes, and `camel validate normalize` rewrites it. The Integration te [...]
+Groovy scripts now have a `message` variable for the current message (`exchange.getMessage()`), the name the other script languages and the Camel 4 API use; `request` and `in` stay as its older names. A `GroovyShellFactory` that provided its own global variable named `message` is now hidden by the exchange variable, like the other exchange variable names.
-### camel-yaml-dsl - endpoint parameters keep the order they are written in
+The Groovy script compiler now runs the ``org.apache.camel.spi.CompilePostProcessor`s on a compiled class that has class-level annotations, with a new instance of the class, as the Java DSL loader does for `.java`` sources. The processors in the registry are used when there are any (the Camel CLI registers processors that also handle the Spring and Quarkus annotations); otherwise built-in processors for the Camel annotations are used. So in every runtime (camel-main, Spring Boot, Quarkus [...]
-The endpoint uri of a YAML DSL endpoint written with `parameters:` has its query options in the order they are written, where it had them sorted by name: `uri: seda` with `name: foo`, `size: 1234` and `multipleConsumers: true` is now `seda:foo?size=1234&multipleConsumers=true`. Route dumps in YAML keep that order as well. The options of an endpoint are the same, and the endpoint resolved is the same, as Camel sorts the options when it normalizes the uri.
+The Camel-annotation compile post-processors that camel-kamelet-main used internally are now public classes in camel-support: `org.apache.camel.support.compile.BindToRegistryCompilePostProcessor`, `TypeConverterCompilePostProcessor` and `EventNotifierCompilePostProcessor`.
-The same applies to `EndpointUriFactory.buildUri` and the catalog `asEndpointUri` given an ordered map such as a `LinkedHashMap`: the options are in the order of the map. A map without an order, such as a `HashMap`, has its options sorted as before.
+A lazy `@BindToRegistry` class from a compiled `.java` or `.groovy` source (`lazy = true`, or `camel run --lazy-bean` in the Camel CLI) is now bound with the name from the annotation, or else the simple class name, the same as an eager `@BindToRegistry` class. Before, the bean was bound with the fully qualified class name and the annotation value was ignored, so a class in a package, or with a name in the annotation, was not found by the expected name.
-### camel-yaml-dsl - Pipe (kind: Pipe) support is deprecated
+### camel-grpc
-Loading Camel K `kind: Pipe` resources (formerly `KameletBinding`), typically from a `.pipe.yaml` file, is deprecated in the YAML DSL and will be removed in a future release. Loading such a file now logs a deprecation warning.
+The gRPC consumer no longer returns the route exception’s message to the client.
-Write a plain Camel route instead, which is more expressive (any EIP, multiple routes per file, error handling and route configuration) and is what the tooling, catalog and validator work on. For example, a Pipe with a source, a step and a sink:
+When an exchange failed, `GrpcMethodHandler` built the error status with `Status.INTERNAL.withDescription(exchange.getException().getMessage())`. The description is transmitted to the client — unlike the cause attached alongside it, which stays local — so any remote-triggerable failure handed the caller internal detail.
-```yaml
-apiVersion: camel.apache.org/v1
-kind: Pipe
-metadata:
- name: my-pipe
-spec:
- source:
- uri: timer:tick
- steps:
- - uri: "https://my-service/api"
- sink:
- uri: log:result
-```
+A new `muteException` consumer option controls this, and it defaults to `true`, the same default the HTTP consumers carry. The status code is unchanged; only the description is replaced, with `Exchange processing failed`.
-becomes:
+A route that relies on the exception message reaching the client must opt back in explicitly:
-```yaml
-- route:
- id: my-pipe
- from:
- uri: timer:tick
- steps:
- - to:
- uri: "https://my-service/api"
- - to:
- uri: log:result
+```text
+grpc://localhost:8080/org.example.MyService?muteException=false
```
-### camel-mail
+#### Failed exchanges with the AGGREGATION and PROPAGATION consumer strategies
-`MimeMultipartDataFormat` now uses `MailHeaderFilterStrategy` instead of a plain `DefaultHeaderFilterStrategy` when `headersInline` unmarshal copies the remaining MIME headers onto the Camel message. That strategy filters the `mail.smtp.` and `mail.smtps.` prefixes on the inbound path in addition to `Camel*`/`camel*`, so the data format now filters the same namespace the mail consumer has filtered since 4.14.9/4.18.4/4.22.0.
+With the `AGGREGATION` and `PROPAGATION` consumer strategies (client streaming and bidirectional streaming calls), a failed exchange now ends the call with an `INTERNAL` error, like unary and server streaming calls already did (the description follows the `muteException` option). Before, the message body of the failed exchange was sent to the client as a regular response. With `PROPAGATION` (the default strategy) the first failed exchange ends the whole call, so the messages that the cli [...]
-Routes that relied on `mail.smtp.*` or `mail.smtps.*` headers arriving on the exchange from an unmarshalled MIME message must set those values explicitly on the route instead. Ordinary application headers are unaffected.
+### camel-hashicorp-vault - secret refresh
-`MailBinding` now parses the content type returned by a custom `ContentTypeResolver` before adding the attachment file name as a quoted parameter, instead of concatenating the file name into the header - closing a header-injection vector via a crafted file name. As a side effect, a `ContentTypeResolver` that returns an unparsable content type now fails fast with a `ParseException` at marshal time, where before the invalid value was written into the `Content-Type` header as-is. Ensure a c [...]
+The secret refresh task now checks a secret used as `hashicorp:myengine:mysecret` in its own engine, and names it `myengine:mysecret` in `HashicorpVaultPropertiesFunction.getSecrets()` and in the updates of the task (secrets of the `secret` engine keep their names). Before, it checked `mysecret` in the `secret` engine, so an update of a secret in any other engine never triggered a reload. The first check now also compares the version in Vault with the version the property was resolved wi [...]
-### camel-nats - no reply when the exchange failed
+### camel-hazelcast
-A consumer with `exchangePattern=InOut` answered a request (a message with a reply subject) with the body of the exchange also when the exchange failed, so the requester got a successful reply, usually its own request. NATS has no error reply, so the consumer now sends no reply when the exchange failed or is marked rollback only, as camel-jms does without `transferException`: the requester times out (with the camel-nats producer, an `ExchangeTimedOutException` after `requestTimeout`). A [...]
+`ReplicatedHazelcastAggregationRepository` now applies the same default `JavaSerializationFilterConfig` that the other repositories and the component endpoints have applied since 4.14.8/4.18.3/4.21.0, when it bootstraps its own `HazelcastInstance` (that is, when no `hazelcastInstance` is supplied). It overrides `doStart()` without calling `super.doStart()` and was therefore left out of that change.
-### camel-netty - object codecs apply a deserialization filter by default
+The default whitelists the class name prefixes `java.`, `javax.`, `org.apache.camel.` and blacklists `java.net.`, and a user-supplied `JavaSerializationFilterConfig` is still respected and never overwritten.
-The `ObjectDecoder` and `DatagramPacketObjectDecoder` codecs (used when a route configures Netty object serialization through the `encoders` / `decoders` options) now always install a JEP-290 `java.io.ObjectInputFilter` while decoding, resolved through `DeserializationFilterHelper`. Previously a decoder built without an explicit filter pattern applied no filter at all and only logged a warning.
+Applications that aggregate classes outside the default whitelist through the replicated repository without supplying their own `hazelcastInstance` must now provide a `Config` with a `JavaSerializationFilterConfig` covering their class names.
-When no explicit pattern is passed, the JVM-wide `jdk.serialFilter` is honoured if set, otherwise the shared Camel default allow-list is applied (it permits standard Java and Apache Camel types, denies `java.net.**`, and enforces JEP-290 graph-shape limits). Routes that deserialize classes outside that allow-list must pass an explicit filter pattern to the two-argument `ObjectDecoder(ClassResolver, String)` / `DatagramPacketObjectDecoder(ClassResolver, String)` constructor (or configure [...]
+The same default is now also applied to the `ClientConfig` that Camel builds for `hazelcastMode=client` endpoints, when neither a referenced `ClientConfig` nor `hazelcastConfigUri` is supplied. Client mode previously behaved differently from node mode for an otherwise identical endpoint configuration.
-### camel-jgroups - the consumer applies a deserialization filter by default
+Camel still uses a user-supplied `Config` or `ClientConfig` (a `hazelcastConfig` bean or a `hazelcastConfigUri` file) unchanged. It now logs a WARN when it starts a Hazelcast member or client from such a configuration that declares no `JavaSerializationFilterConfig`, unless a JVM-wide `jdk.serialFilter` is set. To remove the warning, declare a `java-serialization-filter` in the configuration, as described in the [Hazelcast component](../components/4.22.x/hazelcast-summary.md) documentation.
-The consumer maps an incoming cluster message to the exchange body by calling `org.jgroups.Message.getObject()`, which Java-deserializes the payload. The class of that body is now checked against a JEP-290 `java.io.ObjectInputFilter`, resolved through `DeserializationFilterHelper`. Previously no filter was applied at all, and any type a cluster peer sent was routed.
+### camel-health - readiness is the same for every exposure level
-When no explicit pattern is configured, the JVM-wide `jdk.serialFilter` is honoured if set, otherwise the shared Camel default allow-list is applied (it permits standard Java and Apache Camel types and denies `java.net.**`). Routes that exchange their own classes over the cluster must widen it through the new `deserializationFilter` endpoint option, for example:
+The readiness of Camel is now the same regardless of the health check exposure level (`full`, `default` or `oneline`). Previously with the `default` and `oneline` exposure levels, health checks in the `UNKNOWN` state were not included in the result, and Camel could report ready, while the `full` exposure level reported not ready for the same state. These health checks are now included, so Camel is not ready in all exposure levels.
-```java
-from("jgroups:clusterName?deserializationFilter=com.example.model.**;java.**;!*")
-```
+A health check that is disabled (such as a consumer health check turned off with `healthCheckConsumerEnabled=false`) no longer influences the readiness, in any exposure level. Previously a disabled health check made Camel not ready with the `full` exposure level.
-Setting `deserializationFilter=*` accepts any type and so restores the previous behavior. A refused message is not routed; it is reported to the consumer’s `ExceptionHandler`, which logs it at WARN level by default.
+A route health check now reports `DOWN` when the route is suspended (or is starting or stopping), the same as when the route is stopped. Previously it reported the initial state of the health check registry.
-Note that JGroups deserializes the payload inside its own receive path, so this check is a defense-in-depth allow-list on the resulting body type. The JVM-wide `jdk.serialFilter`, together with a channel secured with `AUTH` and encryption, remain the primary mitigations.
+A health check that fails with an exception now reports `DOWN` (with the exception as the error), instead of failing the whole health check.
-### camel-jgroups - the consumer refuses to start without a pre-read deserialization control
+Setting `camel.health.enabled=false` now disables the health check registry. Previously the registry was still enabled, and health checks (such as the context health check) were still loaded and invoked.
-Building on the deserialization filter above, the consumer now refuses to start when it would deserialize cluster messages on the default, unauthenticated channel and no pre-read protection is configured. The class check applied after `org.jgroups.Message.getObject()` is defense-in-depth only and cannot stop code that runs during deserialization, so a pre-read control is required. A pre-read control is any of: a JVM-wide `-Djdk.serialFilter`, the JGroups-native `-Djgroups.deserialization [...]
+### camel-hivemq
-When none of these is configured, the consumer fails to start. To keep the previous behaviour of accepting any serialized type without a pre-read control, set `acceptAllObjects=true` on the consumer; this opts out of the guard and also disables the post-read class check:
+The `ssl` option is now marked `insecure:ssl`, so setting it to `false` in the configuration is reported by the [security policy](security-policy.md) check: a warning by default, and a startup failure with the `prod` profile or `camel.security.insecureSslPolicy = fail`.
-```java
-from("jgroups:clusterName?acceptAllObjects=true")
-```
+This applies only to `camel-hivemq`: setting `ssl=false` on the other components that have an `ssl` option (such as `camel.component.netty.ssl = false`) is not reported, see the `camel-main` section about the security policy check below. To keep `camel.component.hivemq.ssl = false` under a `fail` policy, list it in `camel.security.allowedProperties`.
-Producers are unaffected.
+### camel-hl7 - character sets from MSH-18
-### camel-oauth
+The HL7 data format now maps the MSH-18 values `8859/6`, `8859/7`, `8859/8` and `8859/9` to ISO-8859-6 .. ISO-8859-9, `8859/15` to ISO-8859-15, and `GB 18030-2000` to GB18030, as in HL7 table 0211 (and as camel-mllp already does). Before, the first five fell back to the charset of the exchange (UTF-8 by default), and `GB 18030-2000` failed with `UnsupportedEncodingException`. Messages with these MSH-18 values are now read and written in the named charset, and unmarshal sets `CamelCharset [...]
-The OAuth processors now stop the route on the paths where they do not authenticate the caller, so that no subsequent step of the route runs for such a request. Previously they set a response code and returned, which left the rest of the route to execute and overwrite the response the processor had just prepared.
+### camel-http
-What changed:
+#### camel-http is the default REST client
-- `OAuthBearerTokenProcessor` — a request with no `Authorization` header, or with one that does not parse as `Bearer <token>`, is now answered with `401` and a `WWW-Authenticate: Bearer` challenge (RFC 6750) instead of `400`, and the route is stopped. A present-but-invalid token continues to fail by propagating the exception from `OAuth.authenticate()`, as before.
-
-- `OAuthCodeFlowProcessor` — when the caller has no authenticated session and is redirected to the identity provider, the route is now stopped; the `302` is the whole response.
-
-- `OAuthCodeFlowCallback` — a callback request without the `code` parameter still answers `400`, and now also stops the route.
-
+When a REST producer (`rest:` in producer mode, or `rest-openapi` calling an operation of a contract) has no `componentName` (`producerComponentName`) and no `RestProducerFactory` component exists in the context or the registry yet, the default components are tried in the order `http`, `vertx-http`, `undertow`, `netty-http`; before, `vertx-http` came first. An application with both camel-http and camel-vertx-http on the classpath now calls through camel-http; set `componentName=vertx-htt [...]
-Routes that relied on steps after these processors running for unauthenticated requests must be restructured. The authenticated paths are unchanged: a successfully authenticated request continues through the rest of the route exactly as before, and `OAuthLogoutProcessor` is unchanged.
+#### OAuth2 client-credentials token cache key
-### camel-netty-http
+The OAuth2 client-credentials token cache was keyed on the request URI, the client id and the client secret only. `oauth2Scope`, `oauth2TokenEndpoint` and `oauth2ResourceIndicator` all shape the token that gets minted, but none of them was part of the key, and the cache is a static map shared by every endpoint and every `CamelContext` in the JVM. A route configured with a narrow scope could therefore be handed a broad-scope token that another route had cached first for the same target an [...]
-The security-constraint lookup now strips the endpoint context-path from the request target case-insensitively, matching how consumer dispatch already matches it (`RestConsumerContextPathMatcher` compares with `equalsIgnoreCase` and a lower-cased prefix).
+All three are now part of the key. Deployments that were unknowingly sharing a token across differing scopes, token endpoints or resource indicators will now request one token per distinct combination, so the token endpoint sees more requests than before.
-Previously the strip was guarded by a case-sensitive `startsWith`, so a request whose context-path differed only by case was evaluated against the unstripped target. With `matchOnUriPrefix=true` and a `securityConstraint` whose inclusions are specific sub-paths rather than a catch-all, such a request could match no inclusion — and an unmatched target counts as unrestricted — while still being dispatched to the route.
+##### OAuth2 cached tokens are shared per host
-Requests that differ from the configured context-path only by case are therefore now subject to the same constraint as the exact-case form. Deployments that relied on the previous behaviour to reach a route without a challenge will now receive `401`.
+With `oauth2CacheTokens=true`, a cached OAuth2 token was only reused for the same request URI, so every new path or query (for example with `toD`) requested a new token and added an entry to a JVM-wide cache that was never pruned. The new option `oauth2CachedTokensKey` decides which requests share a cached token, and its default is now `HOST_ONLY`: one token for all requests to the same scheme, host and port. The client id, client secret, token endpoint, scope and resource indicator are [...]
-### camel-spring-redis - the default serializer applies a deserialization filter
+#### Credentials restricted to configured authority on redirect
-The default serializer, `JdkSerializationRedisSerializer`, now installs a JEP-290 `java.io.ObjectInputFilter` while reading Redis payloads, resolved through `DeserializationFilterHelper`. Previously no filter was applied at all. This affects both the consumer, which deserializes the payload of every message published to the subscribed channels, and the producer read commands, which deserialize the values stored in Redis.
+Credentials are no longer sent to an authority the endpoint was not configured with. Two paths reached that outcome once `followRedirects=true`, since a redirect target is chosen by the remote server rather than by the route:
-When no explicit pattern is configured, the JVM-wide `jdk.serialFilter` is honoured if set, otherwise the shared Camel default allow-list is applied (it permits standard Java and Apache Camel types, denies `java.net.**`, and enforces JEP-290 graph-shape limits). Routes that exchange classes outside that allow-list must widen it through the new `deserializationFilter` endpoint option, for example:
+- The OAuth2 interceptor is registered with `addRequestInterceptorFirst`, and HttpClient runs protocol-level request interceptors inside `ProtocolExec`, which sits below `RedirectExec` — so it ran again for every redirect hop and re-attached `Authorization: Bearer <token>` to whatever authority the `Location` header named. The token is now attached only for the endpoint’s own scheme, host and effective port.
+
+- `authHost` is optional and unset in the common basic-auth configuration, which made the credentials scope `new AuthScope(null, -1)` — any host, any port, any scheme — so HttpClient offered the credentials to whichever host issued a `401` challenge. The scope now falls back to the endpoint’s host when `authHost` is not set and is restricted to the endpoint’s scheme and effective port.
+
-```java
-from("spring-redis://localhost:6379?command=SUBSCRIBE&channels=myChannel"
- + "&deserializationFilter=com.example.model.**;java.**;!*")
-```
+Routes that relied on credentials following a redirect to a different authority must set `authHost` explicitly, which continues to take precedence and preserves the previous any-port behaviour.
-Setting the `serializer` option to a custom `RedisSerializer` bypasses the filter entirely, since Camel then no longer controls how the payload is read.
+`HttpComponent.createHttpClientConfigurer(Map, boolean)` remains the protected customization point and is still invoked when an endpoint is created, so existing subclasses continue to behave as before.
-### camel-spring-redis - SpringRedisIdempotentRepository.remove returns false for a missing key
+### camel-huaweicloud-obs, camel-alibaba-oss and camel-aws2-s3-vectors - objects whose exchange is in flight
-`SpringRedisIdempotentRepository.remove` now returns `false` when the key was not in the repository, as documented by `IdempotentRepository`. It previously returned `true` for any key. The Idempotent Consumer does not use the returned value.
+The `camel-huaweicloud-obs` and `camel-alibaba-oss` consumers no longer consume an object again while an exchange of an earlier poll is still processing it, which happened with an asynchronous route (for example `to("seda:…")`), so the next polls now skip such an object. With `deleteAfterRead=false` (and `moveAfterRead=false`) the object is consumed again by a later poll once its exchange is done, as before. A listed object that no longer exists when it is downloaded (for example delete [...]
-### camel-langchain4j
+The `camel-aws2-s3-vectors` consumer with `deleteAfterRead=true` no longer consumes a vector again while its exchange is still in flight. A vector whose exchange failed is still consumed again by a later poll.
-The legacy `sse` `transportType` has been removed. It follows the support removal in [langchain4j-core 1.19.0](https://github.com/langchain4j/langchain4j/commit/7f4e99fd637137ab9d3bf116eb62047ac757a818).
+### camel-ibm-cos - objects in progress in the consumer
-### camel-langchain4j-embeddings
+With `fileName` set, the consumer now skips the object while an exchange of an earlier poll is still processing it, as it already did when listing the bucket (with `deleteAfterRead=false` it is consumed again once its exchange is done). The objects of a poll that a stopping consumer does not process are no longer kept in the `inProgressRepository`, so they are consumed when the route is started again, and their content streams are closed.
-The `langchain4j-embeddings` component now supports **batch embedding**. When the message body is a `List` (of `String` or `TextSegment`), the producer calls `model.embedAll()` instead of `model.embed()`. The resulting `List<Embedding>` is set in the `CamelLangChain4jEmbeddingsEmbeddings` header, and the original text segments are preserved in the `CamelLangChain4jEmbeddingsTextSegments` header for downstream use by the embedding store component.
+### camel-ibm-secrets-manager - a lookup without a secret group uses the default group
-### camel-langchain4j-embeddingstore
+The `ibm:` properties function now uses the `default` secret group when the lookup does not specify one, such as `{{ibm:route}}`. Previously such a lookup failed when it was the first one, and otherwise reused the secret group of whichever lookup ran before it (possibly from another thread). Specify the group, such as `{{ibm:mygroup:route}}`, to read a secret from another group.
-The ADD operation now supports **batch operations** (via `addAll`) and **caller-supplied IDs**. When the `CamelLangChain4jEmbeddingsEmbeddings` header is present with a `List<Embedding>`, the component uses batch operations. Caller-supplied IDs are provided via the `CamelLangchain4jEmbeddingStoreEmbeddingId` (single) or `CamelLangchain4jEmbeddingStoreEmbeddingIds` (batch) headers.
+### camel-infinispan
-The REMOVE operation now supports **batch removal by collection of IDs** (pass a `Collection<String>` as the body) and **filter-based removal** (set a `Filter` in the `CamelLangchain4jEmbeddingStoreFilter` header). Previously, passing a null or empty body to REMOVE would pass `null` to the underlying store’s `remove()` method, which threw an opaque exception from langchain4j. It now throws `IllegalArgumentException` with a clear message listing the expected inputs.
+#### Header metadata and deprecations
-### camel-lucene
+The `CamelInfinispanOperationResult` header is deprecated. It has not been set or read by the component since the remote and embedded components were split, so a route reading it received nothing. Use `CamelInfinispanOperationResultHeader` to name the header that carries the result of an operation; without it the result is placed in the message body, as before.
-`LuceneSearcher.close()` no longer closes the `Analyzer` passed to `open()`; code that uses `LuceneSearcher` directly must close its analyzer itself when it is no longer needed.
+The `CamelInfinispanIgnoreReturnValues` header is now documented as a producer header rather than a consumer one. It has always been read on the producer path, so only its group in the catalog and in the documentation changes.
-### camel-ftp, camel-sftp, camel-ftps, camel-mina-sftp, camel-azure-files, camel-smb
+#### Aggregation repository recovery store
-The remote-file consumers now ensure the path resolved for a polled file stays within the directory being polled. The file name that path is built from is reported by the remote server in its directory listing and is not guaranteed to be a single path segment, so a listing entry containing `../` sequences could previously resolve to a path outside the configured directory and be used as the operand for retrieving, deleting or renaming a file.
+`InfinispanAggregationRepository` implements `RecoverableAggregationRepository`, but it had no recovery store: `remove` deleted the completed exchange outright, `confirm` removed the exchange id from a cache keyed by correlation key, and `scan` returned the correlation keys of the aggregations still in progress. The recovery task therefore re-delivered aggregations that were still accumulating, marked them `CamelRedelivered`, and sent them to the dead letter channel once `maximumRedelive [...]
-The containment check honours the existing `jailStartingDirectory` option (default `true`), consistent with the file producer and with the `localWorkDirectory` download path; set `jailStartingDirectory=false` to disable it. A file that resolves outside the configured directory is now skipped, and a warning is logged.
+A completed exchange is now kept in the same cache under a `camel-recovery:<exchange id>` key until it is confirmed, which is what `scan` reports and `recover` reads. `getKeys` continues to report only the aggregations in progress.
-Ordinary listings are unaffected, as a listed name is normally a single path segment, and a `../` that still resolves back inside the polled directory remains accepted. Two configurations can newly see files skipped: a server that reports names navigating above the polled directory, and a `fileName` expression (used when `useList=false`) that navigates above it. Set `jailStartingDirectory=false` if such a path is intended.
+Routes that set `useRecovery=false` are unaffected. Routes that left recovery enabled, which is the default, stop seeing in-progress aggregations re-delivered, and start seeing genuine recovery. The cache now also holds one entry per completed and not yet confirmed exchange; those entries are removed on confirmation.
-### camel-mina-sftp - the producer applies the charset and allowNullBody options
+#### Clustered routes stop when cluster view is stopped
-The producer wrote a String body in the charset of the exchange (UTF-8 unless the exchange sets another one) and ignored the `charset` option of the endpoint, unless the exchange had been created by that endpoint (for example by a `ProducerTemplate` sending to it directly). It now writes the file in the configured `charset`, as camel-sftp does. A null body with `allowNullBody=true` now writes an empty file instead of failing. When `charset` is set, non-String bodies (such as `byte[]`, `I [...]
+When an Infinispan cluster view (`camel-infinispan` or `camel-infinispan-embedded`) is stopped while this member is the leader, for example with the `stopView` JMX operation, the stop of the cluster service or the stop of the clustered route controller, the listeners are now told that the leadership is lost, before the leader key is removed from the cache. The clustered routes (`ClusteredRoutePolicy`) and the `master` consumers are then stopped. Previously they kept running while the lea [...]
-### camel-salesforce
+An error while refreshing the leader key no longer stops the periodic refresh of the leadership. The leadership is given up (so the clustered routes are stopped) until the next refresh succeeds, as this member can no longer be sure that it holds the leader key. An error while refreshing only the membership entry of this member keeps the leadership.
-The `camel-salesforce-maven-plugin` now supports JWT and Client Credentials authentication in addition to the existing Username-Password flow.
+### camel-javascript and camel-python
-A new `authenticationType` configuration property allows explicitly selecting the authentication type. When not set, the plugin auto-detects the type from the provided credentials, matching the behavior of the Salesforce component. The `userName` property is no longer required, as it is not needed for the Client Credentials flow.
+#### GraalJS Engine sharing and value conversion
-See the plugin’s `README.md` for the required properties per authentication type.
+The `js` language now shares one GraalJS `Engine` per language instance (a `Context` is still created per evaluation), so the engine is built when the `CamelContext` starts instead of on every evaluation.
-### camel-as2
+Values returned by a script are now converted to plain Java objects before the script’s `Context` is closed. Previously a JavaScript object, array, `Map`, `Set` or `Date` came back as a polyglot `Value` bound to a `Context` that had already been closed, and reading it failed. A script now returns a `LinkedHashMap` for an object or a JavaScript `Map`, an `ArrayList` for an array, a `LinkedHashSet` for a `Set` and a `java.time.Instant` for a `Date`. Code that handled the polyglot `Value` i [...]
-The AS2 server no longer attaches the configured `mdnUserName` / `mdnPassword` / `mdnAccessToken` credentials to an asynchronous MDN unless the delivery address names a host the operator has authorised.
+`JavaScriptHelper.newContext()` is deprecated: contexts are created by the language from its shared engine.
-The delivery address comes from the `Receipt-Delivery-Option` header of the received AS2 message, so it is chosen by the sender. A new option lists the hosts an asynchronous MDN may be delivered to:
+#### Script variables use the Groovy names
-```text
-as2://server/listen?asyncMdnAllowedHosts=partner.example,partner2.example
-```
+The `js` and `python` languages now bind the script variables with the names the `groovy` language uses: `camelContext`, `request`, `header`, `exchangeProperty`, `exchangeProperties` and `exception` are new, next to `exchange`, `exchangeId`, `message`, `body`, `headers`, `variable` and `variables`. In `js` and `python` the `context` and `properties` variables are deprecated in favour of `camelContext` and `exchangeProperties`; they still work. The new `python3` language binds only the Gr [...]
-- When `asyncMdnAllowedHosts` is set, an asynchronous MDN whose delivery address names a host outside the list is refused, and the credentials are attached only for a host on the list.
-
-- When it is not set, the MDN is still delivered to the sender-supplied address, as before, but **no credentials are attached** and a warning naming the option is logged.
-
+### camel-jbang
-Deployments that rely on authenticating to a partner’s asynchronous MDN endpoint must add that partner’s host to `asyncMdnAllowedHosts`.
+#### Runtime option and project execution
-Two further checks are applied to the delivery address regardless of the option: the scheme must be `http` or `https`, and an address with no explicit port now uses 80 for `http` (443 for `https`) rather than being passed to the socket as `-1`.
+The `--runtime` option of `camel run` has a new default value `jbang`, which is the existing in-process behaviour (the integration runs inside the Camel CLI JVM). The `main` (or `camel-main`) runtime now behaves like `spring-boot` and `quarkus`: the integration is exported to a temporary Camel Main project, built with Maven, and run in a separate JVM (the packaged runner JAR is started with `java`). This gives a JVM with the same classpath as an exported project, which resembles a produc [...]
-`https` delivery is supported when the AS2 endpoint has `sslContextParameters` configured: the manager builds an `SSLSocket` from it, defaults the port to 443, and verifies the delivery host against the certificate the peer presents. When no `sslContextParameters` is configured an `https` address is refused (fail-closed) rather than written in cleartext to the TLS port.
+Running a directory (`camel run .` or `camel run mycode`) is now the same as `--source-dir`: the route files in its subfolders are loaded too, and in `--dev` mode changed and new files are reloaded (before, the directory was expanded to the files directly in it, and in `--dev` mode `camel run .` reloaded nothing). A directory with a `pom.xml`, and the `spring-boot` and `quarkus` runtimes, still run the files directly in the directory.
-### camel-ibm-cos
+Running an existing Maven project (`camel run pom.xml`) is unchanged, and still detects the runtime from the `pom.xml`. The other commands that take `--runtime` (such as `camel export`, `camel dependency list` and `camel version list`) accept `jbang` as an alias for `main`.
-The `CACHE_CONTROL` header constant’s value has been corrected from the misspelled `CamelIBMCOSContentControl` to `CamelIBMCOSCacheControl`, so the header name matches the Cache-Control metadata it carries. This is a breaking change for routes that reference the header by its literal string name: they must switch to `CamelIBMCOSCacheControl`, although the change is trivial to adapt. Routes using the `IBMCOSConstants.CACHE_CONTROL` constant are unaffected.
+The file watcher reload strategy (camel-support) now emits the `CamelContextReloadFailure` event when a single file fails to reload, with the file name as the event’s action; before, only a failed reload of the whole context emitted it. A listener of that event fires for these failures too. `camel run` uses it to print the report of `camel validate yaml` when a YAML route file does not load, at start and on a reload in `--dev` mode.
-### camel-ibm-cos - objects in progress in the consumer
+The YAML that `camel init` writes (`camel init foo.yaml`, and the Integration and Kamelet templates), the bundled examples (`camel init --example`) and the routes the `camel_ai_pipeline_scaffold` and `camel_openapi_scaffold` MCP tools generate are now written in the canonical YAML DSL format, with an expression under `expression:` and a step as a map of its options (`setBody: {expression: {simple: {expression: "…"}}}`, `log: {message: "…"}`, `to: {uri: "…"}`). The compact notation the [...]
-With `fileName` set, the consumer now skips the object while an exchange of an earlier poll is still processing it, as it already did when listing the bucket (with `deleteAfterRead=false` it is consumed again once its exchange is done). The objects of a poll that a stopping consumer does not process are no longer kept in the `inProgressRepository`, so they are consumed when the route is started again, and their content streams are closed.
+`camel export` keeps a Groovy script that a route references as a resource (`resource:classpath:mapping.groovy` or `resource:file:mapping.groovy`, a mapping script used as the body of an expression) at the resources root, where the reference resolves in the exported project. Other Groovy files go to `src/main/resources/camel-groovy` as before, where they are compiled as scripts at startup.
-### camel-ibm-secrets-manager - a lookup without a secret group uses the default group
+`camel run` now looks up a `classpath:` or `file:` resource that is not found in the directories of the route files (the working directory first), the way it already did under `--source-dir`. A script next to the route is found as `resource:classpath:mapping.groovy`, the reference that also works in the project `camel export` writes, where before only `resource:file:mapping.groovy` worked in the CLI. A resource that exists nowhere fails as before, named as written.
-The `ibm:` properties function now uses the `default` secret group when the lookup does not specify one, such as `{{ibm:route}}`. Previously such a lookup failed when it was the first one, and otherwise reused the secret group of whichever lookup ran before it (possibly from another thread). Specify the group, such as `{{ibm:mygroup:route}}`, to read a secret from another group.
+`camel run` adds `camel-groovy` as a dependency when a `.groovy` file is given, so the file is compiled without `--dep=camel-groovy`; before, the file was silently ignored unless the dependency was added. The dependency is also written to the run settings, so `camel export` includes it.
-### camel-knative
+With `--runtime=quarkus`, the Quarkus Platform resolved for a released Camel version is now cached for 7 days under `~/.camel/quarkus-extension-registries`, next to the Quarkus Extension Registry response, which is still fetched at most once a day. Only a platform that carries exactly the requested Camel version is cached; a `-SNAPSHOT` Camel version is never cached. `--fresh` clears both caches. A registry with an explicit port in `--quarkus-ext-registry` (or `camel.jbang.quarkusExtensi [...]
-The Knative HTTP consumer no longer returns the stack trace of a failed exchange to the caller.
+`camel validate source`, and the `camel_validate_source` and `camel_write_file` MCP tools, now check the routes of Java and XML DSL files as they check YAML routes: the endpoint URIs against the catalog (also those built with the endpoint DSL or from a constant), simple expressions, and a `to` whose URI holds `${...}` and should be a `toD`. A Java file used to be checked only by the compiler and an XML file only for being well formed, so a file that validated before can now report errors [...]
-When a route consuming from `knative:endpoint/…` or `knative:event/…` failed, the response body was the exception’s full stack trace, sent as `text/plain`. A new `muteException` consumer option controls this, and it defaults to `true` — the same default the HTTP consumers carry (`camel-http-common` and therefore `camel-servlet` and `camel-jetty`, plus `camel-http`, `camel-platform-http`, and `camel-netty-http` and `camel-undertow` since 4.21.0).
+`camel kubernetes run --cluster-type=<type>` now uses the given cluster type. Before, unless `--disable-auto` was set, the detected cluster type (OpenShift, Minikube or Kubernetes) replaced it, together with its image settings. The defaults of the cluster type still apply, also to an explicit type (Minikube: `--image-builder=docker` and, with the docker builder, `--image-push=false`; OpenShift: the current namespace as `--image-group`), but they no longer replace an `--image-builder` or [...]
-The response status is unchanged: a failed exchange still returns 500 (or whatever `CamelHttpResponseCode` the route set), only the body is now empty.
+#### MCP servers authoring tools
-A route that relies on the stack trace reaching the caller must opt back in explicitly:
+The Camel authoring tools for AI agents are now defined once, in `camel-jbang-core`, and exposed under the same `camel_` names by both MCP servers, `camel mcp` and `camel tui --mcp`: `camel_catalog_doc`, `camel_catalog_find`, `camel_validate_source`, `camel_get_files`, `camel_write_file`, `camel_run`, `camel_control`, `camel_get_log`, `camel_get_errors`, `camel_eval_expression` and `camel_error_diagnose`.
-```text
-knative:endpoint/myEndpoint?muteException=false
-```
+The `camel_write_file` tool, when an integration of the project is selected and runs in dev mode, waits up to eight seconds for the reload of the written file and answers with its outcome (`reload.status` reloaded, failed with the cause and the validator’s report, properties, or unknown), so an agent does not go on with a route that did not load. A write with no selected integration answers as before.
-`org.apache.camel.component.knative.spi.KnativeTransportConfiguration` gains a fourth constructor argument for the flag. The three-argument constructor is retained and mutes the exception, so existing code compiles unchanged and picks up the new default.
+The `validate` argument of `camel_write_file` is gone: the write always validates the content and refuses an invalid file. A model given the switch turned it off on its own, and the file then failed to load.
-Setting `camel.knative.client.ssl.enabled=true` without also configuring `camel.knative.client.ssl.truststore.path` or `camel.knative.client.ssl.trust.cert.path` used to install a trust manager that accepts every certificate, so enabling TLS was what disabled certificate validation. No option named `trustAll` was involved.
+The authoring set has a new tool, `camel_edit_file`: it replaces one snippet of a file, given the exact text to find and what to put there, and validates and reloads the result as a write does. A model that rewrites a whole file to change one step corrupts the lines it did not mean to touch, so this is the tool for a change to an existing file; `camel_write_file` writes a new one. Several places of one file are changed in one call with its `edits` argument (a list of find and replace), s [...]
-The client now leaves the trust options unset in that case, which means the JVM default trust anchors apply — the same fallback `SSLContextParameters` and the rest of Camel use. Accepting any certificate is still available, but has to be asked for with the new `camel.knative.client.ssl.trust.all=true` property.
+`camel_eval_expression` evaluates any language, not only the ones on the server’s own classpath: the component of a language such as `jsonpath`, `jq` or `xpath` is downloaded on first use, as `camel run` downloads what a route needs, and the answer names it in `downloaded`. A failing expression also carries the catalog’s syntax error and the position where it breaks.
-Deployments that relied on the previous behaviour — a development cluster with a self-signed certificate, for example — must either configure a truststore or set `camel.knative.client.ssl.trust.all` explicitly. `KnativeOidcClientOptions` extends this class and is affected the same way.
+The `camel_run` tool, when no files are named, starts the project with `camel run --source-dir=.` instead of listing the directory’s files: the directory is watched, so a file added afterwards (a bean file, a Java class under `src/main/java`) is part of the app and reloaded in dev mode, and a `restart` starts the same way. Naming files keeps the previous behaviour. The `camel_control` tool gets a `reload` action, what `camel cmd reload` does.
-A Knative consumer with `reply=false` now answers a failed exchange with its error status instead of `204 No Content`.
+In the TUI MCP server the tools `tui_catalog_doc`, `tui_validate_source`, `tui_write_file`, `tui_get_files`, `tui_control`, `tui_get_log`, `tui_get_errors` and `tui_eval_expression` were renamed to the `camel_` names above; the `tui_` prefix is now reserved for the tools that only make sense in front of the screen. Update MCP clients, prompts and ACP permission lists that name them. `camel_eval_expression` no longer fails when no integration is selected but evaluates the expression in a [...]
-Such a consumer answered `204 No Content` to every request, also when the route failed, so Knative took the event as delivered and did not send it again. A failed exchange now keeps its status (500, or the `CamelHttpResponseCode` header the route set) with an empty body, as with `reply=true`. Successful exchanges still get `204 No Content`.
+In `camel mcp` the `camel_catalog_doc` tool changed: it now takes the artifact `name` and `kind` (not a page name such as `kafka-component`) and returns the structured documentation with options and URI rules; `includeDoc=true` adds the AsciiDoc page the tool used to return on its own. `camel_error_diagnose` returns the same JSON fields as before. The new file, run and control tools are hidden by the `read-only` access level of the security layer; the server does not ask before writing a [...]
-### camel-paho
+`camel-jbang-core` now depends on `camel-yaml-dsl-validator` for the source validation behind these tools.
-When `automaticReconnect=true` and the MQTT broker reconnects, the consumer now restarts the route if the post-reconnect `subscribe()` call fails. Previously a failed resubscription (for example, when the broker does not send a SUBACK and the Paho keepAlive timer triggers `MqttException 32000`) was only logged at ERROR level with no recovery action, leaving the route in `Started` state while silently consuming no messages (zombie state).
+The older `camel mcp` tools that asked the same questions as the shared tools were removed, so a client no longer has two near-identical tools to pick from. Update MCP clients and prompts that name them:
-If the resubscribe fails and the consumer owns the MQTT client (the default), it automatically stops and restarts the route to force a clean reconnect. If the restart also fails (for example, the broker is still unavailable), the route is left in `Stopped` state. With `cleanSession=true`, the consumer unsubscribes before disconnecting; with `cleanSession=false`, it keeps the durable subscription. Routes using a user-provided client are not affected by this change. Configuring Camel’s `Su [...]
+
+| Removed tool | Use instead |
+| --- | --- |
+| `camel_catalog_component_doc`, `camel_catalog_dataformat_doc`, `camel_catalog_language_doc`, `camel_catalog_eip_doc` | `camel_catalog_doc` with the `kind` (`optionsFilter`, `includeOptions`, `includeHeaders`, `includeDoc`) |
+| `camel_catalog_component_maven` | `camel_catalog_doc`, which returns the Maven coordinates |
+| `camel_catalog_components`, `camel_catalog_dataformats`, `camel_catalog_languages`, `camel_catalog_eips` | `camel_catalog_find` with the `kind` (the EIP aliases such as `fan-out` and `dedup` match) |
+| `camel_validate_yaml_dsl`, `camel_validate_route` | `camel_validate_source`; an endpoint URI alone is checked by `camel_catalog_doc` with `endpoint` |
+| `camel_runtime_eval` | `camel_eval_expression` |
+| `camel_runtime_errors` | `camel_get_errors` |
+| `camel_runtime_stop` | `camel_control` with `action=stop` |
-```properties
-camel.routeController.enabled = true
-camel.routeController.backOffDelay = 2000
-camel.routeController.backOffMaxDelay = 60000
-```
+The shared catalog tools answer for the Camel version in use, or the `camelVersion` given; the `runtime` (`spring-boot`, `quarkus`) and `platformBom` arguments of the removed tools have no equivalent there. The `camel_build_integration` prompt names the shared tools now.
-### camel-paho-mqtt5
+#### Terminal UI (TUI) and AI panel
-When `automaticReconnect=true` and the MQTT broker reconnects, the consumer now restarts the route if the post-reconnect `subscribe()` call fails. Previously a failed resubscription (for example, when the broker does not send a SUBACK and the Paho keepAlive timer triggers `MqttException 32000`) was only logged at ERROR level with no recovery action, leaving the route in `Started` state while silently consuming no messages (zombie state).
+The F8 AI panel now sends only a core subset of its `tui_*` tools to local providers (Ollama, or any provider on `localhost`); the drawing, animation and automation tools are left out to keep the prompt small for local models. Hosted providers are unaffected. Use `/tools full` in the panel, or set `camel.tui.ai.tools=full`, to restore the previous behaviour. Requests to Ollama now also set `keep_alive` to 30 minutes and a `num_ctx` chosen once per model: `OLLAMA_CONTEXT_LENGTH` when set [...]
-If the resubscribe fails and the consumer owns the MQTT client (the default), it automatically stops and restarts the route to force a clean reconnect. If the restart also fails (for example, the broker is still unavailable), the route is left in `Stopped` state. Routes using a user-provided client are not affected by this change. Configuring Camel’s `SupervisingRouteController` allows the framework to keep retrying with exponential backoff until the broker recovers:
+`camel tui --record` is now rejected when combined with `--web`. The recording configuration applies to the whole process, so a browser session served by `--web` would be recorded into the same `.cast` file as the local session. Previously the combination was accepted, but recording never produced any output, so run the two modes in separate processes instead.
-```properties
-camel.routeController.enabled = true
-camel.routeController.backOffDelay = 2000
-camel.routeController.backOffMaxDelay = 60000
-```
+#### camel\_transform\_route tool
-### camel-http
+The `camel_transform_route` tool now converts with the same route DSL converter as `camel transform route --format=java`. It reads the routes without running them, so a Java route is no longer compiled. Instead it is read by the Java DSL parser, and a route the parser cannot read (such as a processor lambda) is refused with the reason. Property placeholders are kept as written instead of being resolved.
-The OAuth2 client-credentials token cache was keyed on the request URI, the client id and the client secret only. `oauth2Scope`, `oauth2TokenEndpoint` and `oauth2ResourceIndicator` all shape the token that gets minted, but none of them was part of the key, and the cache is a static map shared by every endpoint and every `CamelContext` in the JVM. A route configured with a narrow scope could therefore be handed a broad-scope token that another route had cached first for the same target an [...]
+In return, Java is also a target format, and rests, route templates, route configurations and beans are converted instead of only routes. A new `notes` field of the result lists what differs or is not carried over.
-All three are now part of the key. Deployments that were unknowingly sharing a token across differing scopes, token endpoints or resource indicators will now request one token per distinct combination, so the token endpoint sees more requests than before.
+#### DataWeave conversion error handling in directory mode
-#### OAuth2 cached tokens are shared per host
+The `camel transform dataweave` CLI command previously let a `DataWeaveConversionException` propagate out of `converter.convert()`, which caused the entire batch to stop at the first file that triggered a parse error. The command now catches the exception per file, prints `<filename>: <error message>` to standard output, continues with the remaining files, and exits non-zero when at least one file failed. Files that convert successfully are still written to the output directory.
+
+### camel-jcr - internal Camel headers are now filtered when mapping node properties
-With `oauth2CacheTokens=true`, a cached OAuth2 token was only reused for the same request URI, so every new path or query (for example with `toD`) requested a new token and added an entry to a JVM-wide cache that was never pruned. The new option `oauth2CachedTokensKey` decides which requests share a cached token, and its default is now `HOST_ONLY`: one token for all requests to the same scheme, host and port. The client id, client secret, token endpoint, scope and resource indicator are [...]
+The `jcr` producer now applies a `HeaderFilterStrategy` when converting between JCR node properties and Camel message headers. With the default strategy, header names starting with `Camel` or `camel` (case-insensitively) are no longer copied in either direction:
-### camel-pqc
+- the `CamelJcrGetById` operation no longer maps a node property whose name is a Camel internal header (for example `CamelHttpUri`) onto the message;
+
+- the insert operation no longer persists Camel internal headers carried on the message as node properties.
+
-`FileBasedKeyLifecycleManager` stores private keys unencrypted, as Base64 PKCS#8 inside a JSON file, and used to create both the key directory and those files with whatever the process umask allowed — commonly `rw-r—r--` and `rwxr-xr-x` under the usual `022`, leaving private keys readable by every account on the host.
+Ordinary document properties are unaffected and continue to be mapped as before. A route that relies on the previous behaviour can supply a custom `headerFilterStrategy` on the `jcr` endpoint to opt out of, or narrow, the filtering.
-The key directory is now created as `rwx------` and each `<keyId>.private.json` as `rw-------`, on file systems that support POSIX permissions; elsewhere the equivalent owner-only flags are applied. A private key file left behind by an earlier version is tightened the next time that key is stored, because the file is truncated rather than recreated and would otherwise keep its original permissions.
+### camel-jgroups
-Deployments where another account legitimately reads these files — a sidecar or a backup agent running as a different user — need to run as the owner, or use a group-aware key store instead.
+#### the consumer applies a deserialization filter by default
-### camel-crypto-pgp
+The consumer maps an incoming cluster message to the exchange body by calling `org.jgroups.Message.getObject()`, which Java-deserializes the payload. The class of that body is now checked against a JEP-290 `java.io.ObjectInputFilter`, resolved through `DeserializationFilterHelper`. Previously no filter was applied at all, and any type a cluster peer sent was routed.
-The `pgp` data format verifies a message’s modification detection code only when the message is an OpenPGP symmetrically encrypted **integrity protected** data packet:
+When no explicit pattern is configured, the JVM-wide `jdk.serialFilter` is honoured if set, otherwise the shared Camel default allow-list is applied (it permits standard Java and Apache Camel types and denies `java.net.**`). Routes that exchange their own classes over the cluster must widen it through the new `deserializationFilter` endpoint option, for example:
```java
-if (pbe.isIntegrityProtected()) {
- if (!pbe.verify()) {
- throw new PGPException("Message failed integrity check");
- }
-}
+from("jgroups:clusterName?deserializationFilter=com.example.model.**;java.**;!*")
```
-The older symmetrically encrypted data packet carries no such code, so a message using it skipped the check entirely. Because the packet type is chosen by whoever produced the message, that left the sender — or anyone able to rewrite the message in transit — deciding whether the check applied. The existing `integrity` option governs marshalling only and has no decrypt-side counterpart.
+Setting `deserializationFilter=*` accepts any type and so restores the previous behavior. A refused message is not routed; it is reported to the consumer’s `ExceptionHandler`, which logs it at WARN level by default.
-A new `requireIntegrityProtection` option, **defaulting to `true`**, now rejects a message that is not integrity protected. Routes that must interoperate with a sender still emitting the legacy packet have to set `requireIntegrityProtection=false` explicitly.
+Note that JGroups deserializes the payload inside its own receive path, so this check is a defense-in-depth allow-list on the resulting body type. The JVM-wide `jdk.serialFilter`, together with a channel secured with `AUTH` and encryption, remain the primary mitigations.
-Note that `signatureVerificationOption` still defaults to `optional`, which accepts a message carrying no signature at all. Set it to `required` where the sender is expected to sign; the two options together are what give a decrypted message authenticity as well as confidentiality.
+#### the consumer refuses to start without a pre-read deserialization control
-### camel-http
+Building on the deserialization filter above, the consumer now refuses to start when it would deserialize cluster messages on the default, unauthenticated channel and no pre-read protection is configured. The class check applied after `org.jgroups.Message.getObject()` is defense-in-depth only and cannot stop code that runs during deserialization, so a pre-read control is required. A pre-read control is any of: a JVM-wide `-Djdk.serialFilter`, the JGroups-native `-Djgroups.deserialization [...]
-Credentials are no longer sent to an authority the endpoint was not configured with. Two paths reached that outcome once `followRedirects=true`, since a redirect target is chosen by the remote server rather than by the route:
+When none of these is configured, the consumer fails to start. To keep the previous behaviour of accepting any serialized type without a pre-read control, set `acceptAllObjects=true` on the consumer; this opts out of the guard and also disables the post-read class check:
-- The OAuth2 interceptor is registered with `addRequestInterceptorFirst`, and HttpClient runs protocol-level request interceptors inside `ProtocolExec`, which sits below `RedirectExec` — so it ran again for every redirect hop and re-attached `Authorization: Bearer <token>` to whatever authority the `Location` header named. The token is now attached only for the endpoint’s own scheme, host and effective port.
-
-- `authHost` is optional and unset in the common basic-auth configuration, which made the credentials scope `new AuthScope(null, -1)` — any host, any port, any scheme — so HttpClient offered the credentials to whichever host issued a `401` challenge. The scope now falls back to the endpoint’s host when `authHost` is not set and is restricted to the endpoint’s scheme and effective port.
-
+```java
+from("jgroups:clusterName?acceptAllObjects=true")
+```
-Routes that relied on credentials following a redirect to a different authority must set `authHost` explicitly, which continues to take precedence and preserves the previous any-port behaviour.
+Producers are unaffected.
-`HttpComponent.createHttpClientConfigurer(Map, boolean)` remains the protected customization point and is still invoked when an endpoint is created, so existing subclasses continue to behave as before.
+### camel-jms - request/reply completes the exchange once when a send fails late
-### camel-jetty
+An InOut exchange whose JMS send fails after the request timeout, or the reply, has already completed the exchange (for example a send that blocks longer than `requestTimeout` and then fails) is no longer completed a second time with the send exception. The send failure is logged at WARN level instead, and the exchange keeps the outcome of the timeout or the reply.
-`enableCORS=true` added `new CrossOriginFilter()` with no init parameters, so Jetty’s own defaults applied: `allowedOrigins=*` together with `allowCredentials=true`. Since the filter reflects the request’s origin rather than sending `*`, that is the credentialed any-origin configuration the fetch specification refuses to express — reflecting the origin being the usual way around that rule. An option named "enable CORS" should not mean "every origin, with credentials".
+The `cancelCorrelationId` method of `org.apache.camel.component.jms.reply.ReplyManager` (added in 4.22) now returns a `boolean`: `true` if the pending reply was cancelled, `false` if the request timeout or the reply had already taken it. A custom `ReplyManager` implementation has to change the return type.
-`allowCredentials` now defaults to `false` when CORS is enabled. The origin is still reflected, so enabling CORS keeps working for requests that carry no credentials.
+### camel-jolt - switch from unmaintained bazaarvoice jolt to the jolt-community fork
-Deployments that need credentialed cross-origin requests must ask for them explicitly:
+The JOLT library dependency has been migrated from `com.bazaarvoice.jolt:jolt-core` to `io.github.jolt-community.jolt:jolt-community-core`. See [JOLT (Community Edition)](https://github.com/jolt-community/jolt-community).
-```text
-jetty://http://0.0.0.0:8080/api?enableCORS=true
- &filterInit.allowedOrigins=https://app.example
- &filterInit.allowCredentials=true
-```
+Due to the package rename from `com.bazaarvoice.jolt` to `io.joltcommunity.jolt`, users who plug custom `Transform` or `ContextualTransform` classes into a Chainr spec need to update their imports to `io.joltcommunity.jolt.Transform` and `io.joltcommunity.jolt.ContextualTransform`. Users referencing `Removr` directly also need to update their import to `io.joltcommunity.jolt.removr.Removr`.
-Setting `filterInit.allowCredentials=true` while leaving `filterInit.allowedOrigins` unset or `*` is logged as a warning at startup, because that combination lets any origin make credentialed requests.
+### camel-jooq - an entity whose exchange failed is not deleted
-The same change was made to camel-platform-http-vertx.
+With `consumeDelete=true` (the default) the consumer deleted every entity of a poll after the batch, also the entities whose exchange failed (a failed route sets the exception on the exchange instead of throwing it), so those rows were lost. The consumer now deletes only the entities whose exchange completed successfully; an entity whose exchange failed (or was marked rollback only), or that was not processed because the route was stopping (when a graceful shutdown starts in the middle o [...]
-### camel-mllp
+### JSON data formats - marshal a body that is already JSON text
-`logPhi` now defaults to `false`. It previously defaulted to `true`, so message content — which for MLLP is patient data by definition — reached the log at the default INFO/WARN levels with no configuration at all. Set `logPhi=true` on the component to restore the previous behaviour.
+`marshal` with a JSON data format (`marshal: json`, with Jackson, Jackson 3, Gson, JSON-B or Fastjson) now writes a body that is already the JSON text as it is, instead of serializing it as a Java object:
-Payload-bearing log paths that ignored the flag no longer do, including: `MllpSocketBuffer.readFrom` (the partial-payload warning, which logs the content of a legitimate in-flight message from a slow sender, not only unexpected bytes) and `MllpSocketBuffer.readSocketInputStream` (the bytes-before-START\_OF\_BLOCK warning), the invalid and partial-payload warnings in `TcpSocketConsumerRunnable`, and acknowledgement debug logging. Where content is suppressed the log now shows `<PHI suppressed>`.
+- a file, an `InputStream` (or stream cache) and a `byte[]` are written as they are; before, they were serialized as objects (with Jackson the stream and the file failed with "No serializer found" and the bytes became a Base64 string)
+
+- a `String` whose text is a JSON object or array (it starts with `{` and ends with `}`, or `[` and `]`) is written as it is; before, it was written as one JSON string, `"{\"sku\": …}"`. Any other `String` is still written as a JSON string (`"hello"`).
+
-The suppression is applied at the log statements, through a new `Hl7Util.convertToLoggableString`, rather than inside `convertToPrintFriendlyString`: that method is not a logging helper — it also extracts the MSH-9 field when an acknowledgement is generated, so redacting inside it would corrupt acknowledgements.
+POJOs, maps and lists are marshalled as before. A route that relied on a JSON `String` being encoded as a JSON string literal can wrap the value in an object, or set the body to the quoted text.
-### camel-platform-http
+### camel-jt400
-`PlatformHttpEndpoint.isHttpProxy()` selected proxy mode with `path.startsWith("proxy")` rather than an equality check, so any endpoint whose path merely began with those five characters — `proxyStats`, `proxy-health`, `proxying` — was treated as the documented `platform-http:proxy` endpoint. That has consequences beyond the name: `getPath()` returns `/` for such an endpoint, making it a catch-all, and `VertxPlatformHttpConsumer.handleProxy()` sets `Exchange.HTTP_HOST` from the request’s [...]
+The endpoint syntax in the component metadata is now `jt400:userID:password@systemName/objectPath`, which is what the component always parsed: `objectPath` is the whole path of the URI (`QSYS.LIB/MYLIB.LIB/MYQUEUE.DTAQ`, the `QSYS.LIB` prefix is not required), and the object suffix (`.DTAQ`, `.MSGQ`, `.PGM`, `.SRVPGM`) selects what the endpoint works with. The `type` path option has been removed from the metadata (catalog, documentation and the endpoint URI factory); it was never an opti [...]
-Proxy mode is now selected only by the exact path `proxy`. The check is deliberately strict: `platform-http:/proxy`, with a leading slash, did not select proxy mode before and still does not, so this can never turn an endpoint into a proxy that was not already one.
+### camel-jta, camel-spring - a transacted exchange that completes during a graceful shutdown is committed
-Routes relying on the prefix match must be renamed to the exact path `proxy`.
+Since Camel 4.19, a transacted exchange (JTA or Spring transacted routes) that was in flight when a graceful shutdown (stopping `CamelContext` or a route) started was rolled back even when it completed within the shutdown timeout. It is now committed again. Only the forced shutdown after the timeout marks the in-flight transacted exchanges for rollback; with `shutdownNowOnTimeout=false` there is no forced shutdown, so an exchange completing after the timeout is committed.
-`PlatformHttpEndpoint` wraps the endpoint’s `HeaderFilterStrategy` so that common request headers — `Authorization`, `Cookie`, `Proxy-Authorization` and the rest of `COMMON_HTTP_REQUEST_HEADERS` — are not echoed back on the response. The lookup compared names exactly against that canonically capitalised set, while exchange headers keep the casing of the inbound request. HTTP/2 requires field names to be lower case, so on an HTTP/2 request the names are `authorization`, `cookie` and so on [...]
+### camel-kafka
-Names are now compared case-insensitively. Responses that previously echoed these headers back on HTTP/2 requests no longer do.
+#### sslContextParameters and the SSL endpoint options
-### camel-grpc
+When `sslContextParameters` is configured (also using global SSL with `useGlobalSslContextParameters`), the SSL endpoint options (such as `sslTruststoreLocation`) are now applied after the `sslContextParameters`, as documented. Previously the SSL endpoint options were ignored when `sslContextParameters` was configured.
-The gRPC consumer no longer returns the route exception’s message to the client.
+When `sslContextParameters` is configured and `securityProtocol` is the default (`PLAINTEXT`), the security protocol `SSL` is now used. Previously `PLAINTEXT` was used unless `securityProtocol` (or `saslAuthType`) was configured.
-When an exchange failed, `GrpcMethodHandler` built the error status with `Status.INTERNAL.withDescription(exchange.getException().getMessage())`. The description is transmitted to the client — unlike the cause attached alongside it, which stays local — so any remote-triggerable failure handed the caller internal detail.
+#### a suspended consumer keeps its partitions
-A new `muteException` consumer option controls this, and it defaults to `true`, the same default the HTTP consumers carry. The status code is unchanged; only the description is replaced, with `Exchange processing failed`.
+A route started with its consumer suspended, for example by a `ThrottlingExceptionRoutePolicy` with `keepOpen=true`, now starts its Kafka consumer: the consumer joins the consumer group and holds its assigned partitions paused until the route is resumed. Previously its fetcher thread ended at once, so it never connected, and the other members of the group consumed those partitions while the circuit was open; now they stay with this consumer, as for a route suspended while it runs. A susp [...]
-A route that relies on the exception message reaching the client must opt back in explicitly:
+#### shared client code moved to camel-kafka-common
-```text
-grpc://localhost:8080/org.example.MyService?muteException=false
-```
+The Kafka client code that the `kafka` component shares with other Kafka based components has been moved from `camel-kafka` into a new `camel-kafka-common` module. This includes `KafkaClientConfiguration` (the base class of `KafkaConfiguration`), `AbstractKafkaComponent`, `KafkaConstants`, `KafkaHeaderFilterStrategy`, the header serializers and deserializers (`org.apache.camel.component.kafka.serde`), `KafkaSecurityConfigurer` and `KafkaAuthType`, `PollExceptionStrategy`, `PollOnError`, [...]
-#### Failed exchanges with the AGGREGATION and PROPAGATION consumer strategies
+`camel-kafka` depends on `camel-kafka-common`, so nothing changes for applications that depend on `camel-kafka`. If you build your classpath without transitive dependencies, add the `camel-kafka-common` dependency:
-With the `AGGREGATION` and `PROPAGATION` consumer strategies (client streaming and bidirectional streaming calls), a failed exchange now ends the call with an `INTERNAL` error, like unary and server streaming calls already did (the description follows the `muteException` option). Before, the message body of the failed exchange was sent to the client as a regular response. With `PROPAGATION` (the default strategy) the first failed exchange ends the whole call, so the messages that the cli [...]
+```xml
+<dependency>
+ <groupId>org.apache.camel</groupId>
+ <artifactId>camel-kafka-common</artifactId>
+ <version>${camel.version}</version>
+</dependency>
+```
### camel-keycloak
@@ -1736,178 +1884,190 @@ Issuer validation is opt-in, so an operator who enabled it is asking for tokens
Deployments whose introspection endpoint omits `iss` must either have it include the claim, or turn `validateIssuer` off. The locally verified JWT path is unaffected — it uses Keycloak’s own `TokenVerifier.RealmUrlCheck`.
-### camel-mina
+### camel-knative
-The Mina consumer no longer writes the route’s exception back to the remote peer.
+The Knative HTTP consumer no longer returns the stack trace of a failed exchange to the caller.
-When an exchange failed and `transferExchange` was not enabled, the consumer wrote `exchange.getException()` — the `Throwable` itself — over the socket. With a textline codec the peer received its class and message; with the object codec it received the serialised exception, cause chain and stack trace included.
+When a route consuming from `knative:endpoint/…` or `knative:event/…` failed, the response body was the exception’s full stack trace, sent as `text/plain`. A new `muteException` consumer option controls this, and it defaults to `true` — the same default the HTTP consumers carry (`camel-http-common` and therefore `camel-servlet` and `camel-jetty`, plus `camel-http`, `camel-platform-http`, and `camel-netty-http` and `camel-undertow` since 4.21.0).
-A new `muteException` consumer option controls this, and it defaults to `true` — the same default the HTTP consumers carry (`camel-http-common` and therefore `camel-servlet` and `camel-jetty`, plus `camel-http`, `camel-platform-http`, and `camel-netty-http` and `camel-undertow` since 4.21.0).
+The response status is unchanged: a failed exchange still returns 500 (or whatever `CamelHttpResponseCode` the route set), only the body is now empty.
-A reply is still written, so a synchronous peer is not left waiting: it is a `java.lang.Exception` with a fixed message and no stack trace, in place of the route’s own exception. A route that relies on the original exception reaching the peer must opt back in explicitly:
+A route that relies on the stack trace reaching the caller must opt back in explicitly:
```text
-mina:tcp://localhost:9000?sync=true&muteException=false
+knative:endpoint/myEndpoint?muteException=false
```
-`transferExchange=true` is unaffected — that option serialises the whole Exchange by design, and is already marked as an insecure-serialization flag.
+`org.apache.camel.component.knative.spi.KnativeTransportConfiguration` gains a fourth constructor argument for the flag. The three-argument constructor is retained and mutes the exception, so existing code compiles unchanged and picks up the new default.
-### camel-cxf
+Setting `camel.knative.client.ssl.enabled=true` without also configuring `camel.knative.client.ssl.truststore.path` or `camel.knative.client.ssl.trust.cert.path` used to install a trust manager that accepts every certificate, so enabling TLS was what disabled certificate validation. No option named `trustAll` was involved.
-The CXF consumer no longer describes an undeclared route failure in the SOAP fault returned to the caller.
+The client now leaves the trust options unset in that case, which means the JVM default trust anchors apply — the same fallback `SSLContextParameters` and the rest of Camel use. Accepting any certificate is still available, but has to be asked for with the new `camel.knative.client.ssl.trust.all=true` property.
-When a route consuming from `cxf:` failed with an exception the service contract does not declare, the exception’s message — or its class name, when it had no message — became the SOAP `faultstring`. A new `muteException` consumer option controls this, and it defaults to `true`, the same default the HTTP consumers carry (`camel-http-common` and therefore `camel-servlet` and `camel-jetty`, plus `camel-http`, `camel-platform-http`, and `camel-netty-http` and `camel-undertow` since 4.21.0).
+Deployments that relied on the previous behaviour — a development cluster with a self-signed certificate, for example — must either configure a truststore or set `camel.knative.client.ssl.trust.all` explicitly. `KnativeOidcClientOptions` extends this class and is affected the same way.
-Muting applies **only to undeclared failures**. Faults the route raises deliberately are part of the service contract and are still returned in full:
+A Knative consumer with `reply=false` now answers a failed exchange with its error status instead of `204 No Content`.
-- a CXF `Fault` or `SoapFault` thrown by the route,
-
-- an exception annotated `@WebFault` (a fault the WSDL declares),
-
-- a `Throwable` or a `CxfPayload` carrying a `<soap:Fault>` set as the message body.
-
+Such a consumer answered `204 No Content` to every request, also when the route failed, so Knative took the event as delivered and did not send it again. A failed exchange now keeps its status (500, or the `CamelHttpResponseCode` header the route set) with an empty body, as with `reply=true`. Successful exchanges still get `204 No Content`.
-Only an exception that reaches `Exchange.getException()` without a `@WebFault` annotation is replaced, by a fault reading `Exchange processing failed`.
+### camel-kubernetes
-Note that this includes framework failures, not just route exceptions. In particular, a `continuationTimeout` expiry previously returned `The OUT message was not received within: 5000 millis.` to the caller and now returns the generic fault; set `muteException=false` on that endpoint if the timeout detail is relied upon for diagnostics.
+#### trustCerts marked insecure:ssl
-A route that relies on an undeclared exception’s message reaching the caller must opt back in explicitly:
+The `trustCerts` option (shared by all 20 `camel-kubernetes` and `openshift` component endpoints via `KubernetesConfiguration`) is now marked `insecure:ssl`, so setting it to `true` is reported by the [security policy](security-policy.md) check: a warning by default, and a startup failure with the `prod` profile or `camel.security.insecureSslPolicy = fail`.
-```text
-cxf://http://localhost:8080/service?serviceClass=com.example.MyService&muteException=false
-```
+For example, if you have:
-#### A suspended consumer rejects new requests
+```properties
+camel.component.kubernetes-pods.trustCerts = true
+```
-The CXF consumers (`cxf` and `cxfrs`) are suspendable, so that a graceful shutdown keeps the CXF server running while the requests in flight complete, but a suspended consumer kept accepting and routing new requests: during a graceful shutdown (until the shutdown timeout), and while the route was suspended (route controller, JMX, route policies such as `ThrottlingInflightRoutePolicy`). A suspended consumer now rejects a new request with HTTP status 503 (Service Unavailable), like the HTT [...]
+this will now be flagged. To keep this setting under a `fail` policy, list the property in `camel.security.allowedProperties`:
-### camel-thrift
+```properties
+camel.security.allowedProperties = camel.component.kubernetes-pods.trustCerts
+```
-The `thrift` data format used to deserialize into its own `defaultInstance` and return that object to every exchange. Because Thrift’s `TBase.read()` assigns only the fields present in the incoming bytes, a message that omitted an optional field kept the value left there by the previous message, concurrent unmarshals interleaved into the same object, and all in-flight bodies were the same reference.
+#### kubernetes-configmaps developer console
-`unmarshal` now creates a copy of `defaultInstance`, clears it to the generated type’s default-constructor state, and deserializes into that copy. Each exchange therefore gets its own object, omitted fields do not inherit values set on `defaultInstance`, and `defaultInstance` itself remains untouched.
+The `kubernetes-configmaps` developer console now reports the config map names and refresh settings from `camel.vault.kubernetescm` instead of reading the Kubernetes secrets vault configuration. Its text output labels the list `Config maps in use:` instead of `Secrets in use:`. Both Kubernetes vault consoles return empty lists when no resource names are configured.
-Routes that compared unmarshalled bodies by identity, or that mutated one body expecting the change to be visible on another, must be updated.
+### camel-langchain4j
-#### Consumer - failed exchanges
+#### Legacy SSE transportType removed
-The Thrift consumer now sends the exception of a failed exchange to the client as the result of the call: an exception declared by the Thrift method (such as `throws (1:InvalidOperation ouch)`) as that exception, any other exception as a `TApplicationException`. Before, with `synchronous=true` the failure was ignored (a `void` method returned normally, other methods returned the message body converted to the return type, or failed with `Return type requires not empty body`), and in the d [...]
+The legacy `sse` `transportType` has been removed. It follows the support removal in [langchain4j-core 1.19.0](https://github.com/langchain4j/langchain4j/commit/7f4e99fd637137ab9d3bf116eb62047ac757a818).
-### camel-shiro
+#### Batch embedding support
-`ShiroSecurityProcessor` used to skip the Shiro `login()` call — and therefore the credential check — when the thread-bound subject was already authenticated for the same username as the incoming `ShiroSecurityToken`. The check conflated "same principal name" with "same credentials", so once a user had authenticated on a worker thread, a later exchange presenting that username with any password was accepted for as long as the subject stayed bound.
+The `langchain4j-embeddings` component now supports **batch embedding**. When the message body is a `List` (of `String` or `TextSegment`), the producer calls `model.embedAll()` instead of `model.embed()`. The resulting `List<Embedding>` is set in the `CamelLangChain4jEmbeddingsEmbeddings` header, and the original text segments are preserved in the `CamelLangChain4jEmbeddingsTextSegments` header for downstream use by the embedding store component.
-The default `alwaysReauthenticate=true` masked this, because the processor calls `logout()` after each exchange. With `alwaysReauthenticate=false` — a documented option, which also sets `rememberMe(true)` to keep subjects long-lived — the skip was reachable.
+#### Batch operations and caller-supplied IDs
-`login()` is now called for every exchange with the credentials that exchange presented. Deployments using `alwaysReauthenticate=false` will see one realm lookup per exchange where previously matching usernames reused the bound subject; correctness aside, that is the same cost the default already pays.
+The ADD operation now supports **batch operations** (via `addAll`) and **caller-supplied IDs**. When the `CamelLangChain4jEmbeddingsEmbeddings` header is present with a `List<Embedding>`, the component uses batch operations. Caller-supplied IDs are provided via the `CamelLangchain4jEmbeddingStoreEmbeddingId` (single) or `CamelLangchain4jEmbeddingStoreEmbeddingIds` (batch) headers.
-### camel-oauth
+The REMOVE operation now supports **batch removal by collection of IDs** (pass a `Collection<String>` as the body) and **filter-based removal** (set a `Filter` in the `CamelLangchain4jEmbeddingStoreFilter` header). Previously, passing a null or empty body to REMOVE would pass `null` to the underlying store’s `remove()` method, which threw an opaque exception from langchain4j. It now throws `IllegalArgumentException` with a clear message listing the expected inputs.
-The authorization code flow now sends a `state` parameter and requires it back on the callback.
+### camel-ldif - modrdn and moddn records
-`OAuthCodeFlowProcessor` generates a random `state`, stores it in the OAuth session and includes it in the authorization request. `OAuthCodeFlowCallback` then accepts an authorization code only when the callback carries the same value, consuming it so it cannot be replayed. Previously no `state` was sent and the callback redeemed whatever `code` arrived, binding the resulting profile to the caller’s session with nothing tying the callback to a flow that session had started — the login CS [...]
+A `changetype: modrdn` record with a `newsuperior` line now moves the entry under the new superior, as RFC 2849 defines; before, the entry was only renamed in place. A `changetype: moddn` record without `newsuperior` now renames the entry in place; before, it was moved directly under the root (which servers normally refuse).
-Two callbacks that used to succeed are now answered with `400` and stop the route:
+### camel-lucene
-- no authorization code flow is in progress for the session — `No authorization code flow in progress`
-
-- the `state` is absent or does not match — `Authorization state mismatch`
-
+`LuceneSearcher.close()` no longer closes the `Analyzer` passed to `open()`; code that uses `LuceneSearcher` directly must close its analyzer itself when it is no longer needed.
-Deployments where the session is not sticky across the redirect will see the second case, because the session holding the `state` has to be the one that returns. Sessions must survive the round trip to the identity provider.
+### camel-mail
-Note that `nonce` and PKCE (`code_challenge`) are still not sent, and the session cookie is still `SameSite=None; Secure`.
+`MimeMultipartDataFormat` now uses `MailHeaderFilterStrategy` instead of a plain `DefaultHeaderFilterStrategy` when `headersInline` unmarshal copies the remaining MIME headers onto the Camel message. That strategy filters the `mail.smtp.` and `mail.smtps.` prefixes on the inbound path in addition to `Camel*`/`camel*`, so the data format now filters the same namespace the mail consumer has filtered since 4.14.9/4.18.4/4.22.0.
-### camel-oauth
+Routes that relied on `mail.smtp.*` or `mail.smtps.*` headers arriving on the exchange from an unmarshalled MIME message must set those values explicitly on the route instead. Ordinary application headers are unaffected.
-The Jakarta servlet backend (`ServletOAuth`) now evaluates the `nbf` (not before) claim of the tokens it validates, and rejects a token before that time as RFC 7519 section 4.1.5 requires. This covers the bearer token that `OAuthBearerTokenProcessor` authenticates as well as the tokens received from the identity provider. Previously only `exp` was evaluated, so a token was accepted before its `nbf` time.
+`MailBinding` now parses the content type returned by a custom `ContentTypeResolver` before adding the attachment file name as a quoted parameter, instead of concatenating the file name into the header - closing a header-injection vector via a crafted file name. As a side effect, a `ContentTypeResolver` that returns an unparsable content type now fails fast with a `ParseException` at marshal time, where before the invalid value was written into the `Content-Type` header as-is. Ensure a c [...]
-The comparison allows for the leeway, in seconds, configured on the `JWTOptions` of the OAuth configuration, which defaults to `0`. That matches the Vert.x backend, which already evaluated `nbf`, and the default of the `clock-skew-seconds` property of incoming token validation. Tokens without an `nbf` claim are not affected.
+### camel-main
-The servlet backend does not read this leeway from configuration, and `clock-skew-seconds` does not apply to it. If the identity provider’s clock runs ahead of the Camel host and it issues tokens whose `nbf` equals `iat`, raise the leeway on the `OAuth` instance:
+#### security policy check matches component options by component
-```java
-OAuthFactory factory = OAuthFactory.lookupFactory(camelContext);
-OAuth oauth = factory.findOAuth().orElseGet(factory::createOAuth);
-oauth.getOAuthConfig().getJWTOptions().setLeeway(30);
-```
+The [security policy](security-policy.md) check matched an insecure option by its name only, so an option of one component that is marked insecure was also reported for any other component, data format or language with an option of the same name. For example `tls=false` was reported for every component because of the `tls` option of `camel-pinecone`.
-### camel-platform-http-vertx
+A property that configures a component, data format or language (`camel.component.<name>.<option>`, `camel.dataformat.<name>.<option>` and `camel.language.<name>.<option>`) is now only checked against the options of that component, data format or language. This means fewer properties are reported: a setting that was reported only because another component has an insecure option of the same name no longer triggers a warning, or a startup failure with the `prod` profile. Other properties, [...]
-The CORS handler used to send `Access-Control-Allow-Credentials: true` on every response to a request carrying an `Origin` header — including responses to origins it had just decided not to allow, because the header was set outside the origin check. Combined with an unset `camel.server.cors.origins`, which makes the handler echo back whatever origin the caller sent, that produced the credentialed any-origin configuration the fetch specification forbids expressing as `*`.
+#### configuration options now applied
-Two changes:
+Some configuration options of camel-main were not applied, and are now:
-- `Access-Control-Allow-Credentials` is now sent only when the request origin matched an origin the operator explicitly configured. With `camel.server.cors.origins` unset, the origin is still reflected back as before, but credentials are not granted.
+- The backlog tracer now traces the routes of the Rest DSL by default (`camel.trace.traceRests=true`), as documented. Previously camel-main turned this off. Set `camel.trace.traceRests=false` to not trace them.
-- A `Vary: Origin` response header is now added whenever the origin is reflected, so a shared cache cannot serve one origin’s response to another.
+- Wildcard component options (such as `camel.component.seda*.queueSize=123`) are now also applied to components that are created after startup, such as when a route uses the component the first time. Previously they were only applied to the components that existed at startup.
+
+- Options of `metrics`, `otel` and `lra` configured using the Java API (such as `main.configure().metrics().withEnabled(true).withEnableMessageHistory(true)`) are now applied. When no `camel.metrics.` **(or `camel.opentelemetry.`** or `camel.lra.*`) properties are configured, the service is only enabled when `withEnabled(true)` is set (previously configuring the service using the Java API always enabled it).
+
+- The documented `camel.main.cloudPropertiesLocation` option is now used (previously only `camel.main.cloud-properties-location` worked), and override properties are no longer lost when cloud properties are loaded.
+
+- `camel.main.streamCachingBufferSize` no longer sets the buffer size to `0` when not configured, and `camel.main.streamCachingStatisticsEnabled` is now applied.
+
+- `camel.server.useGlobalSslContextParameters=false` (and `camel.management.useGlobalSslContextParameters=false`) is now honoured when global SSL is enabled.
-Deployments that relied on credentialed cross-origin requests must list the permitted origins in `camel.server.cors.origins`.
+#### profiles and precedence of ENV and JVM system properties
-### camel-platform-http-vertx - response write failures are no longer silent
+The `dev` profile no longer overrides an option that is configured with a key in another case or with dashes, such as the ENV variable `CAMEL_MAIN_SHUTDOWNTIMEOUT=5` (which becomes `camel.main.shutdowntimeout`) or `camel.main.shutdown-timeout=5`. Previously only the exact camelCase key (`camel.main.shutdownTimeout`) was recognized, and the `dev` profile default was used instead.
-A streaming response body (any `InputStream` payload) was written to the client with the deprecated Vert.x `Pump`, which discards the result of every `write()`. Failures were therefore invisible: the response write was always reported as successful, even when nothing reached the client. Writing now uses `pipe()`, which propagates those failures.
+A JVM system property now always takes precedence over the same option from an ENV variable or from a properties file, also when the keys are in another case (such as `-Dcamel.main.shutdownTimeout=22` and `CAMEL_MAIN_SHUTDOWNTIMEOUT=11`). Previously the result depended on the case of the keys.
-This is a bug fix (CAMEL-24864). A client that disconnects part way through a streaming response is now noticed, so the body stream is closed and the exchange completes. Previously neither happened, which leaked an exchange per aborted response — and, for a stream that only ends on an explicit marker, such as the Server-Sent Events stream produced by `camel-a2a`, also leaked the subscriber that the stream’s `close()` was responsible for removing.
+When the profile is set as an ENV variable or JVM system property (`camel.main.profile`), only the `application-<profile>.properties` file of that profile is loaded. Previously `Main` also loaded the properties file of a profile configured in Java (such as `main.configure().withProfile("dev")`).
-A lost client connection is logged at DEBUG and is not reported through the consumer’s `ExceptionHandler`, since a client going away is not a route failure. A failure raised while **producing** the body is still reported as before. Routes using `handleWriteResponseError=true` now see an exception on the exchange when a response write fails, including when the cause is the client disconnecting; routes that need to distinguish the two can inspect the exception cause.
+The option `camel.main.durationMaxAction` is now case-insensitive (`STOP` is the same as `stop`).
-### camel-tika
+#### global variables and the route reload pattern
-The `tika:parse` producer copies the metadata of the parsed document onto the Camel message. Those names come out of the document itself, so a document could ask for any header name at all, including names in the Camel-internal namespace — an HTML `<meta name="CamelFileName" content="…"/>`, for example, reached the message as `CamelFileName` and would then be picked up by a later `file:` producer.
+A global variable configured with a dot in its name, such as `camel.variable.global.foo.bar=1`, is now stored with the name `foo.bar`. Previously the first dot was replaced by a colon (`foo:bar`), as it is for route and group variables.
-Parsed metadata names are now filtered the same way a consumer filters names supplied by an external sender: a name that starts with `Camel`, `camel` or `org.apache.camel.` (matched case-insensitively) is skipped and logged at `DEBUG` instead of being set as a header. Metadata outside that namespace is mapped exactly as before.
+The `camel.main.routesReloadPattern` option now also matches a pattern with a directory (such as `sub/*.yaml`) against the path of the file relative to the reload directory. Previously only the name of the file was matched, so such a pattern never matched.
-Routes that deliberately read a `Camel`\-prefixed header produced by the Tika parse must set it themselves after the `tika:parse` step, for example with a `setHeader` reading the corresponding non-prefixed metadata name.
+#### properties that are not auto-configured are logged
-### camel-wasm - a failed call discards the Wasm instance
+When `camel.main.autoConfigurationFailFast=false`, camel-main now logs a WARN for each `camel.*` property that could not be applied (such as a typo in the name of an option), for example `Property not auto-configured: camel.rest.contxtPath=/api`. These warnings were never logged before. The values of sensitive options (such as passwords) are masked. With fail-fast (the default) an unknown property fails the startup as before.
-When a Wasm function fails without returning (a trap, such as a Rust `panic`), the `wasm` producer or `wasm` expression now discards its module instance and creates a new one for the next message, instead of reusing an instance whose memory kept everything the failed call had allocated. State that the module keeps between messages is reset at that point.
+When `camel.opentelemetry.` **properties are configured but OpenTelemetry is disabled (`camel.opentelemetry.enabled=false`), the `camel.opentelemetry2.`** or `camel.telemetryDev.` **properties are now used. Previously they were ignored whenever any `camel.opentelemetry.`** property was configured.
-### camel-wasm - the wasm predicate
+#### `CAMEL_COMPONENT_*`, `CAMEL_DATAFORMAT_*`, `CAMEL_LANGUAGE_*` environment variables now take effect
-The `wasm` language used as a predicate only matched a Jackson `BooleanNode` result, so with the default result type (`byte[]`) or `resultType` set to `Boolean` or `String` it never matched. The result is now evaluated with the standard Camel rules (`true`/`false` text, a `Boolean`, empty is `false`), so filters and choices that never matched before can now match. A `JsonNode` result still only matches when it is the JSON boolean `true`.
+Two bugs in \`camel-main’s environment-variable processing were fixed and are now active.
-### camel-xpath
+**Bug 1 — variables were silently ignored since Camel 3.9 (CAMEL-16345)**
-The XPath language now parses the message with the same hardened XML parser for every `documentType`.
+`filterEnvVariables` uppercases the variable names before comparing them against the supplied prefixes, so the prefixes themselves must be uppercase. Before this fix the code passed lowercase prefixes (`camel.component.`, etc.), causing every match to fail silently. This has been corrected: `CAMEL_COMPONENT_*`, `CAMEL_DATAFORMAT_*` and `CAMEL_LANGUAGE_*` variables are now actually read.
-With the default `documentType` of `org.w3c.dom.Document` the payload was already converted to a DOM through Camel’s `DocumentBuilderFactory`, which disallows a `DOCTYPE` declaration and does not resolve external entities. When `documentType` was set to `org.xml.sax.InputSource` (or `javax.xml.transform.sax.SAXSource`) the payload was instead handed straight to `javax.xml.xpath.XPathExpression`, which builds a `DocumentBuilder` of its own using the JDK defaults — so a `DOCTYPE` was accep [...]
+If your deployments intentionally set such variables but relied on them being ignored (for example to pass secrets that should not reach the component), remove the variables or set `camel.main.autoConfigurationEnvironmentVariablesEnabled=false` to opt out (note: this also disables `CAMEL_MAIN_*` and all other ENV-based configuration in `BaseMainSupport`).
-Those document types now go through the same conversion as `Document`. A message carrying a `DOCTYPE` declaration that previously evaluated is now rejected with a `SAXParseException`, matching the behaviour the default `documentType` has always had.
+Variables that refer to a name not present on the classpath (for example `CAMEL_COMPONENT_KAFKA_BROKERS` in an application that does not include camel-kafka) will fail the startup with an `IllegalArgumentException`. Variables with an empty value (for example `CAMEL_COMPONENT_SEDA_QUEUE_SIZE=` from an unset compose variable) will fail with _value is empty_. There is no per-variable opt-out: rename the variable, remove it, or set `camel.main.autoConfigurationEnvironmentVariablesEnabled=fal [...]
-A deployment that genuinely needs to parse documents with a `DOCTYPE` can relax the parser as before, through the `org.apache.camel.xmlconverter.documentBuilderFactory.feature:` system properties, for example:
+Secrets passed as component environment variables (for example `CAMEL_COMPONENT_AWS2_S3_SECRET_KEY`) will be seen by the `prod`\-profile security check as plain-text secrets and will fail the startup. The `camel.component.aws2-s3.secret-key={{env:CAMEL_COMPONENT_AWS2_S3_SECRET_KEY}}` placeholder form does not help — `filterEnvVariables` still picks up the original variable and binds its value directly. To pass a secret without triggering the security check, either rename the environment [...]
-```text
--Dorg.apache.camel.xmlconverter.documentBuilderFactory.feature:http://apache.org/xml/features/disallow-doctype-decl=false
-```
+**Bug 2 — ambiguous name resolution**
-This is not a functional change for messages without a `DOCTYPE`, and it does not add a document parse: `XPathExpression.evaluate(InputSource)` already built a full DOM internally.
+When the catalog contained component/dataformat/language pairs whose names were prefixes of each other (such as `netty` / `netty-http`, `js` / `jsonpath`, `avro` / `avroJackson`), the variable was randomly mapped to either name. A longest-match strategy now always selects the most specific name.
+
+**Known limitation — `rest` / `rest-api` and custom-named instances**
+
+`CAMEL_COMPONENT_REST_API_DOC=api.json` is matched to `camel.component.rest-api.doc` (the longer match), not to `camel.component.rest.apiDoc`. Use `CAMEL_COMPONENT_REST_APIDOC=api.json` instead (option names are matched case-insensitively). Note that using `camel.component.rest.apiDoc={{env:CAMEL_COMPONENT_REST_API_DOC}}` does not work as a workaround — `filterEnvVariables` still matches the original variable and binds it to `rest-api.doc` in addition to the placeholder.
+
+The same limitation affects custom-named component instances whose name starts with a catalog name. For example, with a component registered as `kafka-dr`, `CAMEL_COMPONENT_KAFKA_DR_BROKERS` is matched to `kafka` (the catalog entry) and becomes `camel.component.kafka.dr-brokers`, an unknown option that fails the startup. Configure such instances through `application.properties` instead: `camel.component.kafka-dr.brokers={{env:KAFKA_DR_BROKERS}}`.
+
+### camel-management
+
+#### Route group exchange counters count once per entry into the group
+
+The route group MBean (`ManagedRouteGroupMBean`) exchange counters and processing times now count each exchange once per entry into the group: calls nested inside another route of the same group are not counted again. In 4.22.1, a regression (CAMEL-24590) caused them to count once per member route instead.
+
+#### Thread pool MBeans naming and JMX improvements
+
+The thread pool MBeans of a source that creates several thread pools (such as the timeout checker and the optimistic locking pools of the Aggregate EIP) had the same name, so only the first one was registered. For a source that is not an EIP, a name or a static service, the `SourceId` attribute is now the name of the thread pool, which is also added to the MBean name: `AggregateProcessor(0x1b2c3d4e)(AggregateTimeoutChecker)` instead of `AggregateProcessor(0x1b2c3d4e)`. This also applies [...]
-### camel-core, camel-lra
+The JMX `browse` operation of the `DefaultInflightRepository` MBean and the `listAwaitThreads` data of the `DefaultAsyncProcessorAwaitManager` MBean gained a `nodeSource` column, saying where the node is in the source (such as `orders.camel.yaml:18`), next to the existing `nodeId`. It is `null` when message history or source location is disabled. Clients that read the row by item name are unaffected; a client that assumes a fixed number of columns should be reviewed.
-The saga id normally travels in the exchange’s internal state, which survives `removeHeaders("*")`. `SagaProcessor` also read it from the `Long-Running-Action` message header when that state was absent, so that a coordinator started elsewhere could be joined — the LRA protocol carries the id that way.
+`InflightRepository.InflightExchange` and `AsyncProcessorAwaitManager.AwaitThread` gained a `getNodeSource()` method for the same value. Both are `default` methods returning `null`, so existing implementations continue to compile.
-That fallback applied to every saga service, including the default `InMemorySagaService` where no external coordinator exists. The header sits outside the `Camel` namespace consumers filter, and the id is written back onto responses, so a message could name a saga and have its exchange joined to it.
+A CamelContext name (or management name) with `, = : " * ?` or a line feed made the CamelContext fail to start with JMX. These characters are now replaced with `_` in the management name, the `context` key of the object names (the `CamelId` attribute keeps the name). A CamelContext whose management name is already the `context` key of another CamelContext now gets the next free management name, or fails to start with a fixed management name pattern; before, both started and the second on [...]
-`CamelSagaService` gains `isLongRunningActionHeaderSupported()`, defaulting to `false`. The header is consulted only when the configured service says it takes part in such a protocol; `LRASagaService` overrides it to `true`, so LRA interoperability is unchanged.
+The `Redeliveries` statistic now also counts a redelivery attempt that succeeds, and it is only counted where the redelivery happened. For a processor it is the number of redelivery attempts of that processor. For a route it is the number of exchanges that were redelivered by a processor of that route, and for the CamelContext the number of exchanges that were redelivered. Before, only redelivery attempts that failed were counted (so a processor that succeeded on its second redelivery re [...]
-A custom `CamelSagaService` that relies on the header to join sagas started by another participant must override the new method. Everything else is unaffected: the header is still set on the exchange, and routes reading it continue to work.
+The constructor of `org.apache.camel.management.InstrumentationInterceptStrategy` (used internally by `JmxManagementLifecycleStrategy`) now takes a map of `InstrumentationInterceptStrategy.WrappedProcessor` values and the `Route` whose processors it instruments, which must not be `null`.
-### camel-core - a saga step of a saga that has already ended fails
+##### mbeansLevel=ContextOnly
-Since 4.22, the `InMemorySagaService` removes a saga once it is completed or compensated, for example after its timeout, or after `saga:complete` for a `MANUAL` saga. A saga step with propagation `REQUIRED` on an exchange of such a saga then started a new saga of its own and completed it, and a step with propagation `SUPPORTS` ran outside of any saga, although the saga of the exchange had already ended.
+With `mbeansLevel=ContextOnly` the components are no longer registered as MBeans (like the endpoints, thread pools and most services, which were not registered at this level already). Prior to Camel 4.23 an MBean was registered for every component. Use `RoutesOnly` (or `Default`) to keep the component MBeans. The CamelContext, health check and route controller MBeans are still registered.
-Such a step now fails with `IllegalStateException` (`Cannot begin: saga <id> is not active or not known`), as it did before 4.22 and as it does while the saga is still being completed or compensated. A step with propagation `MANDATORY` fails as before.
+#### JMX tabular data unique keys
-The check applies to any `CamelSagaService` that returns no coordinator for the saga id of the exchange. For example, a custom saga service that reads the `Long-Running-Action` header, and receives the id of a saga it does not know, now fails such a step instead of starting a new saga.
+Some tabular data returned by the JMX MBeans had a key that was not unique, so the operation failed with `KeyAlreadyExistsException`. The tabular data of the Choice EIP and doTry EIP `extendedInformation` and of `listTasks` of the task manager registry now have an `index` item as their key, the exchange factories of `listStatistics` are keyed by `url` and `routeId`, and endpoints that only differ in a secret (which is masked) are shown once. The `listEndpointServices` operation of the en [...]
-### camel-saga
+The notification types advertised by the event notifier MBean (`getNotificationInfo`) are now the types that `JmxNotificationEventNotifier` sends, which is the simple class name of the event (such as `ExchangeCompletedEvent`), and the notification class is `javax.management.Notification`. Before, the advertised types used a `org.apache.camel.management.event.` prefix and several events were missing.
-The `saga:complete` and `saga:compensate` endpoints now follow the same rule as the Saga EIP: when the exchange is not bound to a saga, the `Long-Running-Action` message header is consulted only if the configured `CamelSagaService` returns `true` from `isLongRunningActionHeaderSupported()`, as `LRASagaService` does. With the default `InMemorySagaService` the header is ignored, and sending an exchange that is not bound to a saga to these endpoints fails with `IllegalStateException`.
+### camel-master
-Exchanges created inside a saga, including copies made by EIPs such as Wire Tap, Multicast or SEDA, stay bound to it and are not affected. A route that completes or compensates an in-memory saga from an unrelated exchange must bind it explicitly from trusted code, for example with `exchange.getExchangeExtension().setSagaLongRunningAction(id)`.
+The `backOffMaxAttempts` option now bounds the attempts to start the delegated consumer as documented. The retry task previously also carried the default five second duration of its budget, which ended the task before the second attempt for any `backOffDelay` at or above the default of five seconds. A delegate that fails to start is therefore retried for longer than before, up to `backOffMaxAttempts` times.
### camel-microprofile-health
@@ -1919,948 +2079,962 @@ This aligns the MicroProfile health output (and therefore Camel Quarkus, which b
camel.health.exposure-level = full
```
-### camel-catalog - did-you-mean suggestions by default, camel-catalog-suggest deprecated
+### camel-mina
-`CamelCatalog` now suggests the closest option names (and enum values) by default when validation finds an unknown one, using the new edit-distance based `org.apache.camel.catalog.impl.EditDistanceSuggestionStrategy` from `camel-core-catalog`. Before, suggestions were only produced when a `SuggestionStrategy` had been set explicitly, which meant the CLI and the TUI validators never gave any. Code that never wants suggestions can call `setSuggestionStrategy(null)`.
+The Mina consumer no longer writes the route’s exception back to the remote peer.
-The `camel-catalog-suggest` module with its phonetic (Soundex, commons-codec based) `CatalogSuggestionStrategy` is deprecated: the class now delegates to the edit-distance strategy and the module no longer depends on commons-codec. Remove the dependency and the `setSuggestionStrategy` call; the default gives the same or better suggestions. Edit distance also changes what is suggested: a partly typed name lists the names starting with it, and a name with a typo lists the names a few edits [...]
+When an exchange failed and `transferExchange` was not enabled, the consumer wrote `exchange.getException()` — the `Throwable` itself — over the socket. With a textline codec the peer received its class and message; with the object codec it received the serialised exception, cause chain and stack trace included.
-### camel-spring-boot
+A new `muteException` consumer option controls this, and it defaults to `true` — the same default the HTTP consumers carry (`camel-http-common` and therefore `camel-servlet` and `camel-jetty`, plus `camel-http`, `camel-platform-http`, and `camel-netty-http` and `camel-undertow` since 4.21.0).
-A set of starter defaults changed in this release. Each is a deliberate change to what an application gets when it configures nothing, so an existing deployment that relied on the previous default has to opt back in.
+A reply is still written, so a synchronous peer is not left waiting: it is a `java.lang.Exception` with a fixed message and no stack trace, in place of the route’s own exception. A route that relies on the original exception reaching the peer must opt back in explicitly:
-#### camel-jolokia-starter binds to loopback
+```text
+mina:tcp://localhost:9000?sync=true&muteException=false
+```
-The Jolokia agent’s bind address now defaults to `127.0.0.1` instead of `0.0.0.0`, matching the default of the Jolokia JVM agent this starter is an alternative to. The starter ships no authenticator, and TLS is configured only when the Kubernetes service-account CA file is present, so the previous default put an unauthenticated management endpoint on every interface as soon as the starter was on the classpath.
+`transferExchange=true` is unaffected — that option serialises the whole Exchange by design, and is already marked as an insecure-serialization flag.
-Deployments that reach the agent from outside the host — including Kubernetes deployments scraping it over the pod network — must set the bind address explicitly:
+### camel-mllp
-```properties
-camel.component.jolokia.server-config.host = 0.0.0.0
-```
+`logPhi` now defaults to `false`. It previously defaulted to `true`, so message content — which for MLLP is patient data by definition — reached the log at the default INFO/WARN levels with no configuration at all. Set `logPhi=true` on the component to restore the previous behaviour.
-Doing so should be paired with authentication or a network policy in front of the endpoint.
+Payload-bearing log paths that ignored the flag no longer do, including: `MllpSocketBuffer.readFrom` (the partial-payload warning, which logs the content of a legitimate in-flight message from a slow sender, not only unexpected bytes) and `MllpSocketBuffer.readSocketInputStream` (the bytes-before-START\_OF\_BLOCK warning), the invalid and partial-payload warnings in `TcpSocketConsumerRunnable`, and acknowledgement debug logging. Where content is suppressed the log now shows `<PHI suppressed>`.
-`CamelRestrictor` also now rejects cross-origin browser requests, where before it inherited ``AllowAllRestrictor’s behaviour of accepting every origin. Requests that carry no `Origin`` or `Referer` header are unaffected, so `curl`, Hawtio and the Jolokia CLI keep working. A browser-based client that drove the agent cross-origin needs a custom `camel.component.jolokia.server-config.restrictorClass`.
+The suppression is applied at the log statements, through a new `Hl7Util.convertToLoggableString`, rather than inside `convertToPrintFriendlyString`: that method is not a logging helper — it also extracts the MSH-9 field when an acknowledgement is generated, so redacting inside it would corrupt acknowledgements.
-Operations on the allowed MBean domains are still permitted: managing Camel through Jolokia is what the starter is for, and that capability is the reason the agent now binds to loopback.
+### camel-mongodb
-#### Vault and secrets starters fail closed on early property resolution
+#### tlsAllowInvalidHostnames marked insecure:ssl
-The early-resolution parsers used by the `aws-secrets-manager`, `azure-key-vault`, `cyberark-vault`, `google-secret-manager`, `hashicorp-vault`, `ibm-secrets-manager` and `spring-cloud-config` starters used to swallow a per-property lookup failure at `DEBUG` and leave the placeholder in place. The literal `{{aws:…}}` text then became the effective value of whatever it configured — a password, a token, a URL — with nothing visible at the default log level.
+The `tlsAllowInvalidHostnames` option is now marked `insecure:ssl`. The option turns off TLS hostname verification, so setting `camel.component.mongodb.tlsAllowInvalidHostnames = true` in the configuration is reported by the [security policy](security-policy.md) check: a warning by default, and a startup failure with the `prod` profile or `camel.security.insecureSslPolicy = fail`.
-A placeholder that matched a vault prefix but could not be resolved now aborts startup. To restore the previous tolerance:
+Only the option of `camel-mongodb` is reported, see the `camel-main` section about the security policy check below. To keep `camel.component.mongodb.tlsAllowInvalidHostnames = true` under a `fail` policy, list it in `camel.security.allowedProperties`.
-```properties
-camel.vault.ignore-resolution-failures = true
-```
+#### Failed exchanges reported without advancing consumer position
-The failure is then logged at `WARN` rather than `DEBUG`, so it is visible at the default log level.
+Both MongoDB consumers ignored the outcome of the route. A failure left on the exchange was never looked at, and an exception thrown from the processor was caught and dropped. With the default error handler the failure was still logged once redelivery was exhausted, but with `noErrorHandler`, or an error handler that does not log, it left no trace. The failure is now also passed to the consumer’s `ExceptionHandler`, which logs it by default, so expect an additional log line for each fail [...]
-#### camel-undertow-spring-security-starter validates the token issuer and audience
+A failed exchange also no longer advances the consumer’s position. The tailable cursor consumer updates its tail tracking value, and the change streams consumer records and commits its resume token, only after the route processed the event without a failure. Previously both did so for every event, whether or not the route failed. With `persistentTailTracking=true` the stored position is therefore that of the last successful record.
-The JWT decoder was built with only a claim-set converter, so signature and timestamps were checked but the `iss` claim was not, and the configured `clientId` was never bound to the token. Every client of a realm shares the signing key, so a token minted for a different client of the same realm was accepted.
+This is not a retry. The next event that succeeds moves the position past the failed one. A failed event is read again only if the consumer reopens its cursor from the stored position before a later event has succeeded, for example when the cursor is regenerated, or on a restart with persistent tail tracking or a resume strategy.
-The decoder now installs an issuer validator for the configured realm and requires the token to carry the configured `clientId` in its `aud` claim. A deployment that presents tokens minted for a different client must either have that client added to the token’s audience, or opt out:
+#### Change stream id header type mapping
-```properties
-camel.security.undertow.keycloak.validate-audience = false
-```
+The `_id` header set by the change streams consumer (`MongoDbConstants.MONGO_ID`) used to be read as an `org.bson.types.ObjectId` unconditionally, which threw for a document whose `_id` is a string, a number or a compound key, and for the events that carry no document key at all (`invalidate`, `drop`, `rename`, `dropDatabase`).
-#### camel-platform-http-starter enforces fileNameExtWhitelist
+It now carries the id in its natural Java type - an `ObjectId` when MongoDB generated it, otherwise a `String`, a number, or a `Document` for a compound key - and is absent for the events without a document key. A route that casts this header to `ObjectId` should check the type first, or keep working unchanged if its collection uses generated ids.
-`fileNameExtWhitelist` was evaluated against the multipart field name rather than the submitted file name, so it accepted uploads it was configured to reject. It now checks the submitted file name, treats a name with no extension as not accepted while a whitelist is configured, and matches whole comma-separated extension tokens instead of testing for a substring.
+### camel-nats - no reply when the exchange failed
-Uploads that previously slipped through — a part whose field name carried no extension, or an extension that was merely a substring of an allowed one — are now rejected. This is the control behaving as documented; a deployment that depended on the previous behaviour should widen the whitelist explicitly.
+A consumer with `exchangePattern=InOut` answered a request (a message with a reply subject) with the body of the exchange also when the exchange failed, so the requester got a successful reply, usually its own request. NATS has no error reply, so the consumer now sends no reply when the exchange failed or is marked rollback only, as camel-jms does without `transferException`: the requester times out (with the camel-nats producer, an `ExchangeTimedOutException` after `requestTimeout`). A [...]
-#### The security policy check sees properties set as environment variables
+### camel-netty
-`camel.security` evaluated only properties whose name a source reported with the `camel.` prefix, which excluded every option set as an environment variable, since those are reported as `CAMEL_COMPONENT_FOO_BAR`. Names are now canonicalized before the check.
+#### String bodies in the charset of the Content-Type
-Applications running with `camel.security.policy=fail` that configure Camel through the environment may now see startup fail on a violation that was previously invisible. That violation was always present; only the reporting changed.
+The Netty HTTP consumer (response) and producer (request) wrote a `String` body in the charset of the exchange (`CamelCharsetName`, UTF-8 by default), even when the `Content-Type` declared another charset (for example `text/plain; charset=ISO-8859-1` set by the route). A `String` body is now written in the charset that the `Content-Type` declares. Bodies that are not a `String`, and messages whose `Content-Type` declares no charset, are sent as before. Also, the `charset` parameter of a [...]
-#### String conversions to file-backed types are blocked
+#### Roles of security constraints matched by role name
-`SpringTypeConverter` already refused to convert a `String` into an `InputStream`, because Spring’s `ObjectToObjectConverter` finds the `FileInputStream(String)` constructor and opens the value as a path rather than treating it as content. `FileReader`, `Writer` and `ZipFile` targets are now refused for the same reason — notably `FileWriter(String)`, where the conversion previously succeeded and created the named file. Converting a `String` to `Reader` itself, or to a non-file-backed sub [...]
+The roles of a `SecurityConstraintMapping` inclusion are a comma-separated list of role names, and an authenticated user is now accepted only when one of their roles is equal to one of those names. The comparison is case-sensitive, whitespace around each name and blank entries are ignored, and a value of `*` still accepts any role. A roles value that uses another separator, such as `admin;guest` or `admin guest`, must be changed to `admin,guest`.
-`String` to `java.io.File` is unchanged: there the `String` genuinely is a path.
+#### NettyConverter toByteArray returns readable bytes copy
-#### camel-observability-services-starter narrows its injected defaults
+The `ByteBuf` to `byte[]` type converter (`NettyConverter.toByteArray`, also used when converting a Netty HTTP response body and by `camel-hl7`, `camel-lumberjack` and `camel-syslog`) now always returns a copy of exactly the buffer’s readable region (`readerIndex()`..`readableBytes()`).
-The starter contributes a set of management defaults as soon as it is on the classpath. Three of them were wider than the Spring Boot or Camel setting they replaced, and have been brought back in line.
+Previously, for an array-backed (heap) buffer it returned the buffer’s whole backing array directly. That could include bytes outside the readable region and, for a pooled buffer, bytes belonging to other allocations; the returned array was also a live reference into a buffer that could later be recycled.
-The management listener now binds to loopback. `management.server.port` was injected without a matching `management.server.address`, so adding the starter opened a second listener on every interface. Spring Boot ships no separate management listener at all, so that listener and its reach are now both a deliberate choice.
+If your code relied on mutating the returned `byte[]` to write through to the original `ByteBuf`, that no longer has any effect. The converter now behaves consistently for heap and direct, pooled and unpooled buffers.
-Deployments whose kubelet probes or Prometheus scrapers reach the pod over the network — which is every Kubernetes deployment using the health and metrics endpoints — must widen the bind address explicitly:
+#### Object codecs apply deserialization filter by default
-```properties
-management.server.address = 0.0.0.0
-```
+The `ObjectDecoder` and `DatagramPacketObjectDecoder` codecs (used when a route configures Netty object serialization through the `encoders` / `decoders` options) now always install a JEP-290 `java.io.ObjectInputFilter` while decoding, resolved through `DeserializationFilterHelper`. Previously a decoder built without an explicit filter pattern applied no filter at all and only logged a warning.
-Doing so should be paired with a `NetworkPolicy` or with authentication in front of the management port.
+When no explicit pattern is passed, the JVM-wide `jdk.serialFilter` is honoured if set, otherwise the shared Camel default allow-list is applied (it permits standard Java and Apache Camel types, denies `java.net.**`, and enforces JEP-290 graph-shape limits). Routes that deserialize classes outside that allow-list must pass an explicit filter pattern to the two-argument `ObjectDecoder(ClassResolver, String)` / `DatagramPacketObjectDecoder(ClassResolver, String)` constructor (or configure [...]
-`management.endpoint.health.show-details` is now `when-authorized` instead of `always`, so the aggregate `/observe/health` endpoint shows its individual indicators to an authenticated caller and a bare status to everybody else. Camel health checks report on the resources a route talks to, and their detail can identify those resources. With no Spring Security on the classpath the endpoint behaves as `never`. To restore the previous behaviour:
+#### Security constraint context-path case-insensitivity
-```properties
-management.endpoint.health.show-details = always
-```
+The security-constraint lookup now strips the endpoint context-path from the request target case-insensitively, matching how consumer dispatch already matches it (`RestConsumerContextPathMatcher` compares with `equalsIgnoreCase` and a lower-cased prefix).
-The `live` and `ready` health groups keep `show-details=always`. The kubelet reads them unauthenticated and puts the response body into the probe-failure event, so `kubectl describe pod` still names the indicator that took the pod down, and those groups hold availability-state indicators that report a status and carry no data.
+Previously the strip was guarded by a case-sensitive `startsWith`, so a request whose context-path differed only by case was evaluated against the unstripped target. With `matchOnUriPrefix=true` and a `securityConstraint` whose inclusions are specific sub-paths rather than a catch-all, such a request could match no inclusion — and an unmatched target counts as unrestricted — while still being dispatched to the route.
-`camel.health.exposure-level` is no longer forced to `full` and now follows the Camel default of `default`, which filters health check metadata — endpoint URIs, route and consumer identifiers — out of the health response while keeping the check names, error messages and stack traces. To opt back in:
+Requests that differ from the configured context-path only by case are therefore now subject to the same constraint as the exact-case form. Deployments that relied on the previous behaviour to reach a route without a challenge will now receive `401`.
-```properties
-camel.health.exposure-level = full
-```
+#### Client authentication of sslContextParameters
-The defaults are still registered as the lowest precedence property source, so all three settings are overridden by ordinary application configuration.
+A Netty consumer using `sslContextParameters` now uses the client authentication of its server parameters (`clientAuthentication` of `SSLContextServerParameters`, or `camel.ssl.clientAuthentication` with global SSL), also when the `needClientAuth` option is not enabled. Previously `needClientAuth=false` (the default) turned the client authentication off.
-#### camel-debug-starter no longer opens a JMX connector by default
+### camel-oauth
-`camel.debug.jmx-connector-enabled` now defaults to `false` instead of `true`. Adding `camel-debug-starter` to the classpath still installs and enables the `BacklogDebugger`, which is what the starter is for, but it no longer creates an RMI registry and JMX RMI server on `camel.debug.jmx-connector-port` (`1099`). Nothing listens until the connector is asked for.
+#### Client credentials token caching and post login URL origin
-Unlike camel-main, where `camel.debug.enabled` defaults to `false` and so the connector is only reached after the debugger is explicitly turned on, the starter enables the debugger as soon as it is on the classpath. That made the dependency alone enough to open a port, and the connector is created without authentication or transport security: anyone able to reach it can suspend routes and read message payloads.
+OAuth client credentials token caching now distinguishes profiles by client secret and requested scope, in addition to token endpoint and client ID. Profiles with different credentials or scopes request separate tokens instead of reusing the same cached token. Applications using such profiles may make additional token requests after upgrading.
-Tooling that attaches to the debugger from another process — the IntelliJ IDEA and VS Code Camel plugins — needs the connector, and must now request it:
+The post login url of the authorization code flow is now always built from the origin (`scheme://host[:port]`) of the configured `camel.oauth.redirect-uri`, plus the requested path. `OAuthCodeFlowProcessor` previously rebuilt that url from the `X-Forwarded-Proto` / `X-Forwarded-Host` / `X-Forwarded-Port` request headers, or from the `Host` header behind `CamelHttpUrl` when those were absent. All of those are set by the caller, so a request could point the post login redirect at any origi [...]
-```properties
-camel.debug.jmx-connector-enabled = true
-camel.debug.jmx-connector-port = 1099
-```
+#### Unauthenticated requests stop the route
-Enable it only on a trusted network, with the port bound to a loopback interface or protected by a firewall.
+The OAuth processors now stop the route on the paths where they do not authenticate the caller, so that no subsequent step of the route runs for such a request. Previously they set a response code and returned, which left the rest of the route to execute and overwrite the response the processor had just prepared.
-The `camel debug` command of Camel JBang is unaffected: it drives a Spring Boot application through the local CLI connector from `camel-cli-connector-starter`, not through JMX.
+What changed:
-#### camel-spring-boot health check stack traces moved to the full exposure level
+- `OAuthBearerTokenProcessor` — a request with no `Authorization` header, or with one that does not parse as `Bearer <token>`, is now answered with `401` and a `WWW-Authenticate: Bearer` challenge (RFC 6750) instead of `400`, and the route is stopped. A present-but-invalid token continues to fail by propagating the exception from `OAuth.authenticate()`, as before.
+
+- `OAuthCodeFlowProcessor` — when the caller has no authenticated session and is redirected to the identity provider, the route is now stopped; the `302` is the whole response.
+
+- `OAuthCodeFlowCallback` — a callback request without the `code` parameter still answers `400`, and now also stops the route.
+
-The Camel health indicator added the full stack trace of a failed health check as `error.stacktrace` to the per-check data in `/actuator/health` at every exposure level except `oneline`. A DOWN check whose result carries an exception — a consumer that lost its broker, a pool that cannot connect — therefore serialised the whole cause chain into the actuator response at the default exposure level.
+Routes that relied on steps after these processors running for unauthenticated requests must be restructured. The authenticated paths are unchanged: a successfully authenticated request continues through the rest of the route exactly as before, and `OAuthLogoutProcessor` is unchanged.
-`error.stacktrace` is now emitted only when the exposure level is `full`. `error.message` is still reported at the `default` level, which mirrors what Spring Boot’s own health indicators expose; camel-main’s management endpoint is stricter still and includes `error-stacktrace` only when the caller asks for it with `?stackTrace=true`. `camel-microprofile-health`, through which Camel Quarkus builds its health responses, applies the same gating from this release so the runtimes stay aligned [...]
+#### State parameter required for authorization code flow
-A deployment that consumed the trace from the actuator response can opt back in with:
+The authorization code flow now sends a `state` parameter and requires it back on the callback.
-```properties
-camel.health.exposure-level = full
-```
+`OAuthCodeFlowProcessor` generates a random `state`, stores it in the OAuth session and includes it in the authorization request. `OAuthCodeFlowCallback` then accepts an authorization code only when the callback carries the same value, consuming it so it cannot be replayed. Previously no `state` was sent and the callback redeemed whatever `code` arrived, binding the resulting profile to the caller’s session with nothing tying the callback to a flow that session had started — the login CS [...]
-Note that `full` also stops filtering the health check metadata out of the per-check data, so the output is more verbose than the previous default in other respects too.
+Two callbacks that used to succeed are now answered with `400` and stop the route:
-#### camel-platform-http-starter deletes multipart uploads when the exchange completes
+- no authorization code flow is in progress for the session — `No authorization code flow in progress`
+
+- the `state` is absent or does not match — `Authorization state mismatch`
+
-Multipart file uploads are copied out of the servlet container into the servlet temporary directory so that they remain readable after the HTTP request has completed. These temporary copies were never removed and accumulated for the lifetime of the application. They are now deleted when the exchange is done being routed, that is after the response has been written, which aligns the starter with the `deleteUploadedFilesOnEnd` option of `camel-platform-http-vertx` and with `camel-http-comm [...]
+Deployments where the session is not sticky across the redirect will see the second case, because the session holding the `state` has to be the one that returns. Sessions must survive the round trip to the identity provider.
-Routes that consume the upload while the exchange is being routed (saving it with the file producer, streaming it to a remote system, unmarshalling it) are unaffected. A route that stores the temporary path and reads the file after the exchange has completed must opt out and delete the file itself:
+Note that `nonce` and PKCE (`code_challenge`) are still not sent, and the session cookie is still `SameSite=None; Secure`.
-```properties
-camel.component.platform-http.server.delete-uploaded-files-on-end=false
-```
+#### Jakarta servlet backend evaluates nbf claim
-#### camel-platform-http-starter path variables follow the matched path
+The Jakarta servlet backend (`ServletOAuth`) now evaluates the `nbf` (not before) claim of the tokens it validates, and rejects a token before that time as RFC 7519 section 4.1.5 requires. This covers the bearer token that `OAuthBearerTokenProcessor` authenticates as well as the tokens received from the identity provider. Previously only `exp` was evaluated, so a token was accepted before its `nbf` time.
-Path variable headers are now taken from the path Spring matched the request against, instead of from the undecoded request URI. The values are therefore percent-decoded and carry no matrix parameters, which is what the vertx engine has always provided.
+The comparison allows for the leeway, in seconds, configured on the `JWTOptions` of the OAuth configuration, which defaults to `0`. That matches the Vert.x backend, which already evaluated `nbf`, and the default of the `clock-skew-seconds` property of incoming token validation. Tokens without an `nbf` claim are not affected.
-For a consumer such as `platform-http:/greeting/{name}`:
+The servlet backend does not read this leeway from configuration, and `clock-skew-seconds` does not apply to it. If the identity provider’s clock runs ahead of the Camel host and it issues tokens whose `nbf` equals `iat`, raise the leeway on the `OAuth` instance:
-
-| Request | Header `name` before | Header `name` now |
-| --- | --- | --- |
-| `/greeting/%61dmin` | `%61dmin` | `admin` |
-| `/greeting/John%20Doe` | `John%20Doe` | `John Doe` |
-| `/greeting/name;v=1` | `name;v=1` | `name` |
+```java
+OAuthFactory factory = OAuthFactory.lookupFactory(camelContext);
+OAuth oauth = factory.findOAuth().orElseGet(factory::createOAuth);
+oauth.getOAuthConfig().getJWTOptions().setLeeway(30);
+```
-An application that decoded the header itself, or that parsed matrix parameters out of it, must drop that handling. Requests whose path variables contain no percent-encoding and no matrix parameters are unaffected.
+### camel-openai
-`CamelHttpPath` (`Exchange.HTTP_PATH`) is unchanged: it still reports the raw request path with the servlet context-path removed.
+#### LLM scheme alias
-#### camel-micrometer-starter bounds the uri tag
+The `camel-openai` component now registers the `llm` URI scheme alongside the existing `openai` scheme. Both schemes use the same component implementation and Maven artifact (`camel-openai`).
-The starter contributes the `uri` low cardinality tag of the `http.server.requests` metrics when `camel.metrics.uri-tag-enabled = true`. Two things change in this release.
+- New routes should prefer `llm:chat-completion` (and other `llm:` operations) for discoverability.
+
+- Existing routes using `openai:chat-completion` continue to work unchanged.
+
+- Component configuration properties accept both prefixes: `camel.component.llm.` **and `camel.component.openai.`** create independent component instances when both are set.
+
-First, the property is now matched in its documented kebab-case form. The auto-configuration was conditional on `camel.metrics.uriTagEnabled`, a spelling that Spring Boot cannot resolve from a relaxed binding source, so an application that configured `camel.metrics.uri-tag-enabled = true`, the name listed in the starter documentation, never got the Camel uri tag at all. Both spellings now enable it. An application that had the kebab-case property set therefore starts seeing Camel consume [...]
+Java packages, exchange headers (`CamelOpenAI*`), and the Maven artifact id are unchanged.
-Second, when a request does not resolve to a Camel HTTP consumer — a 404, or any request served by something else than the Camel servlet — the tag was the requested path (servlet path plus path info) verbatim. Micrometer registers a meter per distinct tag value and keeps it for the lifetime of the process, so the number of meters followed the number of distinct paths that had been requested, instead of the number of routes. Such requests now keep the `uri` value computed by Spring’s own [...]
+See [LLM Component](../components/4.22.x/openai-component.md) for details.
-With `camel.metrics.uri-tag-dynamic = true` the requested path is still used, such as `/camel/users/123`, but only for requests that resolve to a Camel consumer, and the tag value is now capped at 200 characters.
+#### Operation-specific full response properties and moderation
-Dashboards and alerts that matched on the raw path of requests that are not served by Camel must use the Spring value instead, for example the mapped pattern `/actuator/health` of a Spring MVC endpoint.
+When `storeFullResponse=true`, the embeddings and audio operations now store their full SDK response under an operation-specific exchange property instead of the chat-completion property `CamelOpenAIResponse`. That property is typed as the chat-completion response (`com.openai.models.chat.completions.ChatCompletion`), so a downstream reader that expected that type received an incompatible object.
-#### camel-jasypt-starter defaults to PBEWITHHMACSHA256ANDAES\_256
+- embeddings now use `CamelOpenAIEmbeddingsResponse` (`com.openai.models.embeddings.CreateEmbeddingResponse`).
+
+- audio transcription now uses `CamelOpenAIAudioTranscriptionResponse` (`com.openai.models.audio.transcriptions.TranscriptionCreateResponse`).
+
+- audio translation now uses `CamelOpenAIAudioTranslationResponse` (`com.openai.models.audio.translations.TranslationCreateResponse`).
+
-`camel.component.jasypt.algorithm` now defaults to `PBEWITHHMACSHA256ANDAES_256` instead of `PBEWithMD5AndDES`. The starter already recognises that algorithm as one that requires an initialization vector, so `org.jasypt.iv.RandomIvGenerator` is installed automatically when `camel.component.jasypt.iv-generator-class-name` is not set.
+A route that reads the full embeddings or audio response from `CamelOpenAIResponse` must switch to the matching property. The chat-completion, responses, moderation and image operations are unchanged.
-This is a breaking change for existing encrypted values: a value produced under `PBEWithMD5AndDES` cannot be decrypted with the new default, and startup fails with an `EncryptionOperationNotPossibleException` when the property is resolved. Either re-encrypt the values with the new algorithm, or pin the previous default:
+The `moderation` operation now sends an image body to the multi-modal input of the moderation API. A `File`, `Path`, `WrappedFile`, `byte[]` or `InputStream` body whose detected MIME type is an image type was previously converted to a `String` and moderated as text; it is now moderated as an image, which needs a moderation model that accepts images, such as the default `omni-moderation-latest`. A list body containing an image file now fails with an `IllegalArgumentException` instead of m [...]
-```properties
-camel.component.jasypt.algorithm = PBEWithMD5AndDES
-```
+A `responses` call whose output asks for the approval of hosted MCP tool calls now fails with a `CamelExchangeException` naming the pending calls. Previously the exchange completed with an empty body.
-Whichever Jasypt tooling is used to produce the ciphertext must be given the same algorithm **and** a random IV generator — the Jasypt CLI defaults to no IV generator, and a value encrypted without one cannot be decrypted by the starter:
+### camel-openapi-java - allowable values of an array parameter
-```bash
-jbang org.apache.camel:camel-jasypt:<camel-version> \
- -c encrypt -p "$JASYPT_PASSWORD" -i my-secret-value \
- -a PBEWITHHMACSHA256ANDAES_256 -riga SHA1PRNG
-```
+The OpenAPI document generated from the Rest DSL now puts the allowable values of a parameter with `dataType("array")` on the items of the array (`items.enum`), as they restrict the values of the items. They were put on the array schema itself (`enum` next to `type: array`), which does not accept any array, so tools that validate requests or generate clients from the document rejected or mistyped the parameter.
-The `camel-jasypt` component itself is unchanged: `JasyptPropertiesParser` leaves the algorithm unset, so it still falls back to the Jasypt library default of `PBEWithMD5AndDES`. Aligning the component with the starter is a separate change; until it lands, an application that configures `JasyptPropertiesParser` directly keeps the old algorithm unless it sets one.
+### camel-openapi-validator - repeated request headers are validated value by value
-The starter’s usage documentation no longer shows the master password next to the encrypted value it protects. Use the `sysenv:` or `sys:` prefixes of `camel.component.jasypt.password` to read it from the environment or a JVM system property, or inject it from an external secret store.
+A header that occurs more than once in a request used to be passed to the request validator as the text of the Java collection holding its values, such as `[a, b]`. The values are now passed as they were sent. As a result:
-#### Starter configuration options that cannot be bound are reported
+- A header that the contract declares as a single value (not an array) and that occurs more than once is now rejected with `400`, where it was accepted before.
+
+- A header that the contract declares as an array may be repeated. This is treated like one header with the values joined by commas (RFC 9110, section 5.3), and each value is checked against the item schema of the array. This applies to OpenAPI 3.0 contracts: for an OpenAPI 3.1 contract the validator does not recognise a header parameter as an array, so a repeated header is rejected like a single-value one.
+
-The starters bind `camel.component.*`, `camel.dataformat.*` and `camel.language.*` onto the Camel component, data format or language they configure. Two steps of that binding used to discard a configured value without reporting it, so a mistyped or unbindable option left the target at its default and nothing appeared in the log. Both now report the value they cannot use, which matches what `camel.rest.*` has always done.
+### camel-paho and camel-paho-mqtt5
-An option of a complex (object) type is configured with a reference to a bean, such as:
+#### camel-paho - post-reconnect resubscribe failure handling
+
+When `automaticReconnect=true` and the MQTT broker reconnects, the consumer now restarts the route if the post-reconnect `subscribe()` call fails. Previously a failed resubscription (for example, when the broker does not send a SUBACK and the Paho keepAlive timer triggers `MqttException 32000`) was only logged at ERROR level with no recovery action, leaving the route in `Started` state while silently consuming no messages (zombie state).
+
+If the resubscribe fails and the consumer owns the MQTT client (the default), it automatically stops and restarts the route to force a clean reconnect. If the restart also fails (for example, the broker is still unavailable), the route is left in `Stopped` state. With `cleanSession=true`, the consumer unsubscribes before disconnecting; with `cleanSession=false`, it keeps the durable subscription. Routes using a user-provided client are not affected by this change. Configuring Camel’s `Su [...]
```properties
-camel.component.http.ssl-context-parameters = #bean:mySslContextParameters
+camel.routeController.enabled = true
+camel.routeController.backOffDelay = 2000
+camel.routeController.backOffMaxDelay = 60000
```
-The generated converter used to return `null` for any value that did not start with `#`, and for a value naming a bean that does not exist. A typo in the bean id therefore produced a component with the option unset. Such a value now aborts startup with a message naming the value, the target type and the configuration prefix it was set under. A plain bean id with no `#` prefix — `mySslContextParameters` — is resolved rather than discarded, as are `#autowired` and `#type:com.foo.MyType`.
-
-These converters are registered with `@ConfigurationPropertiesBinding` and therefore take part in every `@ConfigurationProperties` binding in the application, not only in Camel’s own. A binding whose target class is neither under `org.apache.camel` nor annotated with `@ConfigurationProperties` for a `camel.` prefix keeps the previous behaviour, so adding a starter to the classpath cannot make an unrelated application property fail to bind.
+#### camel-paho-mqtt5 - post-reconnect resubscribe failure handling
-The generated customizers copied the whole configuration onto the target with `failIfNotSet=false`, so an option with no matching setter on the target was dropped without a log line. An option that the application configured itself and that cannot be set now aborts startup. An option that only carries the default the generator took from the Camel catalog is logged at `DEBUG` and ignored, since the target keeps its own default and there is nothing to fix in the application. The options be [...]
+When `automaticReconnect=true` and the MQTT broker reconnects, the consumer now restarts the route if the post-reconnect `subscribe()` call fails. Previously a failed resubscription (for example, when the broker does not send a SUBACK and the Paho keepAlive timer triggers `MqttException 32000`) was only logged at ERROR level with no recovery action, leaving the route in `Started` state while silently consuming no messages (zombie state).
-An application that set an option which never took effect will therefore now fail to start. The remedy is to correct or remove the reported option. To restore the previous tolerance while doing so:
+If the resubscribe fails and the consumer owns the MQTT client (the default), it automatically stops and restarts the route to force a clean reconnect. If the restart also fails (for example, the broker is still unavailable), the route is left in `Stopped` state. Routes using a user-provided client are not affected by this change. Configuring Camel’s `SupervisingRouteController` allows the framework to keep retrying with exponential backoff until the broker recovers:
```properties
-camel.springboot.lenient-configuration-binding = true
+camel.routeController.enabled = true
+camel.routeController.backOffDelay = 2000
+camel.routeController.backOffMaxDelay = 60000
```
-Such an option is then logged at `WARN` with its name, instead of being dropped silently as before.
+### camel-platform-http and camel-platform-http-vertx
+
+#### Vert.x - String response in the charset of the Content-Type
+
+A `String` response body was always written as UTF-8, even when the response `Content-Type` declared another charset (for example `text/plain; charset=ISO-8859-1`, set by the route or kept from the request). It is now written in the charset that the `Content-Type` declares, so the bytes match the header. Responses without a charset in the `Content-Type`, or with UTF-8, are written as before, and so are bodies that are not a `String`. A client that ignored the declared charset and read su [...]
+
+#### Main - Static files resolved relative to staticSourceDir
+
+When `camel.server.staticSourceDir` is configured, static files from the file system are now resolved relative to that directory instead of first checking the process working directory. The configured directory is authoritative, and a path that resolves outside it is rejected. Classpath lookup remains unchanged.
+
+Applications that relied on a file in the process working directory taking precedence over the configured `staticSourceDir` should move that file into the configured directory. Applications without a configured `staticSourceDir` are unaffected.
+
+#### Proxy mode exact path matching and case-insensitive header filtering
+
+`PlatformHttpEndpoint.isHttpProxy()` selected proxy mode with `path.startsWith("proxy")` rather than an equality check, so any endpoint whose path merely began with those five characters — `proxyStats`, `proxy-health`, `proxying` — was treated as the documented `platform-http:proxy` endpoint. That has consequences beyond the name: `getPath()` returns `/` for such an endpoint, making it a catch-all, and `VertxPlatformHttpConsumer.handleProxy()` sets `Exchange.HTTP_HOST` from the request’s [...]
+
+Proxy mode is now selected only by the exact path `proxy`. The check is deliberately strict: `platform-http:/proxy`, with a leading slash, did not select proxy mode before and still does not, so this can never turn an endpoint into a proxy that was not already one.
+
+Routes relying on the prefix match must be renamed to the exact path `proxy`.
+
+`PlatformHttpEndpoint` wraps the endpoint’s `HeaderFilterStrategy` so that common request headers — `Authorization`, `Cookie`, `Proxy-Authorization` and the rest of `COMMON_HTTP_REQUEST_HEADERS` — are not echoed back on the response. The lookup compared names exactly against that canonically capitalised set, while exchange headers keep the casing of the inbound request. HTTP/2 requires field names to be lower case, so on an HTTP/2 request the names are `authorization`, `cookie` and so on [...]
-This affects hand-written code as well. `CamelPropertiesHelper.setCamelProperties(context, target, properties, false)`, and `CamelPropertiesHelper.copyProperties` which calls it, are public API used by hand-written customizers and auto-configuration outside the generated starters. They keep ignoring an option that cannot be set — that behaviour is unchanged — but each such option is now logged at `WARN` naming the option and the target class, where previously nothing was logged at all. A [...]
+Names are now compared case-insensitively. Responses that previously echoed these headers back on HTTP/2 requests no longer do.
-### camel-azure-storage-blob and camel-azure-storage-datalake
+#### Vert.x - CORS allow-credentials and Vary: Origin header
-Local downloads configured with `fileDir` now resolve existing filesystem path segments before checking that the destination remains inside the configured directory. Downloads through a symbolic link that resolves outside `fileDir` are rejected. Valid nested download paths continue to work.
+The CORS handler used to send `Access-Control-Allow-Credentials: true` on every response to a request carrying an `Origin` header — including responses to origins it had just decided not to allow, because the header was set outside the origin check. Combined with an unset `camel.server.cors.origins`, which makes the handler echo back whatever origin the caller sent, that produced the credentialed any-origin configuration the fetch specification forbids expressing as `*`.
-### camel-azure-storage-blob - blobs whose exchange is in flight
+Two changes:
-The consumer no longer consumes a blob again while an exchange of an earlier poll is still processing it, which happened with an asynchronous route (for example `to("seda:…")`), so the next polls now skip such a blob, and no longer download it again. With `deleteAfterRead=false` and `moveAfterRead=false` the blob is consumed again by a later poll once its exchange is done, as before. A listed blob that no longer exists when it is downloaded (for example deleted by another consumer after [...]
+- `Access-Control-Allow-Credentials` is now sent only when the request origin matched an origin the operator explicitly configured. With `camel.server.cors.origins` unset, the origin is still reflected back as before, but credentials are not granted.
+
+- A `Vary: Origin` response header is now added whenever the origin is reflected, so a shared cache cannot serve one origin’s response to another.
+
-### camel-huaweicloud-obs, camel-alibaba-oss and camel-aws2-s3-vectors - objects whose exchange is in flight
+Deployments that relied on credentialed cross-origin requests must list the permitted origins in `camel.server.cors.origins`.
-The `camel-huaweicloud-obs` and `camel-alibaba-oss` consumers no longer consume an object again while an exchange of an earlier poll is still processing it, which happened with an asynchronous route (for example `to("seda:…")`), so the next polls now skip such an object. With `deleteAfterRead=false` (and `moveAfterRead=false`) the object is consumed again by a later poll once its exchange is done, as before. A listed object that no longer exists when it is downloaded (for example delete [...]
+#### Vert.x - Response write failures propagated via pipe()
-The `camel-aws2-s3-vectors` consumer with `deleteAfterRead=true` no longer consumes a vector again while its exchange is still in flight. A vector whose exchange failed is still consumed again by a later poll.
+A streaming response body (any `InputStream` payload) was written to the client with the deprecated Vert.x `Pump`, which discards the result of every `write()`. Failures were therefore invisible: the response write was always reported as successful, even when nothing reached the client. Writing now uses `pipe()`, which propagates those failures.
-### camel-google-mail - messages whose exchange is in flight
+This is a bug fix (CAMEL-24864). A client that disconnects part way through a streaming response is now noticed, so the body stream is closed and the exchange completes. Previously neither happened, which leaked an exchange per aborted response — and, for a stream that only ends on an explicit marker, such as the Server-Sent Events stream produced by `camel-a2a`, also leaked the subscriber that the stream’s `close()` was responsible for removing.
-The `google-mail-stream` consumer no longer consumes a message again while an exchange of an earlier poll is still processing it, which happened with an asynchronous route (for example `to("seda:…")`) as the message is only marked as read when its exchange is done. The next polls now skip such a message (with `markAsRead=false` it is consumed again once its exchange is done).
+A lost client connection is logged at DEBUG and is not reported through the consumer’s `ExceptionHandler`, since a client going away is not a route failure. A failure raised while **producing** the body is still reported as before. Routes using `handleWriteResponseError=true` now see an exception on the exchange when a response write fails, including when the cause is the client disconnecting; routes that need to distinguish the two can inspect the exception cause.
-### camel-google-sheets - custom column names of a range that does not start at column A
+#### Shared path endpoint registry
-The `google-sheets:application-x-struct` data type now maps the custom `columnNames` to the columns of the range by their position. For a range that does not start at column A every column got the first name, so with the Kamelet default `columnNames=A` and a range such as `B:E` the JSON keys change from `A` for every column (each value overwriting the previous one) to `A`, `C`, `D`, `E`. Ranges that start at column A are not affected.
+`HttpEndpointModel` identity now includes the registered consumer reference, so multiple consumers can share the same path with different HTTP methods without overwriting each other in `PlatformHttpComponent#getHttpEndpoints()`.
-### camel-google-storage
+- `getHttpEndpoints()` and `getHttpManagementEndpoints()` may list multiple entries for the same URI (one per consumer). Ordering follows registration order (`LinkedHashSet`) instead of URI sort order (`TreeSet`).
+
+- `DefaultPlatformHttpConsumer` removes its own registration on stop via `removeHttpEndpoint(Consumer)` instead of removing every endpoint on the path.
+
+- `removeHttpEndpoint(String)` still removes all registrations for a URI (for example bulk cleanup). Prefer `removeHttpEndpoint(Consumer)` or `removeHttpEndpoint(String, Consumer)` when only one registration should be removed.
+
+- `HttpEndpointModel#compareTo` remains available and is consistent with the consumer-aware `equals`/`hashCode` implementation.
+
-Local downloads configured with a plain `downloadFileName` directory now resolve existing filesystem path segments before checking that the destination remains inside that directory. Downloads through a symbolic link that resolves outside the configured directory are rejected. Valid object names using `/` as a pseudo-directory separator continue to work.
+Stopping one `platform-http` route on a shared path no longer unregisters sibling consumers on that path.
-The remote object name is untrusted input, so the consumer now also checks it whatever `downloadFileName` looks like. An absolute object name (one starting with `/` or `\`, or with a drive letter such as `C:`) and an object name with a `..` path segment are rejected, even when the name would normalize back inside the download directory (for example `a/../b.txt`). When the consumer lists the bucket, a rejected object is skipped and reported to the consumer’s exception handler, which logs [...]
+#### Vert.x - Path parameter precedence over incoming headers
-The containment check is now also applied when `downloadFileName` is configured as a directory followed by an expression, such as `downloadFileName=/tmp/downloads/${file:name}`: the destination must stay within the static directory prefix configured before the first expression token (`/tmp/downloads` in the example). When `downloadFileName` is fully dynamic and has no static directory prefix (for example `downloadFileName=${file:name}`), a relative destination must stay within the workin [...]
+A REST endpoint with a path parameter, `/stock/{sku}`, sets the header `sku` from the path. When the request also carried an HTTP header of that name, the two were merged and `${header.sku}` was a `List` such as `[X, CAMEL-MUG]`, so a route that read it failed even when the path value was correct. The value from the path is used now; a query parameter may still repeat and is still collected into a list.
-The consumer no longer consumes an object again while an exchange of an earlier poll is still processing it, which happened with an asynchronous route (for example `to("seda:…")`), so the next polls now skip such an object (with `deleteAfterRead=false` it is consumed again once its exchange is done). An object that no longer exists when its content is downloaded (for example deleted by another consumer after the listing) is now skipped instead of failing the poll.
+### camel-plc4x - failed writes and reads
-### camel-jt400
+A `plc4x` producer with `autoReconnect=true` whose reconnect fails now fails the exchange with the `PlcConnectionException`. Before, it logged "Unable to reconnect, skipping request" and the exchange completed as if the values had been written. A failed write also keeps the message of the exchange (it was removed before), so that a redelivery writes the same values again.
-The endpoint syntax in the component metadata is now `jt400:userID:password@systemName/objectPath`, which is what the component always parsed: `objectPath` is the whole path of the URI (`QSYS.LIB/MYLIB.LIB/MYQUEUE.DTAQ`, the `QSYS.LIB` prefix is not required), and the object suffix (`.DTAQ`, `.MSGQ`, `.PGM`, `.SRVPGM`) selects what the endpoint works with. The `type` path option has been removed from the metadata (catalog, documentation and the endpoint URI factory); it was never an opti [...]
+The `plc4x` polling consumer (for example `pollEnrich`) now returns an exchange that has the exception when the connection or the read fails, instead of an exchange with an empty `Map` body, and it returns `null` when the PLC does not answer within the timeout of `receive(timeout)` or `receiveNoWait()`, as other polling consumers do. With `pollEnrich` the exception fails the exchange (unless `aggregateOnException` is enabled). A route that polls a PLC periodically and should go on while [...]
-### camel-alibaba-eventbridge
+### camel-pqc
-#### CloudEvents 1.0 specification validation enabled by default
+#### POSIX permissions on key directory and files
-The `camel-alibaba-eventbridge` producer now enables `validateEventSpec` by default (`validateEventSpec=true`) for Map payloads. This validates CloudEvents 1.0 specification constraints, requiring `specversion="1.0"`, valid RFC 3339 / ISO-8601 timestamps for `time`, and non-blank event identifiers (`id`).
+`FileBasedKeyLifecycleManager` stores private keys unencrypted, as Base64 PKCS#8 inside a JSON file, and used to create both the key directory and those files with whatever the process umask allowed — commonly `rw-r—r--` and `rwxr-xr-x` under the usual `022`, leaving private keys readable by every account on the host.
-Existing routes that produce Map bodies with non-standard specification versions or empty `id` fields should either update their payload maps to conform to CloudEvents 1.0 or explicitly disable specification validation:
+The key directory is now created as `rwx------` and each `<keyId>.private.json` as `rw-------`, on file systems that support POSIX permissions; elsewhere the equivalent owner-only flags are applied. A private key file left behind by an earlier version is tightened the next time that key is stored, because the file is truncated rather than recreated and would otherwise keep its original permissions.
-```text
-alibaba-eventbridge:putEvents?validateEventSpec=false&...
-```
+Deployments where another account legitimately reads these files — a sidecar or a backup agent running as a different user — need to run as the owner, or use a group-aware key store instead.
-#### 3-level hierarchical event validation and fail-closed cloud validation
+#### FileBasedKeyLifecycleManager restricts keyId to flat file name
-The component introduces fine-grained multi-bus and source-scoped event validation (`validateEventSource`, `validateEventType`, and `allowedEventSources`) with cached metadata in `EventSourceCache`.
+`FileBasedKeyLifecycleManager` now confines every key file to its configured key directory. A `keyId` (supplied through the `CamelPQCKeyId` / `CamelPQCNewKeyId` headers) that contains a forward slash, a backslash, a null character, or that would otherwise resolve outside the key directory is now rejected with an `IllegalArgumentException`.
-When cloud validation is enabled (`validateEventSource=true` or `validateEventType=true`), validation operates fail-closed: if the Alibaba Cloud EventBridge API is unreachable or returns an error, the producer will fail fast by throwing an exception rather than silently permitting unvalidated messages.
+Previously a `keyId` such as `tenant-a/signing` resolved into a subdirectory of the key directory. Deployments that organised keys that way must switch to a flat `keyId` (for example `tenant-a-signing`). Only the file-based manager is affected; the in-memory and cloud-backed managers were never file-path based.
-### camel-core - REST client request validation and binary bodies
+### camel-pubnub - consumers of a shared PubNub client
-When `clientRequestValidation` is enabled and the REST service declares a required body, the incoming message body is no longer replaced with a `String` version of itself. That conversion corrupted binary payloads such as `application/octet-stream`. The body is still read to check that it is present, using stream caching so it stays re-readable, but it now keeps its original type.
+A PubNub client hands every message it receives to all its listeners. When several endpoints use the same client (a `pubnub` bean that is autowired or referenced), each consumer received the messages of the channels of the other consumers too, and every stop and start of a route added one more listener, so its messages were then received once more. A consumer now only receives the messages and presence events of its own channel, and removes its listener when it stops.
-### camel-support
+The endpoint now destroys the PubNub client only when it created it. A client from the registry is no longer destroyed when an endpoint stops, for example when a route that uses the client is removed while other routes still use it: the application that created the client is responsible for destroying it.
-`BackgroundTask.schedule` now cancels the repeating schedule it created once the task has completed or has run out of budget. Previously the returned `Future` stayed armed and the task kept being re-run as a no-op for the lifetime of the executor. Callers that inspect the returned `Future` will see `isCancelled()` return `true` after the task is done, where it previously stayed live. Callers that already cancel the `Future` themselves are unaffected.
+### camel-pulsar
-### camel-support - the throttling route policies only resume a consumer they suspended
+#### the producer no longer replaces the body with the message id
-`ThrottlingInflightRoutePolicy` now only resumes a consumer that it suspended itself. It also no longer resumes the consumer while the route is being stopped or suspended (for example while `stopRoute` waits for the inflight exchanges), or while Camel is stopping. `ThrottlingExceptionRoutePolicy` no longer resumes the consumer of a route that was suspended through the route controller while the circuit was open.
+After sending, the producer used to overwrite the message body with the `MessageId` returned by the broker, so every step after the `to("pulsar:…")` saw a `MessageId` instead of the payload, and a route such as `.to("pulsar:a").to("pulsar:b")` published a Java-serialized `MessageId` to the second topic. That behaviour dates from the asynchronous send added in 3.20 (CAMEL-16030).
-For a consumer that is not `Suspendable`, `ThrottlingInflightRoutePolicy` previously called `start` on the consumer (and logged that it resumed the consumer) whenever an exchange completed below the resume threshold, even when it had not stopped the consumer. It now only starts a consumer that it stopped itself, so it no longer restarts a consumer that was stopped by the route controller or by other means. Such a consumer is still stopped and started to throttle the route, as before.
+The body is now left untouched, and the assigned id is reported on the new `CamelPulsarProducerMessageId` header instead.
-### camel-master
+A route that read the `MessageId` from the body must read that header instead.
-The `backOffMaxAttempts` option now bounds the attempts to start the delegated consumer as documented. The retry task previously also carried the default five second duration of its budget, which ended the task before the second attempt for any `backOffDelay` at or above the default of five seconds. A delegate that fails to start is therefore retried for longer than before, up to `backOffMaxAttempts` times.
+#### PulsarMessageUtils.updateExchange returns the exchange it was given
-### camel-platform-http - shared path endpoint registry
+`PulsarMessageUtils.updateExchange(message, exchange)` used to return a **copy** of the exchange passed to it. It now populates and returns that same instance.
-`HttpEndpointModel` identity now includes the registered consumer reference, so multiple consumers can share the same path with different HTTP methods without overwriting each other in `PlatformHttpComponent#getHttpEndpoints()`.
+The copy orphaned the exchange the consumer had taken from the exchange factory, so with `camel.main.exchange-factory=pooled` every consumed message leaked one pooled exchange and the pool never refilled. Code outside the component that called this method and relied on getting an independent copy must make its own copy instead.
-- `getHttpEndpoints()` and `getHttpManagementEndpoints()` may list multiple entries for the same URI (one per consumer). Ordering follows registration order (`LinkedHashSet`) instead of URI sort order (`TreeSet`).
-
-- `DefaultPlatformHttpConsumer` removes its own registration on stop via `removeHttpEndpoint(Consumer)` instead of removing every endpoint on the path.
-
-- `removeHttpEndpoint(String)` still removes all registrations for a URI (for example bulk cleanup). Prefer `removeHttpEndpoint(Consumer)` or `removeHttpEndpoint(String, Consumer)` when only one registration should be removed.
-
-- `HttpEndpointModel#compareTo` remains available and is consistent with the consumer-aware `equals`/`hashCode` implementation.
-
+#### a failed exchange is negatively acknowledged
-Stopping one `platform-http` route on a shared path no longer unregisters sibling consumers on that path.
+When a route fails, the consumer now calls `negativeAcknowledge` on the Pulsar consumer instead of leaving the message unacknowledged. This only applies when `allowManualAcknowledgement` is `false` (the default); with manual acknowledgement the route stays in charge, as before.
-### camel-openai
+This changes when the message comes back. Previously it was redelivered once the acknowledgement timeout expired, which `camel-pulsar` sets to 10 seconds by default through `ackTimeoutMillis`. A negative acknowledgement removes the message from the client’s unacknowledged-message tracker, so redelivery now follows `negativeAckRedeliveryDelayMicros`, which defaults to 60 seconds, and honours `negativeAckRedeliveryBackoff` when one is configured.
-When `storeFullResponse=true`, the embeddings and audio operations now store their full SDK response under an operation-specific exchange property instead of the chat-completion property `CamelOpenAIResponse`. That property is typed as the chat-completion response (`com.openai.models.chat.completions.ChatCompletion`), so a downstream reader that expected that type received an incompatible object.
+A route that wants the previous timing can set `negativeAckRedeliveryDelayMicros=10000000`.
-- embeddings now use `CamelOpenAIEmbeddingsResponse` (`com.openai.models.embeddings.CreateEmbeddingResponse`).
-
-- audio transcription now uses `CamelOpenAIAudioTranscriptionResponse` (`com.openai.models.audio.transcriptions.TranscriptionCreateResponse`).
-
-- audio translation now uses `CamelOpenAIAudioTranslationResponse` (`com.openai.models.audio.translations.TranslationCreateResponse`).
-
+### camel-qdrant - the PayloadSelector header is now honoured
-A route that reads the full embeddings or audio response from `CamelOpenAIResponse` must switch to the matching property. The chat-completion, responses, moderation and image operations are unchanged.
+`QdrantHeaders.PAYLOAD_SELECTOR` (`CamelQdrantPointsPayloadSelector`) was declared and advertised in the component metadata but never read. The `RETRIEVE` and `SIMILARITY_SEARCH` operations only honoured the `CamelQdrantWithPayload` boolean, so a route that set a `Points.WithPayloadSelector` to request specific payload fields was silently given the whole payload.
-The `moderation` operation now sends an image body to the multi-modal input of the moderation API. A `File`, `Path`, `WrappedFile`, `byte[]` or `InputStream` body whose detected MIME type is an image type was previously converted to a `String` and moderated as text; it is now moderated as an image, which needs a moderation model that accepts images, such as the default `omni-moderation-latest`. A list body containing an image file now fails with an `IllegalArgumentException` instead of m [...]
+Both operations now use the header when it is present, and fall back to the `CamelQdrantWithPayload` boolean otherwise. A route that already sets the header starts receiving only the payload fields it selected; a route that does not set it is unaffected.
-A `responses` call whose output asks for the approval of hosted MCP tool calls now fails with a `CamelExchangeException` naming the pending calls. Previously the exchange completed with an empty body.
+### camel-quickfix - InOut replies are sent on the session the request arrived on
-### camel-infinispan
+With `exchangePattern=InOut`, the QuickFIX/J consumer now sends the reply on the session the request was received on. Previously it read the `SessionID` header when the route completed, so a route that changed that header also changed which session received the reply. A route that changed the `SessionID` header to send the reply to another session must now send that message with a QuickFIX/J producer endpoint that sets the `sessionID` option.
-The `CamelInfinispanOperationResult` header is deprecated. It has not been set or read by the component since the remote and embedded components were split, so a route reading it received nothing. Use `CamelInfinispanOperationResultHeader` to name the header that carries the result of an operation; without it the result is placed in the message body, as before.
+### camel-reactive-streams
-The `CamelInfinispanIgnoreReturnValues` header is now documented as a producer header rather than a consumer one. It has always been read on the producer path, so only its group in the catalog and in the documentation changes.
+#### stopping a consumer
-### camel-file, camel-ftp, camel-smb, camel-mina-sftp and camel-azure-files
+Stopping a `reactive-streams` consumer now routes the items it already received from the stream before the route stops, waiting up to the `shutdownAwaitTermination` of the `ExecutorServiceManager` (10 seconds by default). Before, these items were dropped, and after a restart the consumer could stop requesting items. A route that synchronously stops itself from one of its own exchanges now waits for that timeout; stop it asynchronously instead (for example with the Control Bus `async=true [...]
-Downloads to a configured `localWorkDirectory` now resolve existing filesystem path segments before checking that the destination remains inside that directory. Downloads through a symbolic link that resolves outside the `localWorkDirectory` are rejected. Valid nested download paths continue to work.
+#### suspending a consumer
-### camel-file - jailStartingDirectory resolves symbolic links
+The `reactive-streams` consumer is now suspendable: suspending its route (route controller, JMX) and a route policy such as `ThrottlingInflightRoutePolicy` suspend it instead of stopping it, and a graceful shutdown suspends it before stopping it. It then requests no more items and holds the items it has already received, without waiting for them, and routes them in order when it is resumed (or stopped). Before, the consumer was stopped (the route status was `Stopped` instead of `Suspende [...]
-With `jailStartingDirectory` enabled (the default), the file consumer and producer now resolve symbolic links when checking that a file stays within the starting directory. The consumer skips a file or (with `recursive=true`) a directory that is a link resolving outside of it, and the producer fails to write through such a link or a dangling link. Links resolving inside the starting directory work as before. Set `jailStartingDirectory=false` to keep following links to other directories ( [...]
+### camel-resilience4j - bulkhead together with timeout
-### camel-file, camel-ftp, camel-smb, camel-mina-sftp and camel-azure-files - a file whose download fails is retried by idempotent consumers
+When the Circuit Breaker EIP with resilience4j has both `bulkheadEnabled` and `timeoutEnabled`, the bulkhead permit is now held until the protected call has ended, also when the call has timed out and the fallback has already been used. Prior to Camel 4.23 the permit was released when the timeout fired, while the call kept running on the timeout thread pool, so `bulkheadMaxConcurrentCalls` did not limit the calls running against a slow service. This applies to both the synchronous and th [...]
-When the consumer cannot download a file (for example a FTP, SFTP or SMB transfer fails with a socket timeout or a connection reset), the file is now retried on the next poll also when the consumer is idempotent, which includes every consumer with `noop=true`. Consumers that are not idempotent already retried such a file. Previously the idempotent key, which is added when the file is polled (`idempotentEager=true`, the default), was kept, so the file was skipped until the application was [...]
+As a result, while calls that timed out are still running, further calls are rejected by the bulkhead (and answered by the fallback, with `CamelCircuitBreakerResponseRejected` set to `true`), where before they were started. A call that never ends keeps its permit.
-A poll in which the download of every file failed now counts as an idle poll, the same as a poll in which no read lock could be acquired. This affects `backoffIdleThreshold`, `sendEmptyMessageWhenIdle` (an empty message is sent) and `greedy` (the consumer does not poll again immediately).
+In the synchronous mode the resilience4j `TimeLimiter` now also sees a call that the bulkhead rejects (as an error with a `BulkheadFullException`), so the events and metrics of resilience4j itself count such a call as a `TimeLimiter` error. The Camel circuit breaker counters are not affected.
-### camel-cassandraql - the aggregation repository keeps completed exchanges for recovery
+### camel-rest-openapi - path parameters are decoded
-`CassandraAggregationRepository` (and `NamedCassandraAggregationRepository`) implement `RecoverableAggregationRepository` with recovery enabled by default, but had no recovery store: `remove` deleted the completed exchange, `confirm` deleted the aggregation in progress that had the confirmed exchange id, and `scan` returned the exchange ids of the aggregations still in progress. The recovery task therefore sent aggregations that were still in progress (marked `CamelRedelivered`) and then [...]
+The headers of the path parameters of a contract-first (`rest-openapi` consumer) operation now hold the decoded value, as with the Rest DSL: `/items/caf%C3%A9` sets the `id` header to `café`, not `caf%C3%A9`. Each path segment is decoded on its own (an encoded `/` stays in its parameter) and a `` ` stays a ` ``. A value with a malformed escape is kept as it is. Routes that decoded these headers themselves must no longer do so.
-A completed exchange is now kept in the same table, under the aggregation key `camel-recovery:<exchange id>`, until it is confirmed, which is what `scan` reports and `recover` reads. `getKeys` reports only the aggregations in progress. No change of the table is needed.
+### camel-rocketmq - a message whose route failed is consumed again
-Routes that set `useRecovery=false` are unaffected. Routes that left recovery enabled, which is the default, no longer see aggregations in progress sent by the recovery task, and a completed exchange whose processing failed is now recovered. The table now also holds one row per completed and not yet confirmed exchange; those rows are deleted on confirmation. A time to live (`ttl`) applies to these rows as well.
+The consumer acknowledged a message (`CONSUME_SUCCESS`) whenever the processor returned, also when the route failed: a failed route sets the exception on the exchange instead of throwing it, so the message was lost. The consumer now answers `RECONSUME_LATER` for a failed exchange (or one marked rollback only), and RocketMQ redelivers the message with an increasing delay (up to the maximum reconsume times of the consumer group, 16 by default, then it goes to the dead letter queue of the g [...]
-### camel-infinispan - the aggregation repository keeps completed exchanges for recovery
+### camel-saga and camel-lra
-`InfinispanAggregationRepository` implements `RecoverableAggregationRepository`, but it had no recovery store: `remove` deleted the completed exchange outright, `confirm` removed the exchange id from a cache keyed by correlation key, and `scan` returned the correlation keys of the aggregations still in progress. The recovery task therefore re-delivered aggregations that were still accumulating, marked them `CamelRedelivered`, and sent them to the dead letter channel once `maximumRedelive [...]
+#### Long-Running-Action header gated in SagaProcessor
-A completed exchange is now kept in the same cache under a `camel-recovery:<exchange id>` key until it is confirmed, which is what `scan` reports and `recover` reads. `getKeys` continues to report only the aggregations in progress.
+The saga id normally travels in the exchange’s internal state, which survives `removeHeaders("*")`. `SagaProcessor` also read it from the `Long-Running-Action` message header when that state was absent, so that a coordinator started elsewhere could be joined — the LRA protocol carries the id that way.
-Routes that set `useRecovery=false` are unaffected. Routes that left recovery enabled, which is the default, stop seeing in-progress aggregations re-delivered, and start seeing genuine recovery. The cache now also holds one entry per completed and not yet confirmed exchange; those entries are removed on confirmation.
+That fallback applied to every saga service, including the default `InMemorySagaService` where no external coordinator exists. The header sits outside the `Camel` namespace consumers filter, and the id is written back onto responses, so a message could name a saga and have its exchange joined to it.
-### camel-caffeine, camel-ehcache - the aggregation repositories keep completed exchanges for recovery
+`CamelSagaService` gains `isLongRunningActionHeaderSupported()`, defaulting to `false`. The header is consulted only when the configured service says it takes part in such a protocol; `LRASagaService` overrides it to `true`, so LRA interoperability is unchanged.
-`CaffeineAggregationRepository` and `EhcacheAggregationRepository` implement `RecoverableAggregationRepository`, but like the Infinispan repository before 4.23 they had no recovery store: `remove` deleted the completed exchange, `confirm` removed the exchange id from a cache keyed by correlation key, and `scan` returned the correlation keys of the aggregations still in progress. The recovery task therefore sent aggregations that were still in progress (marked `CamelRedelivered`, and to t [...]
+A custom `CamelSagaService` that relies on the header to join sagas started by another participant must override the new method. Everything else is unaffected: the header is still set on the exchange, and routes reading it continue to work.
-A completed exchange is now kept in the same cache under a `camel-recovery:<exchange id>` key until it is confirmed, which is what `scan` reports and `recover` reads. `getKeys` reports only the aggregations in progress.
+#### Long-Running-Action header gated on saga endpoints
-Routes that set `useRecovery=false` are unaffected. Routes that left recovery enabled, which is the default, no longer see aggregations in progress sent by the recovery task, and a completed exchange whose processing failed is now recovered. The cache now also holds one entry per completed and not yet confirmed exchange; those entries are removed on confirmation. A cache with a size limit or an expiry applies it to these entries as well.
+The `saga:complete` and `saga:compensate` endpoints now follow the same rule as the Saga EIP: when the exchange is not bound to a saga, the `Long-Running-Action` message header is consulted only if the configured `CamelSagaService` returns `true` from `isLongRunningActionHeaderSupported()`, as `LRASagaService` does. With the default `InMemorySagaService` the header is ignored, and sending an exchange that is not bound to a saga to these endpoints fails with `IllegalStateException`.
-### camel-qdrant - the PayloadSelector header is now honoured
+Exchanges created inside a saga, including copies made by EIPs such as Wire Tap, Multicast or SEDA, stay bound to it and are not affected. A route that completes or compensates an in-memory saga from an unrelated exchange must bind it explicitly from trusted code, for example with `exchange.getExchangeExtension().setSagaLongRunningAction(id)`.
-`QdrantHeaders.PAYLOAD_SELECTOR` (`CamelQdrantPointsPayloadSelector`) was declared and advertised in the component metadata but never read. The `RETRIEVE` and `SIMILARITY_SEARCH` operations only honoured the `CamelQdrantWithPayload` boolean, so a route that set a `Points.WithPayloadSelector` to request specific payload fields was silently given the whole payload.
+### camel-salesforce
-Both operations now use the header when it is present, and fall back to the `CamelQdrantWithPayload` boolean otherwise. A route that already sets the header starts receiving only the payload fields it selected; a route that does not set it is unaffected.
+The `camel-salesforce-maven-plugin` now supports JWT and Client Credentials authentication in addition to the existing Username-Password flow.
-### camel-vertx-http - the REST producer applies the outbound header filter
+A new `authenticationType` configuration property allows explicitly selecting the authentication type. When not set, the plugin auto-detects the type from the provided credentials, matching the behavior of the Salesforce component. The `userName` property is no longer required, as it is not needed for the Client Credentials flow.
-`VertxHttpRestHeaderFilterStrategy.applyFilterToCamelHeaders` delegated to `applyFilterToExternalHeaders`, so it consulted the inbound filter while implementing the outbound direction. The outbound filter that `VertxHttpHeaderFilterStrategy` installs was therefore never applied, and the sibling REST strategies in `camel-http-common`, `camel-netty-http` and `camel-undertow` all delegate to the matching method.
+See the plugin’s `README.md` for the required properties per authentication type.
-A REST producer that resolves to `vertx-http` and does not configure its own `headerFilterStrategy` now filters the common HTTP headers on the outbound direction, as the other HTTP components already did. A message header named `Content-Length`, `Content-Type`, `Host`, `Cache-Control`, `Connection`, `Date`, `Pragma`, `Trailer`, `Transfer-Encoding`, `Upgrade`, `Via` or `Warning` is no longer copied onto the outgoing request; the `Content-Type` of the request is still taken from the exchan [...]
+### camel-saxon - external XML entity resolution disabled by default in XQuery
-Routes that relied on one of those headers reaching the wire must set it through the endpoint configuration or supply a `headerFilterStrategy` that permits it.
+The XQuery language and the `xquery` component now build their default Saxon `Configuration` with a hardened XML parser that does not accept a `DOCTYPE` declaration and does not resolve external general or parameter entities or external DTDs. This aligns XQuery with the parser configuration already applied to the `String`, `byte[]` and `InputStream` body paths through Camel’s `XmlConverter`, and with `camel-xslt-saxon` (which already defaults `secureProcessing` to `true`).
-### camel-vertx - the vertxFactory option takes the public VertxBuilder
+Previously, when a message body reached XQuery as an already-built `javax.xml.transform.Source` (for example after a `convertBodyTo(Source.class)`), it was parsed with the Saxon parser defaults, which resolved external entities. A body carrying a `DOCTYPE` declaration on that path is now rejected with a parse error. Bodies without a `DOCTYPE` are unaffected.
-The type of the `vertxFactory` option of the `vertx` component changed from the Vert.x internal class `io.vertx.core.impl.VertxBuilder` to the public interface `io.vertx.core.VertxBuilder`. The internal class does not implement the interface, and it no longer exists in Vert.x 5.
+A deployment that genuinely needs to parse documents with a `DOCTYPE` or external entities can supply its own pre-configured Saxon `Configuration` through the `configuration` option of the `xquery` endpoint or language (or `XQueryBuilder.setConfiguration(…)`); a user-supplied `Configuration` is used as-is and is not modified.
-An application that sets this option must create the builder with `Vertx.builder()`:
+### camel-seda and camel-disruptor
-```java
-// before
-component.setVertxFactory(new io.vertx.core.impl.VertxBuilder(options));
+#### camel-seda, camel-disruptor - a message that is not queued completes its own exchange
-// after
-component.setVertxFactory(Vertx.builder().with(options));
-```
+When the SEDA producer does not add an InOnly message to the queue, because it is discarded (`discardWhenFull=true`) or adding it fails (the queue is full, the `offerTimeout` elapses, or the producer is interrupted), the on completions of the exchange now run when the exchange is done. The same applies to the Disruptor producer when the ring buffer is full (with `blockWhenFull=false`) or the Disruptor is not started. Previously they had been handed over to the copy of the exchange that w [...]
-An application that does not set `vertxFactory` is not affected.
+Now a discarded message is committed like any other message whose route completed (for example the file consumer moves or deletes the file), and a message that could not be added is rolled back, so the consumer can pick it up again.
-### camel-disruptor - an interrupted request/reply producer fails the exchange
+#### camel-disruptor - an interrupted request/reply producer fails the exchange
A Disruptor producer whose thread is interrupted while it waits for the reply without a timeout (`waitForTaskToComplete` with `timeout=0`) now fails the exchange with the `InterruptedException`, where previously it reported the exchange as successful and returned the request as the reply. A reply that arrives after the producer timed out, or was interrupted, is now ignored; previously it could still be copied into the caller’s exchange after the producer had returned.
A request/reply message that timed out (or whose producer was interrupted) before a Disruptor consumer started it is now ignored by the consumer, as intended. Previously the consumer processed it anyway, and instead the exchange of the caller was marked as ignored: a redelivery of that exchange after the timeout, or a fallback that sends it to another Disruptor endpoint, was then dropped by the consumer, so the redelivery timed out again and an InOnly fallback message was lost.
-### camel-seda - an interrupted producer fails the exchange
+#### camel-seda - an interrupted producer fails the exchange
A SEDA producer whose thread is interrupted while it waits now fails the exchange, where previously it reported the send as successful. When it waits for space in a full queue (`blockWhenFull=true`, with or without `offerTimeout`, or `discardWhenFull=true`), the exchange fails with a `RejectedExecutionException` caused by the `InterruptedException`, as the message was not added to the queue. When it waits for the reply without a timeout (`waitForTaskToComplete` with `timeout=0`), the exc [...]
-### camel-servlet, camel-jetty - the multipart upload whitelist is enforced against the submitted file name
+#### camel-seda - purgeWhenStopping no longer purges when suspending
-`fileNameExtWhitelist` accepts file name extensions, but ``camel-servlet’s `AttachmentHttpBinding`` checked it against `Part.getName()`, which is the multipart **field** name rather than the submitted file name. A field named `file` carries no extension, so the check found nothing to compare and every upload was accepted. The option is now checked against `Part.getSubmittedFileName()`, which is what `camel-platform-http-vertx` already does.
+A SEDA consumer with `purgeWhenStopping=true` no longer discards the pending messages on its queue when its route (or the CamelContext) is suspended; like any other SEDA consumer it completes them before the route is suspended. The queue is still purged when the route is stopped. To support this, `org.apache.camel.spi.ShutdownAware` has a new default method `getPendingExchangesSize(boolean suspendOnly)`, which the shutdown strategy now calls instead of `getPendingExchangesSize()`. It del [...]
-A `camel-servlet` consumer that sets `fileNameExtWhitelist` together with `attachmentMultipartBinding=true` therefore starts rejecting uploads whose file extension is not listed, which is what the option always advertised. Uploads with no file name, such as plain form fields, are unaffected, and a route that does not set the option is unaffected. Review the configured extension list before upgrading.
+#### camel-seda - stopping a suspended route does not wait for its pending messages
-The `camel-jetty` binding performed no whitelist check at all, although `fileNameExtWhitelist` can be set on its `HttpBinding`. It now applies the same check.
+Stopping a suspended SEDA route, or stopping the CamelContext while such a route is suspended, no longer waits for the messages that were sent to it while it was suspended. A suspended consumer does not consume them, so previously the stop always ran into the graceful shutdown timeout and was then forced (or aborted). The messages are now kept on the queue (or purged with `purgeWhenStopping=true`), and are processed if the route is started again while the queue still exists.
-The `camel-jetty` binding also stored the attachment under the multipart field name but looked it up again by the submitted file name, and passed that file name to `HttpHelper.appendHeader`. The lookup therefore only succeeded when the two happened to be equal, and when it did the header was named by the client-supplied file name. The attachment is now looked up and exposed under the field name it is stored with, and only for parts that carry a file name — a plain form field is mapped by [...]
+#### camel-seda - purging the queue completes the discarded exchanges
-Both bindings now share this check through `DefaultHttpBinding` in `camel-http-common`. `DefaultHttpBinding` also carried an older copy of it for uploads that arrive as request attributes, which matched each extension as a substring of the whitelist, so for example a whitelist of `txt` accepted an upload named `evil.x`, and it replaced the configured `fileNameExtWhitelist` with its lower-cased value. It now uses the shared check: each comma-separated entry is compared exactly and case-in [...]
+When a SEDA queue is purged (with `purgeWhenStopping=true` or the `purgeQueue` JMX operation), the discarded exchanges are now failed with a `RejectedExecutionException` and their on completions are executed. A producer waiting for the reply of a discarded exchange (`waitForTaskToComplete`) is released with that exception, instead of waiting until its `timeout`, or forever when the timeout is disabled. On completions handed over to a discarded InOnly exchange, such as the commit or rollb [...]
-### camel-tensorflow-serving - the Target and Credentials headers are deprecated
+#### camel-seda - multipleConsumers broadcasts to consumers with different uri options
-`TensorFlowServingConstants.TARGET` (`CamelTensorFlowServingTarget`) and `TensorFlowServingConstants.CREDENTIALS` (`CamelTensorFlowServingCredentials`) are deprecated. Both were declared with `@Metadata` and advertised through the endpoint’s `headersClass`, but neither has ever been read by the component.
+With `multipleConsumers=true` every consumer of a SEDA queue now receives a copy of each message, also when the consumers use the same queue name with different consumer options, such as `seda:foo?multipleConsumers=true` and `seda:foo?multipleConsumers=true&concurrentConsumers=5`. Previously each distinct endpoint uri only multicast to its own consumers, so such consumers silently competed for the messages instead of each receiving a copy.
-The gRPC channel and its stubs are built once in `TensorFlowServingEndpoint.doInit()` from `configuration.getTarget()` and `configuration.getCredentials()`, so a per-exchange override supplied as a header cannot take effect. A route that set either header was silently ignored. The sibling `camel-kserve` component declares neither.
+### camel-servlet and camel-jetty
-Configure the `target` and `credentials` endpoint options instead, or route to a different endpoint with `toD` when the destination varies per message. The constants remain in place for backwards compatibility and are now marked deprecated in the component metadata.
+#### String response in the charset of the Content-Type
-### camel-main - configuration options now applied
+The servlet and Jetty consumers converted a `String` response body with the charset of the exchange (UTF-8 by default) when the response is chunked (the default), and also when it is not chunked and its `Content-Type` is not text (for example `application/json`), even when the `Content-Type` declared another charset (for example `text/plain; charset=ISO-8859-1`). Such a body is now written in the charset that the `Content-Type` declares, so the bytes match the header. Responses without a [...]
-Some configuration options of camel-main were not applied, and are now:
+##### A response that is not chunked and has a text Content-Type
-- The backlog tracer now traces the routes of the Rest DSL by default (`camel.trace.traceRests=true`), as documented. Previously camel-main turned this off. Set `camel.trace.traceRests=false` to not trace them.
-
-- Wildcard component options (such as `camel.component.seda*.queueSize=123`) are now also applied to components that are created after startup, such as when a route uses the component the first time. Previously they were only applied to the components that existed at startup.
-
-- Options of `metrics`, `otel` and `lra` configured using the Java API (such as `main.configure().metrics().withEnabled(true).withEnableMessageHistory(true)`) are now applied. When no `camel.metrics.` **(or `camel.opentelemetry.`** or `camel.lra.*`) properties are configured, the service is only enabled when `withEnabled(true)` is set (previously configuring the service using the Java API always enabled it).
-
-- The documented `camel.main.cloudPropertiesLocation` option is now used (previously only `camel.main.cloud-properties-location` worked), and override properties are no longer lost when cloud properties are loaded.
-
-- `camel.main.streamCachingBufferSize` no longer sets the buffer size to `0` when not configured, and `camel.main.streamCachingStatisticsEnabled` is now applied.
-
-- `camel.server.useGlobalSslContextParameters=false` (and `camel.management.useGlobalSslContextParameters=false`) is now honoured when global SSL is enabled.
-
+A `String` response body that is not chunked (`chunked=false` or the `CamelHttpChunked` header) and has a text `Content-Type` (one that contains `text` or `html`) was written in the charset of the exchange (`CamelCharsetName`, which the consumer sets from the request charset, else UTF-8), which also replaced the charset that the `Content-Type` declared (`text/plain; charset=ISO-8859-1` was sent as `text/plain;charset=UTF-8`). Such a body is now written in the charset that the `Content-Ty [...]
-### camel-seda - purgeWhenStopping no longer purges when suspending
+#### Jetty - allowCredentials defaults to false with CORS
-A SEDA consumer with `purgeWhenStopping=true` no longer discards the pending messages on its queue when its route (or the CamelContext) is suspended; like any other SEDA consumer it completes them before the route is suspended. The queue is still purged when the route is stopped. To support this, `org.apache.camel.spi.ShutdownAware` has a new default method `getPendingExchangesSize(boolean suspendOnly)`, which the shutdown strategy now calls instead of `getPendingExchangesSize()`. It del [...]
+`enableCORS=true` added `new CrossOriginFilter()` with no init parameters, so Jetty’s own defaults applied: `allowedOrigins=*` together with `allowCredentials=true`. Since the filter reflects the request’s origin rather than sending `*`, that is the credentialed any-origin configuration the fetch specification refuses to express — reflecting the origin being the usual way around that rule. An option named "enable CORS" should not mean "every origin, with credentials".
-### camel-smooks - external XML entity resolution disabled by default
+`allowCredentials` now defaults to `false` when CORS is enabled. The origin is still reflected, so enabling CORS keeps working for requests that carry no credentials.
-The Smooks data format and the Smooks component now parse XML input with a reader that does not resolve external general or parameter entities, aligning camel-smooks with the XML parser configuration already applied by the other Camel XML components. When a Smooks configuration parses XML with the default reader, an untrusted body can no longer pull in external entities (for example `<!ENTITY x SYSTEM "file:///…">` or an `http://` reference).
+Deployments that need credentialed cross-origin requests must ask for them explicitly:
-This only affects configurations that use the default XML reader. Configurations that declare their own reader — EDI, CSV, JSON, DFDL, or a custom reader — are unchanged, and marshalling is unchanged. Documents carrying an internal DTD subset still parse.
+```text
+jetty://http://0.0.0.0:8080/api?enableCORS=true
+ &filterInit.allowedOrigins=https://app.example
+ &filterInit.allowCredentials=true
+```
-To restore the previous behaviour and allow external entity resolution, set the new `allowExternalEntities` option to `true` on the data format or on the endpoint (`smooks:config.xml?allowExternalEntities=true`).
+Setting `filterInit.allowCredentials=true` while leaving `filterInit.allowedOrigins` unset or `*` is logged as a warning at startup, because that combination lets any origin make credentialed requests.
-### camel-main - profiles and precedence of ENV and JVM system properties
+The same change was made to camel-platform-http-vertx.
-The `dev` profile no longer overrides an option that is configured with a key in another case or with dashes, such as the ENV variable `CAMEL_MAIN_SHUTDOWNTIMEOUT=5` (which becomes `camel.main.shutdowntimeout`) or `camel.main.shutdown-timeout=5`. Previously only the exact camelCase key (`camel.main.shutdownTimeout`) was recognized, and the `dev` profile default was used instead.
+#### Multipart upload whitelist enforced against submitted file name
-A JVM system property now always takes precedence over the same option from an ENV variable or from a properties file, also when the keys are in another case (such as `-Dcamel.main.shutdownTimeout=22` and `CAMEL_MAIN_SHUTDOWNTIMEOUT=11`). Previously the result depended on the case of the keys.
+`fileNameExtWhitelist` accepts file name extensions, but ``camel-servlet’s `AttachmentHttpBinding`` checked it against `Part.getName()`, which is the multipart **field** name rather than the submitted file name. A field named `file` carries no extension, so the check found nothing to compare and every upload was accepted. The option is now checked against `Part.getSubmittedFileName()`, which is what `camel-platform-http-vertx` already does.
-When the profile is set as an ENV variable or JVM system property (`camel.main.profile`), only the `application-<profile>.properties` file of that profile is loaded. Previously `Main` also loaded the properties file of a profile configured in Java (such as `main.configure().withProfile("dev")`).
+A `camel-servlet` consumer that sets `fileNameExtWhitelist` together with `attachmentMultipartBinding=true` therefore starts rejecting uploads whose file extension is not listed, which is what the option always advertised. Uploads with no file name, such as plain form fields, are unaffected, and a route that does not set the option is unaffected. Review the configured extension list before upgrading.
-The option `camel.main.durationMaxAction` is now case-insensitive (`STOP` is the same as `stop`).
+The `camel-jetty` binding performed no whitelist check at all, although `fileNameExtWhitelist` can be set on its `HttpBinding`. It now applies the same check.
-### camel-zipfile, camel-tarfile - a maxDecompressedSize of 2 GiB or more is now enforced
+The `camel-jetty` binding also stored the attachment under the multipart field name but looked it up again by the submitted file name, and passed that file name to `HttpHelper.appendHeader`. The lookup therefore only succeeded when the two happened to be equal, and when it did the header was named by the client-supplied file name. The attachment is now looked up and exposed under the field name it is stored with, and only for parts that carry a file name — a plain form field is mapped by [...]
-The `maxDecompressedSize` option of the Zip File and Tar File data formats (and of `ZipSplitter`) was not enforced when set to 2 GiB (`Integer.MAX_VALUE` bytes) or more, because the byte count behind the check wrapped around. The limit is now enforced for any value: unmarshalling an entry that decompresses to more than the configured `maxDecompressedSize` fails with an `IOException`, as documented. The default limit (1 GiB) is unchanged, and `-1` still disables the limit.
+Both bindings now share this check through `DefaultHttpBinding` in `camel-http-common`. `DefaultHttpBinding` also carried an older copy of it for uploads that arrive as request attributes, which matched each extension as a substring of the whitelist, so for example a whitelist of `txt` accepted an upload named `evil.x`, and it replaced the configured `fileNameExtWhitelist` with its lower-cased value. It now uses the shared check: each comma-separated entry is compared exactly and case-in [...]
-`IOHelper.copy(InputStream, OutputStream, int, boolean, long)` now returns `Integer.MAX_VALUE`, instead of a negative number, when it copies more than `Integer.MAX_VALUE` bytes.
+### camel-shiro
-### camel-core - resolveResource option on expressions
+`ShiroSecurityProcessor` used to skip the Shiro `login()` call — and therefore the credential check — when the thread-bound subject was already authenticated for the same username as the incoming `ShiroSecurityToken`. The check conflated "same principal name" with "same credentials", so once a user had authenticated on a worker thread, a later exchange presenting that username with any password was accepted for as long as the subject stayed bound.
-Every expression has a new option `resolveResource` (default `false`). When `true` and the expression’s result is a String starting with `resource:`, the named resource is loaded and its content is the result, so a script can choose a file or a template per message and hand its content on:
+The default `alwaysReauthenticate=true` masked this, because the processor calls `logout()` after each exchange. With `alwaysReauthenticate=false` — a documented option, which also sets `rememberMe(true)` to keep subjects long-lived — the skip was reachable.
-```yaml
-- setBody:
- expression:
- groovy:
- expression: "counter == 1 ? 'resource:file:order.json' : 'resource:file:order-bad-email.json'"
- resolveResource: true
-```
+`login()` is now called for every exchange with the credentials that exchange presented. Deployments using `alwaysReauthenticate=false` will see one realm lookup per exchange where previously matching usernames reused the bound subject; correctness aside, that is the same cost the default already pays.
-A name without a scheme, `resource:orderTemplate.json`, is a classpath resource. The loaded content is the final value and is not evaluated again. Nothing changes without the option: the `resource:` prefix on the expression text itself is resolved as before, and a returned value that happens to start with `resource:` stays as it is.
+### camel-sjms
-### camel-platform-http-vertx - a path parameter wins over an incoming header of the same name
+#### request/reply completes the exchange once when the send fails
-A REST endpoint with a path parameter, `/stock/{sku}`, sets the header `sku` from the path. When the request also carried an HTTP header of that name, the two were merged and `${header.sku}` was a `List` such as `[X, CAMEL-MUG]`, so a route that read it failed even when the path value was correct. The value from the path is used now; a query parameter may still repeat and is still collected into a list.
+When the send of an InOut message fails, the pending reply is now cancelled, so the request timeout no longer completes the exchange a second time with an `ExchangeTimedOutException` after it has already failed with the send exception. When the send fails after the request timeout, or the reply, has already completed the exchange (for example a send that blocks longer than `requestTimeout` and then fails), the exchange keeps the outcome of the timeout or the reply, and the send failure i [...]
-### camel-main - global variables and the route reload pattern
+`org.apache.camel.component.sjms.reply.ReplyManager` has a new default method `boolean cancelCorrelationId(String)`, which `ReplyManagerSupport` implements. A custom `ReplyManager` implementation that does not override it keeps the previous behaviour.
-A global variable configured with a dot in its name, such as `camel.variable.global.foo.bar=1`, is now stored with the name `foo.bar`. Previously the first dot was replaced by a colon (`foo:bar`), as it is for route and group variables.
+#### suspending a route stops the consumer
-The `camel.main.routesReloadPattern` option now also matches a pattern with a directory (such as `sub/*.yaml`) against the path of the file relative to the reload directory. Previously only the name of the file was matched, so such a pattern never matched.
+A suspended sjms (or sjms2) consumer used to keep receiving and routing messages, also during a graceful shutdown and under route policies such as `ThrottlingInflightRoutePolicy`. It now stops the JMS connection of its listener container shortly after the suspend (the connection is stopped by another thread), and starts it again on resume. Messages that the JMS client has already prefetched are delivered after the resume. A connection factory that shares one connection and does not stop [...]
-### camel-core - the required attribute on rest param and route template parameter is now a String
+### camel-slack - the consumer reads every new message
-`ParamDefinition.required` (the rest DSL `param`) and `RouteTemplateParameterDefinition.required` (the `templateParameter` of a route template) are now declared as `String` instead of `Boolean`, the same way nearly every other scalar attribute in the Camel model is declared. This allows a property placeholder to be used, which is resolved when the route starts:
+When more messages than `maxResults` (default 10) were posted to the channel since the previous poll, the consumer routed only the most recent `maxResults` of them and skipped the older ones. It now reads the following pages of the conversation history in the same poll, so a poll can route more than `maxResults` messages, with one request per `maxResults` messages. For a busy channel, raise `maxResults` to keep the number of requests within the Slack rate limits. If the request for a fol [...]
-```yaml
-- routeTemplate:
- id: myTemplate
- parameters:
- - name: greeting
- required: "{{myRequiredFlag}}"
- from:
- uri: direct:start
- steps:
- - log:
- message: "{{greeting}}"
-```
+### camel-smooks - external XML entity resolution disabled by default
+
+The Smooks data format and the Smooks component now parse XML input with a reader that does not resolve external general or parameter entities, aligning camel-smooks with the XML parser configuration already applied by the other Camel XML components. When a Smooks configuration parses XML with the default reader, an untrusted body can no longer pull in external entities (for example `<!ENTITY x SYSTEM "file:///…">` or an `http://` reference).
+
+This only affects configurations that use the default XML reader. Configurations that declare their own reader — EDI, CSV, JSON, DFDL, or a custom reader — are unchanged, and marshalling is unchanged. Documents carrying an internal DTD subset still parse.
-Before this change the value was converted to a `Boolean` while the route was being loaded, so `required: "{{myRequiredFlag}}"` silently evaluated to `false` instead of resolving the placeholder.
+To restore the previous behaviour and allow external entity resolution, set the new `allowExternalEntities` option to `true` on the data format or on the endpoint (`smooks:config.xml?allowExternalEntities=true`).
-The accessors changed accordingly:
+### camel-smpp - received exchanges now come from the consumer
-- `ParamDefinition.getRequired()` and `setRequired(…)` now use `String` instead of `Boolean`.
+Exchanges for received `deliver_sm` and `data_sm` messages are now created through `Consumer#createExchange(boolean)` instead of on the endpoint, so that the configured `ExchangeFactory` sees them. Alert notifications already worked this way. Two consequences:
+
+- `Exchange#getFromRouteId()` is now set on received messages, where it was previously `null`, and exchange pooling applies to them.
-- `RouteTemplateParameterDefinition.getRequired()` and `setRequired(…)` now use `String` instead of `Boolean`. `isRequired()` is unchanged and still returns `boolean`, but it does not resolve property placeholders — use `CamelContextHelper.parseBoolean(camelContext, getRequired())` where a `CamelContext` is available.
+- In transceiver mode - an `smpp` producer with `messageReceiverRouteId` - the consumer belongs to the receiver route rather than to the SMPP endpoint, so `Exchange#getFromEndpoint()` now reports that route’s endpoint (for example `direct://messageReceiver`) instead of the SMPP endpoint. This matches what alert notifications already did. The exchange pattern is unchanged: the SMPP endpoint’s pattern is still applied explicitly.
-The fluent builder `ParamDefinition.required(Boolean)` is unchanged, and a `required(String)` overload was added for placeholders. Routes written in XML, YAML or the Java DSL do not need any change.
+`SmppEndpoint#createOnAcceptDeliverSmExchange` and `SmppEndpoint#createOnAcceptDataSm` are deprecated. They are no longer used by the component; build such an exchange through the consumer instead.
-### camel-main - properties that are not auto-configured are logged
+#### 8-bit messages are split by their length in bytes
-When `camel.main.autoConfigurationFailFast=false`, camel-main now logs a WARN for each `camel.*` property that could not be applied (such as a typo in the name of an option), for example `Property not auto-configured: camel.rest.contxtPath=/api`. These warnings were never logged before. The values of sensitive options (such as passwords) are masked. With fail-fast (the default) an unknown property fails the startup as before.
+With an 8-bit alphabet (`alphabet=4`, or an 8-bit data coding), the producer now decides whether to split a message by the length in bytes of the body as it is sent, instead of the number of characters of the body read as a String. A body of at most 140 characters but more than 140 bytes (for example text with multi-byte characters, or binary data) is now sent as several segments; with `splittingPolicy=TRUNCATE` it is truncated to 140 bytes, and with `splittingPolicy=REJECT` it is reject [...]
-When `camel.opentelemetry.` **properties are configured but OpenTelemetry is disabled (`camel.opentelemetry.enabled=false`), the `camel.opentelemetry2.`** or `camel.telemetryDev.` **properties are now used. Previously they were ignored whenever any `camel.opentelemetry.`** property was configured.
+### camel-snmp - GET\_NEXT (walk)
-### camel-main - `CAMEL_COMPONENT_*`, `CAMEL_DATAFORMAT_*`, `CAMEL_LANGUAGE_*` environment variables now take effect
+A `GET_NEXT` walk now ends at the end of the agent’s MIB view (`endOfMibView`, or `noSuchName` for SNMPv1) and at the end of the requested subtree by comparing OIDs (`1.3.6.1.4.1.20…` is no longer taken as part of `1.3.6.1.4.1.2`). Before, a walk that reached the end of the MIB view requested the same OID again forever. A walk whose request times out now fails with a `TimeoutException`, like `GET`, instead of returning the entries read so far (an empty list for an agent that does not an [...]
-Two bugs in \`camel-main’s environment-variable processing were fixed and are now active.
+### camel-spring-boot
-**Bug 1 — variables were silently ignored since Camel 3.9 (CAMEL-16345)**
+A set of starter defaults changed in this release. Each is a deliberate change to what an application gets when it configures nothing, so an existing deployment that relied on the previous default has to opt back in.
-`filterEnvVariables` uppercases the variable names before comparing them against the supplied prefixes, so the prefixes themselves must be uppercase. Before this fix the code passed lowercase prefixes (`camel.component.`, etc.), causing every match to fail silently. This has been corrected: `CAMEL_COMPONENT_*`, `CAMEL_DATAFORMAT_*` and `CAMEL_LANGUAGE_*` variables are now actually read.
+#### camel-jolokia-starter binds to loopback
-If your deployments intentionally set such variables but relied on them being ignored (for example to pass secrets that should not reach the component), remove the variables or set `camel.main.autoConfigurationEnvironmentVariablesEnabled=false` to opt out (note: this also disables `CAMEL_MAIN_*` and all other ENV-based configuration in `BaseMainSupport`).
+The Jolokia agent’s bind address now defaults to `127.0.0.1` instead of `0.0.0.0`, matching the default of the Jolokia JVM agent this starter is an alternative to. The starter ships no authenticator, and TLS is configured only when the Kubernetes service-account CA file is present, so the previous default put an unauthenticated management endpoint on every interface as soon as the starter was on the classpath.
-Variables that refer to a name not present on the classpath (for example `CAMEL_COMPONENT_KAFKA_BROKERS` in an application that does not include camel-kafka) will fail the startup with an `IllegalArgumentException`. Variables with an empty value (for example `CAMEL_COMPONENT_SEDA_QUEUE_SIZE=` from an unset compose variable) will fail with _value is empty_. There is no per-variable opt-out: rename the variable, remove it, or set `camel.main.autoConfigurationEnvironmentVariablesEnabled=fal [...]
+Deployments that reach the agent from outside the host — including Kubernetes deployments scraping it over the pod network — must set the bind address explicitly:
-Secrets passed as component environment variables (for example `CAMEL_COMPONENT_AWS2_S3_SECRET_KEY`) will be seen by the `prod`\-profile security check as plain-text secrets and will fail the startup. The `camel.component.aws2-s3.secret-key={{env:CAMEL_COMPONENT_AWS2_S3_SECRET_KEY}}` placeholder form does not help — `filterEnvVariables` still picks up the original variable and binds its value directly. To pass a secret without triggering the security check, either rename the environment [...]
+```properties
+camel.component.jolokia.server-config.host = 0.0.0.0
+```
-**Bug 2 — ambiguous name resolution**
+Doing so should be paired with authentication or a network policy in front of the endpoint.
-When the catalog contained component/dataformat/language pairs whose names were prefixes of each other (such as `netty` / `netty-http`, `js` / `jsonpath`, `avro` / `avroJackson`), the variable was randomly mapped to either name. A longest-match strategy now always selects the most specific name.
+`CamelRestrictor` also now rejects cross-origin browser requests, where before it inherited ``AllowAllRestrictor’s behaviour of accepting every origin. Requests that carry no `Origin`` or `Referer` header are unaffected, so `curl`, Hawtio and the Jolokia CLI keep working. A browser-based client that drove the agent cross-origin needs a custom `camel.component.jolokia.server-config.restrictorClass`.
-**Known limitation — `rest` / `rest-api` and custom-named instances**
+Operations on the allowed MBean domains are still permitted: managing Camel through Jolokia is what the starter is for, and that capability is the reason the agent now binds to loopback.
-`CAMEL_COMPONENT_REST_API_DOC=api.json` is matched to `camel.component.rest-api.doc` (the longer match), not to `camel.component.rest.apiDoc`. Use `CAMEL_COMPONENT_REST_APIDOC=api.json` instead (option names are matched case-insensitively). Note that using `camel.component.rest.apiDoc={{env:CAMEL_COMPONENT_REST_API_DOC}}` does not work as a workaround — `filterEnvVariables` still matches the original variable and binds it to `rest-api.doc` in addition to the placeholder.
+#### Vault and secrets starters fail closed on early property resolution
-The same limitation affects custom-named component instances whose name starts with a catalog name. For example, with a component registered as `kafka-dr`, `CAMEL_COMPONENT_KAFKA_DR_BROKERS` is matched to `kafka` (the catalog entry) and becomes `camel.component.kafka.dr-brokers`, an unknown option that fails the startup. Configure such instances through `application.properties` instead: `camel.component.kafka-dr.brokers={{env:KAFKA_DR_BROKERS}}`.
+The early-resolution parsers used by the `aws-secrets-manager`, `azure-key-vault`, `cyberark-vault`, `google-secret-manager`, `hashicorp-vault`, `ibm-secrets-manager` and `spring-cloud-config` starters used to swallow a per-property lookup failure at `DEBUG` and leave the placeholder in place. The literal `{{aws:…}}` text then became the effective value of whatever it configured — a password, a token, a URL — with nothing visible at the default log level.
-### camel-seda - stopping a suspended route does not wait for its pending messages
+A placeholder that matched a vault prefix but could not be resolved now aborts startup. To restore the previous tolerance:
-Stopping a suspended SEDA route, or stopping the CamelContext while such a route is suspended, no longer waits for the messages that were sent to it while it was suspended. A suspended consumer does not consume them, so previously the stop always ran into the graceful shutdown timeout and was then forced (or aborted). The messages are now kept on the queue (or purged with `purgeWhenStopping=true`), and are processed if the route is started again while the queue still exists.
+```properties
+camel.vault.ignore-resolution-failures = true
+```
-### camel-core - error handler predicates that throw an exception
+The failure is then logged at `WARN` rather than `DEBUG`, so it is visible at the default log level.
-When an `onWhen`, `handled`, `continued` or `retryWhile` predicate of `onException` (or `retryWhile` of the error handler) throws an exception during error handling, then the error handler now logs this at `WARN` level and regards the predicate as `false`:
+#### camel-undertow-spring-security-starter validates the token issuer and audience
-- A failing `onWhen` means the `onException` does not match, so another `onException` (or the error handler itself) handles the exception instead. Previously the exception from the predicate escaped from the error handler.
-
-- A failing `handled`, `continued` or `retryWhile` means the exchange is not handled, not continued and not redelivered. The exchange is still processed by the `onException` outputs (or sent to the dead letter channel), and the original exception is kept as the exception, with the exception from the predicate attached as a suppressed exception. Previously the exception from the predicate replaced the original exception, and the `onException` outputs were skipped.
-
+The JWT decoder was built with only a claim-set converter, so signature and timestamps were checked but the `iss` claim was not, and the configured `clientId` was never bound to the token. Every client of a realm shares the signing key, so a token minted for a different client of the same realm was accepted.
-### camel-core - error handler onPrepareFailure that throws an exception
+The decoder now installs an issuer validator for the configured realm and requires the token to carry the configured `clientId` in its `aud` claim. A deployment that presents tokens minted for a different client must either have that client added to the token’s audience, or opt out:
-When the `onPrepareFailure` processor of the Dead Letter Channel or the Default Error Handler throws an exception, then the exchange is no longer sent to the dead letter queue (or failure processor) with that exception set on it. Instead, the exchange is not delivered, and with the Dead Letter Channel the new exception is handled according to `deadLetterHandleNewException` (by default `true`, so the exchange completes and a `WARN` is logged). With `deadLetterHandleNewException=false`, or [...]
+```properties
+camel.security.undertow.keycloak.validate-audience = false
+```
-### camel-core - error handler error registry handled flag
+#### camel-platform-http-starter enforces fileNameExtWhitelist
-The error registry (`ErrorRegistry`) now records whether an error was handled from the exchange itself. An exception that is processed by an `onException` without `handled(true)` is now recorded as not handled; previously any exception that was processed by an `onException` or a failure processor was recorded as handled.
+`fileNameExtWhitelist` was evaluated against the multipart field name rather than the submitted file name, so it accepted uploads it was configured to reject. It now checks the submitted file name, treats a name with no extension as not accepted while a whitelist is configured, and matches whole comma-separated extension tokens instead of testing for a substring.
-### camel-sql, camel-sql-stored - the query/template override headers are gated
+Uploads that previously slipped through — a part whose field name carried no extension, or an extension that was merely a substring of an allowed one — are now rejected. This is the control behaving as documented; a deployment that depended on the previous behaviour should widen the whitelist explicitly.
-A message header could override the endpoint-configured SQL by default, letting an incoming message choose the executed statement:
+#### The security policy check sees properties set as environment variables
-- `camel-sql`: the `CamelSqlQuery` header replaced the endpoint query.
-
-- `camel-sql-stored`: the `CamelSqlStoredTemplate` header replaced the endpoint template, and its value was resolved through `SqlHelper.resolveQuery`, which resolves `file:`, `http:`, `https:` and `classpath:` resources.
-
+`camel.security` evaluated only properties whose name a source reported with the `camel.` prefix, which excluded every option set as an environment variable, since those are reported as `CAMEL_COMPONENT_FOO_BAR`. Names are now canonicalized before the check.
-Both overrides are now disabled by default and must be opted into, matching the `allowTemplateFromHeader` convention already used by the template components (camel-freemarker, camel-velocity, camel-xslt, …):
+Applications running with `camel.security.policy=fail` that configure Camel through the environment may now see startup fail on a violation that was previously invisible. That violation was always present; only the reporting changed.
-- `camel-sql`: set `allowQueryFromHeader=true` to honour the `CamelSqlQuery` header again.
-
-- `camel-sql-stored`: set `allowTemplateFromHeader=true` to honour the `CamelSqlStoredTemplate` header again; a header-supplied template is now resolved with property placeholders only, never as a `file:`, `http:`, `https:` or `classpath:` resource.
-
+#### String conversions to file-backed types are blocked
-A route that relied on either header must set the corresponding option on the endpoint.
+`SpringTypeConverter` already refused to convert a `String` into an `InputStream`, because Spring’s `ObjectToObjectConverter` finds the `FileInputStream(String)` constructor and opens the value as a path rather than treating it as content. `FileReader`, `Writer` and `ZipFile` targets are now refused for the same reason — notably `FileWriter(String)`, where the conversion previously succeeded and created the named file. Converting a `String` to `Reader` itself, or to a non-file-backed sub [...]
-Opting back in is not quite the previous behaviour. `SqlHelper.resolveQuery` applied placeholder resolution only to a value that had a scheme, so a schemeless header template used to reach the database untouched; it now always goes through `SqlHelper.resolvePlaceholders`, which drops `--` comment lines and blank lines and re-joins the rest with newlines. That is immaterial for the single-line call syntax a stored-procedure template normally uses, but a route passing a multi-line commente [...]
+`String` to `java.io.File` is unchanged: there the `String` genuinely is a path.
-Additionally, `camel-sql-stored` with `useMessageBodyForTemplate=true` now uses the message body verbatim as the stored-procedure template text and no longer resolves it through `SqlHelper.resolveQuery`. A body beginning with `file:`, `http:`, `https:` or `classpath:` is therefore treated as literal template text instead of being fetched as a resource, consistent with how `camel-sql` already treats the body under `useMessageBodyForSql=true`. A route that relied on the body being a resour [...]
+#### camel-observability-services-starter narrows its injected defaults
-Observability follows the gate. The `db.statement` span tag set by the `sql` span decorator (camel-telemetry and the deprecated camel-tracing) is now taken from the `CamelSqlQuery` header only when the endpoint sets `allowQueryFromHeader=true`; otherwise the tag is omitted rather than reporting a statement that was never executed. A route that reads `db.statement` from a `sql:` span and relies on the header value must set `allowQueryFromHeader=true`. The same gate applies to the `sql-tra [...]
+The starter contributes a set of management defaults as soon as it is on the classpath. Three of them were wider than the Spring Boot or Camel setting they replaced, and have been brought back in line.
-### camel-core - doTry, doCatch and doFinally
+The management listener now binds to loopback. `management.server.port` was injected without a matching `management.server.address`, so adding the starter opened a second listener on every interface. Spring Boot ships no separate management listener at all, so that listener and its reach are now both a deliberate choice.
-Route dumps now retain `doCatch` and `doFinally` blocks declared as properties of a `doTry` in YAML. Previously these blocks ran correctly but were omitted from the dumped route. If you compare or process route dumps, account for the previously missing exception-handling blocks in the output.
+Deployments whose kubelet probes or Prometheus scrapers reach the pod over the network — which is every Kubernetes deployment using the health and metrics endpoints — must widen the bind address explicitly:
-A `doTry` must have one or more `doCatch` or `doFinally` blocks, otherwise the route fails to start with `doTry must have one or more doCatch or doFinally blocks`. Previously such a `doTry` was accepted (which turned off the route error handler for its steps).
+```properties
+management.server.address = 0.0.0.0
+```
-In the Java DSL, `onWhen` on a `doCatch` now only applies to that `doCatch`. Previously `onWhen` was set on every `doCatch` of the `doTry` (including the `doCatch` blocks of nested `doTry` blocks), so the `onWhen` of the last `doCatch` replaced the `onWhen` of the earlier `doCatch` blocks. Routes now behave as written.
+Doing so should be paired with a `NetworkPolicy` or with authentication in front of the management port.
-When an exception is thrown in a `doFinally` block while an exception from the `doTry` block is not handled, then the original exception is kept and the exception from the `doFinally` block is added as a suppressed exception. Previously the exception from the `doFinally` block was lost.
+`management.endpoint.health.show-details` is now `when-authorized` instead of `always`, so the aggregate `/observe/health` endpoint shows its individual indicators to an authenticated caller and a bare status to everybody else. Camel health checks report on the resources a route talks to, and their detail can identify those resources. With no Spring Security on the classpath the endpoint behaves as `never`. To restore the previous behaviour:
-A nested `doTry` (or a `doTry` in a route called from a `doTry`) no longer ends the outer `doTry` block. Previously steps such as a `recipientList`, `multicast` or `split` after the nested `doTry` used the route error handler (such as redeliveries and the dead letter channel), instead of the `doCatch` of the outer `doTry`.
+```properties
+management.endpoint.health.show-details = always
+```
-### camel-core - the inheritErrorHandler attribute on circuitBreaker and failoverLoadBalancer is now a String
+The `live` and `ready` health groups keep `show-details=always`. The kubelet reads them unauthenticated and puts the response body into the probe-failure event, so `kubectl describe pod` still names the indicator that took the pod down, and those groups hold availability-state indicators that report a status and carry no data.
-`CircuitBreakerDefinition.inheritErrorHandler` and `FailoverLoadBalancerDefinition.inheritErrorHandler` are now declared as `String` instead of `Boolean`, the same way nearly every other scalar attribute in the Camel model is declared. This allows a property placeholder to be used, which is resolved when the route starts:
+`camel.health.exposure-level` is no longer forced to `full` and now follows the Camel default of `default`, which filters health check metadata — endpoint URIs, route and consumer identifiers — out of the health response while keeping the check names, error messages and stack traces. To opt back in:
-```yaml
-- route:
- from:
- uri: direct:start
- steps:
- - circuitBreaker:
- inheritErrorHandler: "{{myInheritFlag}}"
- steps:
- - to:
- uri: mock:a
+```properties
+camel.health.exposure-level = full
```
-Before this change the value was converted to a `Boolean` while the route was being loaded, so `inheritErrorHandler: "{{myInheritFlag}}"` silently evaluated to `false` instead of resolving the placeholder.
-
-The accessors changed accordingly:
+The defaults are still registered as the lowest precedence property source, so all three settings are overridden by ordinary application configuration.
-- `ProcessorDefinition.getInheritErrorHandler()` and `setInheritErrorHandler(…)` now use `String` instead of `Boolean`, and so do the overrides on `CircuitBreakerDefinition` and the accessors on `FailoverLoadBalancerDefinition`. Use `CamelContextHelper.parseBoolean(camelContext, getInheritErrorHandler())` where a `CamelContext` is available to resolve the value.
-
+#### camel-debug-starter no longer opens a JMX connector by default
-The fluent builder `CircuitBreakerDefinition.inheritErrorHandler(boolean)` and the `failover(…)` methods on `LoadBalanceDefinition` are unchanged, and a `CircuitBreakerDefinition.inheritErrorHandler(String)` overload was added for placeholders. Routes written in XML, YAML or the Java DSL do not need any change; the `inheritErrorHandler` attribute in the XML schema is now `xs:string` so a placeholder validates.
+`camel.debug.jmx-connector-enabled` now defaults to `false` instead of `true`. Adding `camel-debug-starter` to the classpath still installs and enables the `BacklogDebugger`, which is what the starter is for, but it no longer creates an RMI registry and JMX RMI server on `camel.debug.jmx-connector-port` (`1099`). Nothing listens until the connector is asked for.
-### camel-core - JSSE utility (SSLContextParameters)
+Unlike camel-main, where `camel.debug.enabled` defaults to `false` and so the connector is only reached after the debugger is explicitly turned on, the starter enables the debugger as soon as it is on the classpath. That made the dependency alone enough to open a port, and the connector is created without authentication or transport security: anyone able to reach it can suspend routes and read message payloads.
-A filter (such as `cipherSuitesFilter` or `namedGroupsFilter`, or `camel.ssl.cipherSuitesExclude` and `camel.ssl.namedGroupsExclude`) with only exclude patterns now includes all the other available values. Previously it included nothing, which made every TLS handshake fail (for example `camel.ssl.namedGroupsExclude = X25519MLKEM768`, which is the documented way to disable the post-quantum named groups). A filter with no patterns at all still includes nothing.
+Tooling that attaches to the debugger from another process — the IntelliJ IDEA and VS Code Camel plugins — needs the connector, and must now request it:
-On JVMs that do not provide their default signature schemes (such as JDK 25 and older) a `signatureSchemesFilter` (or `camel.ssl.signatureSchemesInclude`/`signatureSchemesExclude`) is no longer applied (a WARN is logged) and the defaults of the JVM are used. Previously an empty list of signature schemes was configured, which made every TLS handshake fail. Configure the signature schemes explicitly instead.
+```properties
+camel.debug.jmx-connector-enabled = true
+camel.debug.jmx-connector-port = 1099
+```
-The SNI host names of the client parameters are now also set on the `SSLEngine` (used by components such as camel-netty). Previously they were only set on an `SSLSocket`.
+Enable it only on a trusted network, with the port bound to a loopback interface or protected by a firewall.
-### camel-weaviate - removed the unused vector field name header
+The `camel debug` command of Camel JBang is unaffected: it drives a Spring Boot application through the local CLI connector from `camel-cli-connector-starter`, not through JMX.
-The `CamelweaviateVectorFieldName` header (`WeaviateVectorDbHeaders.VECTOR_FIELD_NAME`) has been removed. It was read by the Weaviate embeddings data-type transformer but its value was never used — the embedding vector is always sent as the object vector, so a "vector field name" had no effect (Weaviate has no named vector-field concept in this producer). Routes that set this header can simply drop it; behaviour is unchanged.
+#### camel-spring-boot health check stack traces moved to the full exposure level
-### toD now passes the raw URI to useRawUri() components
+The Camel health indicator added the full stack trace of a failed health check as `error.stacktrace` to the per-check data in `/actuator/health` at every exposure level except `oneline`. A DOWN check whose result carries an exception — a consumer that lost its broker, a pool that cannot connect — therefore serialised the whole cause chain into the actuator response at the default exposure level.
-Components that override `useRawUri()` to return `true` (such as `kamelet`, `master`, and `webhook`) now receive the original, un-encoded URI when the endpoint is resolved dynamically via `toD`, exactly as they already did via the static `to` DSL.
+`error.stacktrace` is now emitted only when the exposure level is `full`. `error.message` is still reported at the `default` level, which mirrors what Spring Boot’s own health indicators expose; camel-main’s management endpoint is stricter still and includes `error-stacktrace` only when the caller asks for it with `?stackTrace=true`. `camel-microprofile-health`, through which Camel Quarkus builds its health responses, applies the same gating from this release so the runtimes stay aligned [...]
-Before this change, `toD` passed the URL-encoded (normalised) form to such components, causing parameter values containing special characters (`%`, `+`, `?`, `=`, `@`, `|`) to arrive double-encoded at the component.
+A deployment that consumed the trace from the actuator response can opt back in with:
-This is a bug fix (CAMEL-24747). Routes that relied on `toD` passing the encoded form to a `useRawUri()` component will now see the original raw value instead. For all other components (`useRawUri()` returns `false`), behaviour is unchanged.
+```properties
+camel.health.exposure-level = full
+```
-### camel-core - default TLS protocols and cipher suites of SSLContextParameters
+Note that `full` also stops filtering the health check metadata out of the per-check data, so the output is more verbose than the previous default in other respects too.
-The default secure socket protocols filter of `SSLContextParameters` now also excludes `TLSv1` and `TLSv1.1` (so `TLSv1.2` is the minimum), and the default cipher suites filter also excludes the `3DES` cipher suites. The default filters of an `SSLServerSocket` are now applied over the default (enabled) protocols and cipher suites of the JVM, as they already were for an `SSLSocket` and `SSLEngine`. Previously they were applied over all the supported protocols and cipher suites, which enab [...]
+#### camel-platform-http-starter deletes multipart uploads when the exchange completes
-To use an older protocol (not recommended) configure it explicitly using `secureSocketProtocols`.
+Multipart file uploads are copied out of the servlet container into the servlet temporary directory so that they remain readable after the HTTP request has completed. These temporary copies were never removed and accumulated for the lifetime of the application. They are now deleted when the exchange is done being routed, that is after the response has been written, which aligns the starter with the `deleteUploadedFilesOnEnd` option of `camel-platform-http-vertx` and with `camel-http-comm [...]
-### camel-elasticsearch, camel-opensearch - the maxRetryTimeout option is deprecated
+Routes that consume the upload while the exchange is being routed (saving it with the file producer, streaming it to a remote system, unmarshalling it) are unaffected. A route that stores the temporary path and reads the file after the exchange has completed must opt out and delete the file itself:
-The `maxRetryTimeout` endpoint and component option is deprecated in both `camel-elasticsearch` and `camel-opensearch`. It was a leftover from the old low-level Elasticsearch REST client (`setMaxRetryTimeoutMillis`), which no longer exists in the client these components use today, so setting it had no effect. The option is kept for backward compatibility of existing endpoint URIs but is marked deprecated and will be removed in a future release. Routes that set `maxRetryTimeout` can simpl [...]
+```properties
+camel.component.platform-http.server.delete-uploaded-files-on-end=false
+```
-### camel-netty, camel-netty-http - client authentication of sslContextParameters
+#### camel-platform-http-starter path variables follow the matched path
-A Netty consumer using `sslContextParameters` now uses the client authentication of its server parameters (`clientAuthentication` of `SSLContextServerParameters`, or `camel.ssl.clientAuthentication` with global SSL), also when the `needClientAuth` option is not enabled. Previously `needClientAuth=false` (the default) turned the client authentication off.
+Path variable headers are now taken from the path Spring matched the request against, instead of from the undecoded request URI. The values are therefore percent-decoded and carry no matrix parameters, which is what the vertx engine has always provided.
-### camel-saxon - external XML entity resolution disabled by default in XQuery
+For a consumer such as `platform-http:/greeting/{name}`:
-The XQuery language and the `xquery` component now build their default Saxon `Configuration` with a hardened XML parser that does not accept a `DOCTYPE` declaration and does not resolve external general or parameter entities or external DTDs. This aligns XQuery with the parser configuration already applied to the `String`, `byte[]` and `InputStream` body paths through Camel’s `XmlConverter`, and with `camel-xslt-saxon` (which already defaults `secureProcessing` to `true`).
+
+| Request | Header `name` before | Header `name` now |
+| --- | --- | --- |
+| `/greeting/%61dmin` | `%61dmin` | `admin` |
+| `/greeting/John%20Doe` | `John%20Doe` | `John Doe` |
+| `/greeting/name;v=1` | `name;v=1` | `name` |
-Previously, when a message body reached XQuery as an already-built `javax.xml.transform.Source` (for example after a `convertBodyTo(Source.class)`), it was parsed with the Saxon parser defaults, which resolved external entities. A body carrying a `DOCTYPE` declaration on that path is now rejected with a parse error. Bodies without a `DOCTYPE` are unaffected.
+An application that decoded the header itself, or that parsed matrix parameters out of it, must drop that handling. Requests whose path variables contain no percent-encoding and no matrix parameters are unaffected.
-A deployment that genuinely needs to parse documents with a `DOCTYPE` or external entities can supply its own pre-configured Saxon `Configuration` through the `configuration` option of the `xquery` endpoint or language (or `XQueryBuilder.setConfiguration(…)`); a user-supplied `Configuration` is used as-is and is not modified.
+`CamelHttpPath` (`Exchange.HTTP_PATH`) is unchanged: it still reports the raw request path with the servlet context-path removed.
-### camel-debezium-oracle - the databaseOutServerName option is removed
+#### camel-micrometer-starter bounds the uri tag
-`databaseOutServerName` is gone from the `debezium-oracle` endpoint and component options. It mapped to Debezium’s `database.out.server.name`, which Debezium deprecated in favour of `xstream.out.server.name`.
+The starter contributes the `uri` low cardinality tag of the `http.server.requests` metrics when `camel.metrics.uri-tag-enabled = true`. Two things change in this release.
-Camel already drops the options that Debezium deprecates, but the filter only recognised the ones the connector declares as a `Field`, so this one - declared as a plain `String` constant - slipped through and was published as a second, undocumented spelling of the same setting. Routes that set `databaseOutServerName` should use `xstreamOutServerName` instead; it configures the same XStream outbound server and is unchanged.
+First, the property is now matched in its documented kebab-case form. The auto-configuration was conditional on `camel.metrics.uriTagEnabled`, a spelling that Spring Boot cannot resolve from a relaxed binding source, so an application that configured `camel.metrics.uri-tag-enabled = true`, the name listed in the starter documentation, never got the Camel uri tag at all. Both spellings now enable it. An application that had the kebab-case property set therefore starts seeing Camel consume [...]
-### camel-kafka - sslContextParameters and the SSL endpoint options
+Second, when a request does not resolve to a Camel HTTP consumer — a 404, or any request served by something else than the Camel servlet — the tag was the requested path (servlet path plus path info) verbatim. Micrometer registers a meter per distinct tag value and keeps it for the lifetime of the process, so the number of meters followed the number of distinct paths that had been requested, instead of the number of routes. Such requests now keep the `uri` value computed by Spring’s own [...]
-When `sslContextParameters` is configured (also using global SSL with `useGlobalSslContextParameters`), the SSL endpoint options (such as `sslTruststoreLocation`) are now applied after the `sslContextParameters`, as documented. Previously the SSL endpoint options were ignored when `sslContextParameters` was configured.
+With `camel.metrics.uri-tag-dynamic = true` the requested path is still used, such as `/camel/users/123`, but only for requests that resolve to a Camel consumer, and the tag value is now capped at 200 characters.
-When `sslContextParameters` is configured and `securityProtocol` is the default (`PLAINTEXT`), the security protocol `SSL` is now used. Previously `PLAINTEXT` was used unless `securityProtocol` (or `saslAuthType`) was configured.
+Dashboards and alerts that matched on the raw path of requests that are not served by Camel must use the Spring value instead, for example the mapped pattern `/actuator/health` of a Spring MVC endpoint.
-### camel-kafka - a suspended consumer keeps its partitions
+#### camel-jasypt-starter defaults to PBEWITHHMACSHA256ANDAES\_256
-A route started with its consumer suspended, for example by a `ThrottlingExceptionRoutePolicy` with `keepOpen=true`, now starts its Kafka consumer: the consumer joins the consumer group and holds its assigned partitions paused until the route is resumed. Previously its fetcher thread ended at once, so it never connected, and the other members of the group consumed those partitions while the circuit was open; now they stay with this consumer, as for a route suspended while it runs. A susp [...]
+`camel.component.jasypt.algorithm` now defaults to `PBEWITHHMACSHA256ANDAES_256` instead of `PBEWithMD5AndDES`. The starter already recognises that algorithm as one that requires an initialization vector, so `org.jasypt.iv.RandomIvGenerator` is installed automatically when `camel.component.jasypt.iv-generator-class-name` is not set.
-### camel-kafka - shared client code moved to camel-kafka-common
+This is a breaking change for existing encrypted values: a value produced under `PBEWithMD5AndDES` cannot be decrypted with the new default, and startup fails with an `EncryptionOperationNotPossibleException` when the property is resolved. Either re-encrypt the values with the new algorithm, or pin the previous default:
-The Kafka client code that the `kafka` component shares with other Kafka based components has been moved from `camel-kafka` into a new `camel-kafka-common` module. This includes `KafkaClientConfiguration` (the base class of `KafkaConfiguration`), `AbstractKafkaComponent`, `KafkaConstants`, `KafkaHeaderFilterStrategy`, the header serializers and deserializers (`org.apache.camel.component.kafka.serde`), `KafkaSecurityConfigurer` and `KafkaAuthType`, `PollExceptionStrategy`, `PollOnError`, [...]
+```properties
+camel.component.jasypt.algorithm = PBEWithMD5AndDES
+```
-`camel-kafka` depends on `camel-kafka-common`, so nothing changes for applications that depend on `camel-kafka`. If you build your classpath without transitive dependencies, add the `camel-kafka-common` dependency:
+Whichever Jasypt tooling is used to produce the ciphertext must be given the same algorithm **and** a random IV generator — the Jasypt CLI defaults to no IV generator, and a value encrypted without one cannot be decrypted by the starter:
-```xml
-<dependency>
- <groupId>org.apache.camel</groupId>
- <artifactId>camel-kafka-common</artifactId>
- <version>${camel.version}</version>
-</dependency>
+```bash
+jbang org.apache.camel:camel-jasypt:<camel-version> \
+ -c encrypt -p "$JASYPT_PASSWORD" -i my-secret-value \
+ -a PBEWITHHMACSHA256ANDAES_256 -riga SHA1PRNG
```
-### camel-pulsar - the producer no longer replaces the body with the message id
+The `camel-jasypt` component itself is unchanged: `JasyptPropertiesParser` leaves the algorithm unset, so it still falls back to the Jasypt library default of `PBEWithMD5AndDES`. Aligning the component with the starter is a separate change; until it lands, an application that configures `JasyptPropertiesParser` directly keeps the old algorithm unless it sets one.
-After sending, the producer used to overwrite the message body with the `MessageId` returned by the broker, so every step after the `to("pulsar:…")` saw a `MessageId` instead of the payload, and a route such as `.to("pulsar:a").to("pulsar:b")` published a Java-serialized `MessageId` to the second topic. That behaviour dates from the asynchronous send added in 3.20 (CAMEL-16030).
+The starter’s usage documentation no longer shows the master password next to the encrypted value it protects. Use the `sysenv:` or `sys:` prefixes of `camel.component.jasypt.password` to read it from the environment or a JVM system property, or inject it from an external secret store.
-The body is now left untouched, and the assigned id is reported on the new `CamelPulsarProducerMessageId` header instead.
+#### Starter configuration options that cannot be bound are reported
-A route that read the `MessageId` from the body must read that header instead.
+The starters bind `camel.component.*`, `camel.dataformat.*` and `camel.language.*` onto the Camel component, data format or language they configure. Two steps of that binding used to discard a configured value without reporting it, so a mistyped or unbindable option left the target at its default and nothing appeared in the log. Both now report the value they cannot use, which matches what `camel.rest.*` has always done.
-### camel-jolt - switch from unmaintained bazaarvoice jolt to the jolt-community fork
+An option of a complex (object) type is configured with a reference to a bean, such as:
-The JOLT library dependency has been migrated from `com.bazaarvoice.jolt:jolt-core` to `io.github.jolt-community.jolt:jolt-community-core`. See [JOLT (Community Edition)](https://github.com/jolt-community/jolt-community).
+```properties
+camel.component.http.ssl-context-parameters = #bean:mySslContextParameters
+```
-Due to the package rename from `com.bazaarvoice.jolt` to `io.joltcommunity.jolt`, users who plug custom `Transform` or `ContextualTransform` classes into a Chainr spec need to update their imports to `io.joltcommunity.jolt.Transform` and `io.joltcommunity.jolt.ContextualTransform`. Users referencing `Removr` directly also need to update their import to `io.joltcommunity.jolt.removr.Removr`.
+The generated converter used to return `null` for any value that did not start with `#`, and for a value naming a bean that does not exist. A typo in the bean id therefore produced a component with the option unset. Such a value now aborts startup with a message naming the value, the target type and the configuration prefix it was set under. A plain bean id with no `#` prefix — `mySslContextParameters` — is resolved rather than discarded, as are `#autowired` and `#type:com.foo.MyType`.
-### camel-jcr - internal Camel headers are now filtered when mapping node properties
+These converters are registered with `@ConfigurationPropertiesBinding` and therefore take part in every `@ConfigurationProperties` binding in the application, not only in Camel’s own. A binding whose target class is neither under `org.apache.camel` nor annotated with `@ConfigurationProperties` for a `camel.` prefix keeps the previous behaviour, so adding a starter to the classpath cannot make an unrelated application property fail to bind.
-The `jcr` producer now applies a `HeaderFilterStrategy` when converting between JCR node properties and Camel message headers. With the default strategy, header names starting with `Camel` or `camel` (case-insensitively) are no longer copied in either direction:
+The generated customizers copied the whole configuration onto the target with `failIfNotSet=false`, so an option with no matching setter on the target was dropped without a log line. An option that the application configured itself and that cannot be set now aborts startup. An option that only carries the default the generator took from the Camel catalog is logged at `DEBUG` and ignored, since the target keeps its own default and there is nothing to fix in the application. The options be [...]
-- the `CamelJcrGetById` operation no longer maps a node property whose name is a Camel internal header (for example `CamelHttpUri`) onto the message;
-
-- the insert operation no longer persists Camel internal headers carried on the message as node properties.
-
+An application that set an option which never took effect will therefore now fail to start. The remedy is to correct or remove the reported option. To restore the previous tolerance while doing so:
-Ordinary document properties are unaffected and continue to be mapped as before. A route that relies on the previous behaviour can supply a custom `headerFilterStrategy` on the `jcr` endpoint to opt out of, or narrow, the filtering.
+```properties
+camel.springboot.lenient-configuration-binding = true
+```
-### camel-spring-ws - internal Camel headers are now filtered when mapping SOAP response headers
+Such an option is then logged at `WARN` with its name, instead of being dropped silently as before.
-When `allowResponseHeaderOverride` is enabled, the `spring-ws` producer now applies the endpoint’s `headerFilterStrategy` to the SOAP response header attributes and elements it maps onto the message, as the `spring-ws` consumer already does for inbound SOAP headers. With the default `SpringWebserviceHeaderFilterStrategy`, attribute and element names starting with `Camel` or `camel` (case-insensitively) are no longer copied onto the message.
+This affects hand-written code as well. `CamelPropertiesHelper.setCamelProperties(context, target, properties, false)`, and `CamelPropertiesHelper.copyProperties` which calls it, are public API used by hand-written customizers and auto-configuration outside the generated starters. They keep ignoring an option that cannot be set — that behaviour is unchanged — but each such option is now logged at `WARN` naming the option and the target class, where previously nothing was logged at all. A [...]
-Other SOAP response header attributes and elements are mapped as before, and the raw SOAP header is still available in the `CamelSpringWebserviceSoapHeader` header. A route that relies on the previous behaviour can supply a custom `headerFilterStrategy` on the `spring-ws` endpoint.
+### camel-spring-redis
-### camel-spring-ws - internal Camel headers are no longer written into SOAP headers
+#### the default serializer applies a deserialization filter
-The default `messageFilter` of the `spring-ws` component, `BasicMessageFilter`, now applies the endpoint’s `headerFilterStrategy` before it writes a message header into the SOAP header, both on the request sent by the producer and on the response returned by the consumer. With the default `SpringWebserviceHeaderFilterStrategy`, message headers whose names start with `Camel` or `camel` (case-insensitively) are no longer written into the SOAP header. Other message headers are written as before.
+The default serializer, `JdkSerializationRedisSerializer`, now installs a JEP-290 `java.io.ObjectInputFilter` while reading Redis payloads, resolved through `DeserializationFilterHelper`. Previously no filter was applied at all. This affects both the consumer, which deserializes the payload of every message published to the subscribed channels, and the producer read commands, which deserialize the values stored in Redis.
-A `BasicMessageFilter` created in application code applies a `SpringWebserviceHeaderFilterStrategy` unless it is created with another strategy. A route that relies on the previous behaviour can supply a custom `headerFilterStrategy` on the `spring-ws` endpoint.
+When no explicit pattern is configured, the JVM-wide `jdk.serialFilter` is honoured if set, otherwise the shared Camel default allow-list is applied (it permits standard Java and Apache Camel types, denies `java.net.**`, and enforces JEP-290 graph-shape limits). Routes that exchange classes outside that allow-list must widen it through the new `deserializationFilter` endpoint option, for example:
-### camel-mustache, camel-chunk - potential breaking change
+```java
+from("spring-redis://localhost:6379?command=SUBSCRIBE&channels=myChannel"
+ + "&deserializationFilter=com.example.model.**;java.**;!*")
+```
-The Exchange header constants in `MustacheConstants` and `ChunkConstants` have been renamed to follow the Camel naming convention used across the rest of the component catalog (so that they are handled consistently by `DefaultHeaderFilterStrategy`, like the other template components). The Java field names are unchanged; only the header string values have changed.
+Setting the `serializer` option to a custom `RedisSerializer` bypasses the filter entirely, since Camel then no longer controls how the payload is read.
-`MustacheConstants`:
+#### SpringRedisIdempotentRepository.remove returns false for a missing key
-
-| Constant | Previous value | New value |
-| --- | --- | --- |
-| `MustacheConstants.MUSTACHE_RESOURCE_URI` | `MustacheResourceUri` | `CamelMustacheResourceUri` |
-| `MustacheConstants.MUSTACHE_TEMPLATE` | `MustacheTemplate` | `CamelMustacheTemplate` |
+`SpringRedisIdempotentRepository.remove` now returns `false` when the key was not in the repository, as documented by `IdempotentRepository`. It previously returned `true` for any key. The Idempotent Consumer does not use the returned value.
-`ChunkConstants`:
+### camel-spring-ws
+
+#### internal Camel headers are now filtered when mapping SOAP response headers
-
-| Constant | Previous value | New value |
-| --- | --- | --- |
-| `ChunkConstants.CHUNK_RESOURCE_URI` | `ChunkResourceUri` | `CamelChunkResourceUri` |
-| `ChunkConstants.CHUNK_TEMPLATE` | `ChunkTemplate` | `CamelChunkTemplate` |
+When `allowResponseHeaderOverride` is enabled, the `spring-ws` producer now applies the endpoint’s `headerFilterStrategy` to the SOAP response header attributes and elements it maps onto the message, as the `spring-ws` consumer already does for inbound SOAP headers. With the default `SpringWebserviceHeaderFilterStrategy`, attribute and element names starting with `Camel` or `camel` (case-insensitively) are no longer copied onto the message.
-Both components read these headers only when `allowTemplateFromHeader=true`. Because the old names sat outside the `Camel` namespace, `DefaultHeaderFilterStrategy` did not strip them, so such a header arriving from an untrusted sender reached the producer; with the `Camel` prefix the headers are now filtered at the component boundary, so the template or resource can only come from the route. For that reason the old names should not simply be restored.
+Other SOAP response header attributes and elements are mapped as before, and the raw SOAP header is still available in the `CamelSpringWebserviceSoapHeader` header. A route that relies on the previous behaviour can supply a custom `headerFilterStrategy` on the `spring-ws` endpoint.
-Routes that reference the constants (for example `setHeader(MustacheConstants.MUSTACHE_TEMPLATE, …)`) are unaffected. Routes that set the header by its literal string name, or that use `allowTemplateFromHeader=true` with the old header names, must switch to the new `Camel`\-prefixed names.
+#### internal Camel headers are no longer written into SOAP headers
-### camel-cluster - clustered routes stop when the file lock view is stopped, and the initial delay is honoured
+The default `messageFilter` of the `spring-ws` component, `BasicMessageFilter`, now applies the endpoint’s `headerFilterStrategy` before it writes a message header into the SOAP header, both on the request sent by the producer and on the response returned by the consumer. With the default `SpringWebserviceHeaderFilterStrategy`, message headers whose names start with `Camel` or `camel` (case-insensitively) are no longer written into the SOAP header. Other message headers are written as before.
-When a file lock cluster view (`camel-file`) is stopped while this member is the leader, for example with the `stopView` JMX operation, the stop of the cluster service or the stop of the clustered route controller, the listeners are now told that the leadership is lost. The clustered routes (`ClusteredRoutePolicy`) and the `master` consumers are then stopped. Previously they kept running while the file lock was released, so another member could take the leadership and both members ran th [...]
+A `BasicMessageFilter` created in application code applies a `SpringWebserviceHeaderFilterStrategy` unless it is created with another strategy. A route that relies on the previous behaviour can supply a custom `headerFilterStrategy` on the `spring-ws` endpoint.
-The `initialDelay` of a clustered route policy is now also honoured when the leadership is taken after the CamelContext has started (which is common with the file lock cluster service, as the lock is taken after a short delay). Previously the routes were then started right away.
+### camel-spring-xml
-The `acquireLockInterval` of the file lock cluster service must now be at least 1 millisecond.
+#### routeController supervising="false"
-### camel-infinispan - clustered routes stop when the Infinispan cluster view is stopped
+In the Spring XML `<camelContext>`, `<routeController supervising="false"/>` previously still switched to the supervising route controller, as any value of the `supervising` attribute did. The supervising route controller is now only used when `supervising` is `true`.
-When an Infinispan cluster view (`camel-infinispan` or `camel-infinispan-embedded`) is stopped while this member is the leader, for example with the `stopView` JMX operation, the stop of the cluster service or the stop of the clustered route controller, the listeners are now told that the leadership is lost, before the leader key is removed from the cache. The clustered routes (`ClusteredRoutePolicy`) and the `master` consumers are then stopped. Previously they kept running while the lea [...]
+#### streamCaching enabled option
-An error while refreshing the leader key no longer stops the periodic refresh of the leadership. The leadership is given up (so the clustered routes are stopped) until the next refresh succeeds, as this member can no longer be sure that it holds the leader key. An error while refreshing only the membership entry of this member keeps the leadership.
+In the Spring XML `<camelContext>`, the `enabled` option of `<streamCaching>` now turns stream caching on or off for the routes, the same as the `streamCache` attribute on `<camelContext>` (which takes precedence when both are set). Previously `<streamCaching enabled="false"/>` did not turn off stream caching.
-### camel-pqc - FileBasedKeyLifecycleManager restricts keyId to a flat file name
+The `bufferSize` option of `<streamCaching>` is now applied; it was ignored before.
-`FileBasedKeyLifecycleManager` now confines every key file to its configured key directory. A `keyId` (supplied through the `CamelPQCKeyId` / `CamelPQCNewKeyId` headers) that contains a forward slash, a backslash, a null character, or that would otherwise resolve outside the key directory is now rejected with an `IllegalArgumentException`.
+A spool rule in the `spoolRules` option that does not exist in the registry now fails the startup of the Camel context, instead of being ignored.
-Previously a `keyId` such as `tenant-a/signing` resolved into a subdirectory of the key directory. Deployments that organised keys that way must switch to a flat `keyId` (for example `tenant-a-signing`). Only the file-based manager is affected; the in-memory and cloud-backed managers were never file-path based.
+### camel-sql and camel-sql-stored
-### camel-pqc - Bouncy Castle 1.86 (Breaking change)
+#### camel-sql - JdbcAggregationRepository with optimistic locking
-Camel now uses Bouncy Castle 1.86, which removes the legacy implementations of several post-quantum algorithms from the `BCPQC` provider.
+With optimistic locking, `JdbcAggregationRepository` (and `ClusteredJdbcAggregationRepository`, `PostgresAggregationRepository` and `ClusteredPostgresAggregationRepository`) now fails with an `OptimisticLockingException`, so that the aggregator retries, when a message was aggregated on a group that another thread or Camel instance completed meanwhile. Prior to Camel 4.23 the completed group was stored again together with the new message, so its messages were sent a second time, or a new [...]
-**Picnic removed.** Bouncy Castle 1.86 no longer ships Picnic, so the `PICNIC` value of the `signatureAlgorithm` option, the `PQCSignatureAlgorithms.PICNIC` constant and `PQCDefaultPicnicMaterial` have been removed. Routes signing with Picnic must move to another signature algorithm, such as `MLDSA` or `SLHDSA`.
+A new group now starts with a random positive version instead of `1`, so that a version read from an earlier group of the same correlation key never matches it. The `version` column must therefore be a 64-bit integer, as in the documented `version BIGINT NOT NULL`. Groups stored before the upgrade keep their version.
-**Classic McEliece and FrodoKEM use the `BC` provider.** `CMCE` and `FRODO` are now served by the Classic McEliece and FrodoKEM implementations of the `BC` provider (JCA names `CMCE` and `FrodoKEM`) instead of `BCPQC`. That implementation has no `mceliece348864` or `frodokem640` parameter sets: the `parameterSpec` option rejects them, and the default parameter sets of the key lifecycle managers changed from `mceliece348864` to `mceliece460896` and from `frodokem640aes` to `frodokem976aes`.
+#### camel-sql, camel-sql-stored - the query/template override headers are gated
-**Stored keys must be generated again.** The `BC` provider rejects the algorithm identifier of Classic McEliece and FrodoKEM keys generated by the removed `BCPQC` implementations, and Picnic keys can no longer be read at all. Keys of these algorithms held by a key lifecycle manager, a key store or the registry have to be regenerated, and the peers they are shared with updated.
+A message header could override the endpoint-configured SQL by default, letting an incoming message choose the executed statement:
-**`parameterSpec` for `DILITHIUM`, `SPHINCSPLUS` and `KYBER`.** These algorithms generate ML-DSA, SLH-DSA and ML-KEM keys, so `parameterSpec` now takes the standardized parameter-set names, for example `ML-DSA-65`, `SLH-DSA-SHA2-128S` or `ML-KEM-768`. The `dilithium2`, `dilithium3` and `dilithium5` names are no longer accepted, while `kyber512`, `kyber768`, `kyber1024` and SPHINCS+ names such as `sha2-128s` still are. With Bouncy Castle 1.85 a `DILITHIUM` or `SPHINCSPLUS` endpoint config [...]
+- `camel-sql`: the `CamelSqlQuery` header replaced the endpoint query.
+
+- `camel-sql-stored`: the `CamelSqlStoredTemplate` header replaced the endpoint template, and its value was resolved through `SqlHelper.resolveQuery`, which resolves `file:`, `http:`, `https:` and `classpath:` resources.
+
-Code that creates key material itself has to follow the same move: the `CMCEParameterSpec`, `FrodoParameterSpec`, `KyberParameterSpec`, `DilithiumParameterSpec`, `SPHINCSPlusParameterSpec` and `PicnicParameterSpec` classes of `org.bouncycastle.pqc.jcajce.spec` no longer exist. Use `CMCEParameterSpec`, `FrodoKEMParameterSpec`, `MLKEMParameterSpec`, `MLDSAParameterSpec` and `SLHDSAParameterSpec` of `org.bouncycastle.jcajce.spec` with the `BC` provider instead.
+Both overrides are now disabled by default and must be opted into, matching the `allowTemplateFromHeader` convention already used by the template components (camel-freemarker, camel-velocity, camel-xslt, …):
-### camel-crypto
+- `camel-sql`: set `allowQueryFromHeader=true` to honour the `CamelSqlQuery` header again.
+
+- `camel-sql-stored`: set `allowTemplateFromHeader=true` to honour the `CamelSqlStoredTemplate` header again; a header-supplied template is now resolved with property placeholders only, never as a `file:`, `http:`, `https:` or `classpath:` resource.
+
-Three changes to `CryptoDataFormat`, none of which affects the format of data already written.
+A route that relied on either header must set the corresponding option on the endpoint.
-**A per-message initialization vector when inlining.** `marshal` used to throw `Inlining cannot be performed, as no initialization vector was specified` when `shouldInlineInitializationVector` was set without a statically configured vector — which pushed routes into reusing one vector for every message, the thing inlining exists to avoid. A fresh vector is now generated per message when none is supplied. Because the vector is written into the message, readers pick it up from the stream a [...]
+Opting back in is not quite the previous behaviour. `SqlHelper.resolveQuery` applied placeholder resolution only to a value that had a scheme, so a schemeless header template used to reach the database untouched; it now always goes through `SqlHelper.resolvePlaceholders`, which drops `--` comment lines and blank lines and re-joins the rest with newlines. That is immaterial for the single-line call syntax a stored-procedure template normally uses, but a route passing a multi-line commente [...]
-**Authentication failures report uniformly.** A tampered message previously surfaced two distinguishable outcomes: `Given final block not properly padded` from the cipher, or `Expected mac did not match actual mac` from the MAC check. A caller able to submit ciphertext and observe which one came back can use that distinction to recover plaintext. Both now report `Message authentication failed`, and the message no longer includes the expected and computed MAC values — the computed one is [...]
+Additionally, `camel-sql-stored` with `useMessageBodyForTemplate=true` now uses the message body verbatim as the stored-procedure template text and no longer resolves it through `SqlHelper.resolveQuery`. A body beginning with `file:`, `http:`, `https:` or `classpath:` is therefore treated as literal template text instead of being fetched as a resource, consistent with how `camel-sql` already treats the body under `useMessageBodyForSql=true`. A route that relied on the body being a resour [...]
-**The inlined vector length is bounded.** The length prefix is read from the message and used to size an allocation; a declared length outside 0–1024 is now rejected instead of attempted.
+Observability follows the gate. The `db.statement` span tag set by the `sql` span decorator (camel-telemetry and the deprecated camel-tracing) is now taken from the `CamelSqlQuery` header only when the endpoint sets `allowQueryFromHeader=true`; otherwise the tag is omitted rather than reporting a statement that was never executed. A route that reads `db.statement` from a `sql:` span and relies on the header value must set `allowQueryFromHeader=true`. The same gate applies to the `sql-tra [...]
-Not changed: the HMAC key is still derived from the same key material as the cipher. Separating them would change the MAC written into the message and so could not be read by earlier versions; that is tracked separately.
+### camel-support
-### camel-core - the debugger waitForAttach option now suspends message processing
+#### Property binding creates nested list element at its index
-With `camel.debug.waitForAttach=true` the backlog debugger now suspends the processing of messages at startup until a debugger is attached, as the option documents. Previously the option only set a flag, and messages were processed straight away. An application that has this option set now waits at startup until a debugger attaches.
+When a property key goes through a list element that does not exist yet, such as `camel.beans.cluster.servers[1].host`, the element is now created at its index, and the list is padded with `null` up to that index, as a single key such as `names[3]=x` and an array property already did. Before, the new element was appended to the end of the list whatever its index was. So the keys of one element could end up on several elements, and a list of 11 or more nested elements lost some of them, b [...]
-### camel-spring-xml - routeController supervising="false"
+A configuration that numbers its elements from 1, or leaves a gap, with one key per element, such as `servers[1].host=a` and `servers[2].host=b`, used to give a list without the gap (`[a, b]`). It now gives `[null, a, b]`. Number the elements from 0 without gaps, or make the code that uses the list skip `null` elements.
-In the Spring XML `<camelContext>`, `<routeController supervising="false"/>` previously still switched to the supervising route controller, as any value of the `supervising` attribute did. The supervising route controller is now only used when `supervising` is `true`.
+The list key `last`, which was documented but failed with a `NumberFormatException`, now refers to the last element of a list (index 0 when the list is empty). Arrays still need a number.
-### camel-spring-xml - streamCaching enabled option
+#### BackgroundTask repeating schedule cancellation
-In the Spring XML `<camelContext>`, the `enabled` option of `<streamCaching>` now turns stream caching on or off for the routes, the same as the `streamCache` attribute on `<camelContext>` (which takes precedence when both are set). Previously `<streamCaching enabled="false"/>` did not turn off stream caching.
+`BackgroundTask.schedule` now cancels the repeating schedule it created once the task has completed or has run out of budget. Previously the returned `Future` stayed armed and the task kept being re-run as a no-op for the lifetime of the executor. Callers that inspect the returned `Future` will see `isCancelled()` return `true` after the task is done, where it previously stayed live. Callers that already cancel the `Future` themselves are unaffected.
-The `bufferSize` option of `<streamCaching>` is now applied; it was ignored before.
+#### Throttling route policies only resume self-suspended consumers
-A spool rule in the `spoolRules` option that does not exist in the registry now fails the startup of the Camel context, instead of being ignored.
+`ThrottlingInflightRoutePolicy` now only resumes a consumer that it suspended itself. It also no longer resumes the consumer while the route is being stopped or suspended (for example while `stopRoute` waits for the inflight exchanges), or while Camel is stopping. `ThrottlingExceptionRoutePolicy` no longer resumes the consumer of a route that was suspended through the route controller while the circuit was open.
-### camel-core - invalid time patterns in options are rejected
+For a consumer that is not `Suspendable`, `ThrottlingInflightRoutePolicy` previously called `start` on the consumer (and logged that it resumed the consumer) whenever an exchange completed below the resume threshold, even when it had not stopped the consumer. It now only starts a consumer that it stopped itself, so it no longer restarts a consumer that was stopped by the route controller or by other means. Such a consumer is still stopped and started to throttle the route, as before.
-Numeric options such as `period`, `delay` or `timeout` accept a time pattern such as `5s` or `1h30m`. An invalid value is now rejected with an error when the endpoint is created. Previously it was silently turned into `0` (or only a part of it was used), so a typo such as `period=five` or `period=1m30` configured a period of `0` or `60000` without any warning. The unit is now case-insensitive (`5S` is 5 seconds) and a negative time pattern such as `-5s` is kept as a negative value. A tim [...]
+### camel-syslog - text outside US-ASCII
-### camel-core - normalizeWhitespace turns tabs and new lines into a space
+The syslog data format and the `SyslogMessage` type converter decoded every byte of a message as one ISO-8859-1 character, so any text outside US-ASCII (for example the UTF-8 that RFC 5424 specifies for MSG and for structured data values) came out as two to four wrong characters. The text is now decoded with the charset of the exchange (the `CamelCharsetName` header or exchange property, which the `encoding` option of camel-netty and camel-mina sets), and UTF-8 when none is set. A MSG th [...]
-The Simple function `${normalizeWhitespace()}` now turns every run of whitespace (including tabs and new lines) into a single space. Previously only runs of spaces were collapsed and a tab or new line was kept as-is.
+US-ASCII messages are parsed as before. A route that repaired the wrongly decoded text itself must stop doing so.
-### camel-core - onException and doCatch configuration is validated when the route is created
+### camel-thrift
-The `onWhen` predicate of an `onException` is now created when the route is created (as with `doCatch` and `onCompletion`), so an invalid `onWhen` expression now fails at startup, instead of when an exception occurs.
+The `thrift` data format used to deserialize into its own `defaultInstance` and return that object to every exchange. Because Thrift’s `TBase.read()` assigns only the fields present in the incoming bytes, a message that omitted an optional field kept the value left there by the previous message, concurrent unmarshals interleaved into the same object, and all in-flight bodies were the same reference.
-A class in `onException` or `doCatch` that is not an exception (such as `<exception>java.lang.String</exception>` in XML or YAML) now fails at startup. Previously it was accepted, and never matched any exception.
+`unmarshal` now creates a copy of `defaultInstance`, clears it to the generated type’s default-constructor state, and deserializes into that copy. Each exchange therefore gets its own object, omitted fields do not inherit values set on `defaultInstance`, and `defaultInstance` itself remains untouched.
-### Header names are matched in any case
+Routes that compared unmarshalled bodies by identity, or that mutated one body expecting the change to be visible on another, must be updated.
-Message headers are case-insensitive, and components now also match the header names they look for in any case:
+#### Consumer - failed exchanges
-- camel-jms, camel-sjms: a standard JMS header set with another case, such as `jmscorrelationid` or `JMSTYPE`, now sets the JMS header (such as the correlation id). Previously it was sent as a JMS property with that name.
-
-- camel-cxf: a `content-type` or `camelhttpresponsecode` header is used as the content type or response code of the CXF message, as `Content-Type` and `CamelHttpResponseCode` are.
-
-- camel-tracing, camel-telemetry, camel-netty-http: a header whose name starts with `Camel` in any case (such as `camelFoo`) is treated as a Camel header.
-
+The Thrift consumer now sends the exception of a failed exchange to the client as the result of the call: an exception declared by the Thrift method (such as `throws (1:InvalidOperation ouch)`) as that exception, any other exception as a `TApplicationException`. Before, with `synchronous=true` the failure was ignored (a `void` method returned normally, other methods returned the message body converted to the return type, or failed with `Return type requires not empty body`), and in the d [...]
-### camel-debezium - a failed embedded engine is now reported
+### camel-tika
-The Debezium consumers now register a `CompletionCallback` on the embedded engine. When the engine stops with an error - for example because the connector cannot reach the database, or the offset store cannot be read - the failure is passed to the consumer’s `ExceptionHandler`, and the consumer’s health check reports `DOWN` with that error.
+#### Tika 4 upgrade and configuration changes
-Previously the engine reported such failures only through its own logger, so the route stayed started and healthy while no longer receiving any change event. Deployments that use readiness or liveness probes will now see a Debezium route whose engine has died reported as `DOWN`, where it was previously reported as `UP`. The engine is still not restarted automatically.
+The Tika dependency has been upgraded from 3.x to 4.x. Tika 4 removed the `TikaConfig` class and XML configuration support in favor of `TikaLoader` and JSON configuration. Consequently, the deprecated `tikaConfig` and `tikaConfigUri` options have been removed. Use `tikaLoader` to provide an `org.apache.tika.config.loader.TikaLoader`, or `tikaConfigFile` to load a JSON configuration file. Applications using either removed option must migrate their Tika configuration; see the [Tika 4 migra [...]
-### camel-debezium - consumer readiness during startup
+#### Metadata header filtering
-Debezium consumer health checks now retain the configured initial state (`DOWN` by default) until the embedded engine has started its connector tasks and enters its polling phase. Previously, they reported `UP` during startup as long as no engine failure had been reported. Readiness does not wait for a change event or for an initial snapshot to complete. To keep the previous optimistic startup behavior, configure `camel.health.initial-state=up`. Engine failures continue to report `DOWN` [...]
+The `tika:parse` producer copies the metadata of the parsed document onto the Camel message. Those names come out of the document itself, so a document could ask for any header name at all, including names in the Camel-internal namespace — an HTML `<meta name="CamelFileName" content="…"/>`, for example, reached the message as `CamelFileName` and would then be picked up by a later `file:` producer.
-### camel-core - event notifier exchange sent and redelivery events
+Parsed metadata names are now filtered the same way a consumer filters names supplied by an external sender: a name that starts with `Camel`, `camel` or `org.apache.camel.` (matched case-insensitively) is skipped and logged at `DEBUG` instead of being set as a header. Metadata outside that namespace is mapped exactly as before.
-An event notifier now receives the `ExchangeSentEvent` also when it does not want the `ExchangeSendingEvent` (with `ignoreExchangeSendingEvents=true`, or when `isEnabled` only accepts the sent event). Previously the sent event was only emitted when some event notifier had accepted the sending event.
+Routes that deliberately read a `Camel`\-prefixed header produced by the Tika parse must set it themselves after the `tika:parse` step, for example with a `setHeader` reading the corresponding non-prefixed metadata name.
-The `ignoreExchangeRedeliveryEvents` option on an event notifier is now used to ignore the `ExchangeRedeliveryEvent`. Previously the redelivery event was ignored by the `ignoreExchangeFailedEvents` option instead, and `ignoreExchangeRedeliveryEvents` had no effect.
+### camel-undertow
-An event notifier that is added after `CamelContext` has been started is now started (and it is stopped when it is removed).
+#### String bodies in the charset of the Content-Type
-### camel-mongodb - a failed exchange is reported, and does not advance the consumer’s position
+The Undertow consumer (response) and producer (request) always wrote a `String` body as UTF-8, even when the `Content-Type` declared another charset (for example `text/plain; charset=ISO-8859-1`). A `String` body is now written in the charset that the `Content-Type` declares. Bodies that are not a `String`, and messages whose `Content-Type` declares no charset, are sent as before (UTF-8 by default). A peer that ignored the declared charset and read such a message as UTF-8 must now use th [...]
-Both MongoDB consumers ignored the outcome of the route. A failure left on the exchange was never looked at, and an exception thrown from the processor was caught and dropped. With the default error handler the failure was still logged once redelivery was exhausted, but with `noErrorHandler`, or an error handler that does not log, it left no trace. The failure is now also passed to the consumer’s `ExceptionHandler`, which logs it by default, so expect an additional log line for each fail [...]
+##### The charset parameter of the Content-Type in any case
-A failed exchange also no longer advances the consumer’s position. The tailable cursor consumer updates its tail tracking value, and the change streams consumer records and commits its resume token, only after the route processed the event without a failure. Previously both did so for every event, whether or not the route failed. With `persistentTailTracking=true` the stored position is therefore that of the last successful record.
+The `charset` parameter of a `Content-Type` was only recognized in lower case. A request with `Content-Type: text/plain; Charset=ISO-8859-1` did not set `CamelCharsetName` (so its body was read as UTF-8), and a `String` body with such a `Content-Type` was written as UTF-8. The parameter name is now matched case-insensitively (RFC 9110), as in the other HTTP components, on the consumer (request and response) and on the producer.
-This is not a retry. The next event that succeeds moves the position past the failed one. A failed event is read again only if the consumer reopens its cursor from the stored position before a later event has succeeded, for example when the cursor is regenerated, or on a restart with persistent tail tracking or a resume strategy.
+#### WebSocket endpoints apply security provider and handlers
-### camel-mongodb - the change stream id header is no longer always an ObjectId
+WebSocket endpoints (`ws://` and `wss://`) now apply the `UndertowSecurityProvider` (the `securityConfiguration` or `securityProvider` option), the `allowedRoles` option, and the `handlers` and `accessLog` options, as HTTP endpoints do. Previously these options had no effect on WebSocket endpoints. They apply to the upgrade request: a client that the security provider rejects, or that connects to an endpoint with `allowedRoles` but no security provider, now gets the same status code as o [...]
-The `_id` header set by the change streams consumer (`MongoDbConstants.MONGO_ID`) used to be read as an `org.bson.types.ObjectId` unconditionally, which threw for a document whose `_id` is a string, a number or a compound key, and for the events that carry no document key at all (`invalidate`, `drop`, `rename`, `dropDatabase`).
+All the endpoints of a WebSocket path share its connections. The settings of the consumer apply to the path, including the messages sent by producers on that path, and keep applying while the consumer is stopped; a path that only has producers applies their settings. This also applies to the `oauthProfile` option: while the consumer is stopped, upgrade requests to its path are still validated. A connection that was opened before these settings applied does not receive the messages of the [...]
-It now carries the id in its natural Java type - an `ObjectId` when MongoDB generated it, otherwise a `String`, a number, or a `Document` for a compound key - and is absent for the events without a document key. A route that casts this header to `ObjectId` should check the type first, or keep working unchanged if its collection uses generated ids.
+A WebSocket client that connected without satisfying the configured security provider or allowed roles is now rejected: it must authenticate, or the option must be removed from the WebSocket endpoint.
-### camel-seda - purging the queue completes the discarded exchanges
+#### Property placeholders in HTTP URI override headers
-When a SEDA queue is purged (with `purgeWhenStopping=true` or the `purgeQueue` JMX operation), the discarded exchanges are now failed with a `RejectedExecutionException` and their on completions are executed. A producer waiting for the reply of a discarded exchange (`waitForTaskToComplete`) is released with that exception, instead of waiting until its `timeout`, or forever when the timeout is disabled. On completions handed over to a discarded InOnly exchange, such as the commit or rollb [...]
+The HTTP producers no longer resolve property placeholders (`{{…}}`) in the message-supplied endpoint-URI override headers `CamelHttpUri` and `CamelRestHttpUri`. Those headers carry message content, while property placeholders are a route and configuration authoring feature resolved at build time on the endpoint URI written in the route. This is the same alignment 4.22 applied to `toD` and `enrich`.
-### camel-pulsar - PulsarMessageUtils.updateExchange returns the exchange it was given
+Placeholders written in the route’s endpoint URI continue to be resolved exactly as before:
-`PulsarMessageUtils.updateExchange(message, exchange)` used to return a **copy** of the exchange passed to it. It now populates and returns that same instance.
+```java
+.to("http://localhost/{{basePath}}")
+.to("netty-http:http://localhost/{{basePath}}")
+```
-The copy orphaned the exchange the consumer had taken from the exchange factory, so with `camel.main.exchange-factory=pooled` every consumed message leaked one pooled exchange and the pool never refilled. Code outside the component that called this method and relied on getting an independent copy must make its own copy instead.
+A `{{…}}` token arriving in `CamelHttpUri` or `CamelRestHttpUri` is now treated as a literal part of the URI rather than being expanded. Routes that relied on that expansion must resolve the value before it reaches the header, or keep the placeholder in the route.
-### camel-pulsar - a failed exchange is negatively acknowledged
+The affected sites, all of which resolved a header-derived or endpoint-derived value per message:
-When a route fails, the consumer now calls `negativeAcknowledge` on the Pulsar consumer instead of leaving the message unacknowledged. This only applies when `allowManualAcknowledgement` is `false` (the default); with manual acknowledgement the route stays in charge, as before.
+- `camel-http` - `HttpMethodHelper.createMethod`
+
+- `camel-http-common` - `HttpHelper.createURL`, `HttpHelper.createMethod`
+
+- `camel-netty-http` - `NettyHttpHelper.createURL`
+
+- `camel-undertow` - `UndertowHelper.createURL`, `UndertowHelper.createMethod`
+
+- `camel-vertx-http` - `VertxHttpHelper.resolveHttpURI`
+
-This changes when the message comes back. Previously it was redelivered once the acknowledgement timeout expired, which `camel-pulsar` sets to 10 seconds by default through `ackTimeoutMillis`. A negative acknowledgement removes the message from the client’s unacknowledged-message tracker, so redelivery now follows `negativeAckRedeliveryDelayMicros`, which defaults to 60 seconds, and honours `negativeAckRedeliveryBackoff` when one is configured.
+Where the value came from the endpoint rather than a header it was already resolved at build time, so removing the per-message resolution does not change those routes.
-A route that wants the previous timing can set `negativeAckRedeliveryDelayMicros=10000000`.
+### camel-util - retainAll on the key set of the message headers ignores case
-### camel-core - scheduled poll consumer
+`retainAll` on the key set of `CaseInsensitiveMap`, and so on `exchange.getMessage().getHeaders().keySet()`, now keeps a key when the given collection holds its name in any case, as lookups do. For example `headers.keySet().retainAll(List.of("accept"))` now keeps the `Accept` header. Prior to Camel 4.23 the names were compared case-sensitively, and such a call removed `Accept`. To keep headers by their exact name, remove the others explicitly, for example with `headers.keySet().removeIf( [...]
-The `delay`, `initialDelay`, `timeUnit` and `useFixedDelay` of a scheduled poll consumer that are changed while the consumer is stopped (such as using JMX) are now used when the consumer is started again. Previously the values from the first start were kept.
+### camel-vertx
-When a backoff (`backoffMultiplier`) finishes, the error counter of the consumer (used by the health checks and JMX) is no longer reset to 0. It is reset when a poll succeeds. The number of skipped polls is the same as before.
+#### request/reply over the event bus
-### camel-seda - multipleConsumers broadcasts to consumers with different uri options
+When a `vertx` consumer receives a message that expects a reply and the route fails, the sender now gets a failure reply (a `ReplyException` with failure type `RECIPIENT_FAILURE`, failure code 500 and the message `Exchange processing failed`; the exception of the route is not sent to the sender). Before, the consumer replied with the message body as if the route had succeeded, which usually echoed the request back. A route that ends without a body now replies with an empty (`null`) body [...]
-With `multipleConsumers=true` every consumer of a SEDA queue now receives a copy of each message, also when the consumers use the same queue name with different consumer options, such as `seda:foo?multipleConsumers=true` and `seda:foo?multipleConsumers=true&concurrentConsumers=5`. Previously each distinct endpoint uri only multicast to its own consumers, so such consumers silently competed for the messages instead of each receiving a copy.
+#### the vertxFactory option takes the public VertxBuilder
-### camel-core - bridgeErrorHandler no longer handles a failed exchange twice
+The type of the `vertxFactory` option of the `vertx` component changed from the Vert.x internal class `io.vertx.core.impl.VertxBuilder` to the public interface `io.vertx.core.VertxBuilder`. The internal class does not implement the interface, and it no longer exists in Vert.x 5.
-With `bridgeErrorHandler=true`, an exchange that failed while being routed (and was already handled by the error handler of the route, such as an `onException` that does not mark it as handled) is no longer bridged to the error handler a second time. Previously the `onException` (and dead letter channel) of the route was invoked twice for the same failure, the second time with the message body replaced by the error message. The bridge error handler is only for errors that happen when the [...]
+An application that sets this option must create the builder with `Vertx.builder()`:
-A query parameter named `hash` in an endpoint uri (such as `[http://host/path?hash=abc](http://host/path?hash=abc)`) is now kept as a regular parameter. Previously it was always removed (it is only used internally by the endpoint DSL to identify endpoints).
+```java
+// before
+component.setVertxFactory(new io.vertx.core.impl.VertxBuilder(options));
-When both `bridgeErrorHandler=true` and `exceptionHandler` are configured on an endpoint, then `bridgeErrorHandler` is now used, as documented. Previously the `exceptionHandler` was used.
+// after
+component.setVertxFactory(Vertx.builder().with(options));
+```
-### camel-core - Recipient List releases the producers of recipients it did not send to
+An application that does not set `vertxFactory` is not affected.
-The Recipient List acquires a producer for every recipient before it starts sending. When it completes before it has sent to every recipient (for example with `stopOnException` or a `timeout`), it now releases the producers of the recipients it did not send to. Previously these producers were never released: a pooled (non-singleton) producer was not returned to its pool, and with `cacheSize(-1)` the prototype endpoint and its producer were never stopped.
+### camel-vertx-http - the REST producer applies the outbound header filter
-With `parallelProcessing`, a recipient whose task had not started yet when the Recipient List completed is now skipped instead of being sent to afterwards. As before, recipients that had already started keep running.
+`VertxHttpRestHeaderFilterStrategy.applyFilterToCamelHeaders` delegated to `applyFilterToExternalHeaders`, so it consulted the inbound filter while implementing the outbound direction. The outbound filter that `VertxHttpHeaderFilterStrategy` installs was therefore never applied, and the sibling REST strategies in `camel-http-common`, `camel-netty-http` and `camel-undertow` all delegate to the matching method.
-### camel-health - readiness is the same for every exposure level
+A REST producer that resolves to `vertx-http` and does not configure its own `headerFilterStrategy` now filters the common HTTP headers on the outbound direction, as the other HTTP components already did. A message header named `Content-Length`, `Content-Type`, `Host`, `Cache-Control`, `Connection`, `Date`, `Pragma`, `Trailer`, `Transfer-Encoding`, `Upgrade`, `Via` or `Warning` is no longer copied onto the outgoing request; the `Content-Type` of the request is still taken from the exchan [...]
-The readiness of Camel is now the same regardless of the health check exposure level (`full`, `default` or `oneline`). Previously with the `default` and `oneline` exposure levels, health checks in the `UNKNOWN` state were not included in the result, and Camel could report ready, while the `full` exposure level reported not ready for the same state. These health checks are now included, so Camel is not ready in all exposure levels.
+Routes that relied on one of those headers reaching the wire must set it through the endpoint configuration or supply a `headerFilterStrategy` that permits it.
-A health check that is disabled (such as a consumer health check turned off with `healthCheckConsumerEnabled=false`) no longer influences the readiness, in any exposure level. Previously a disabled health check made Camel not ready with the `full` exposure level.
+### camel-wasm
-A route health check now reports `DOWN` when the route is suspended (or is starting or stopping), the same as when the route is stopped. Previously it reported the initial state of the health check registry.
+#### a failed call discards the Wasm instance
-A health check that fails with an exception now reports `DOWN` (with the exception as the error), instead of failing the whole health check.
+When a Wasm function fails without returning (a trap, such as a Rust `panic`), the `wasm` producer or `wasm` expression now discards its module instance and creates a new one for the next message, instead of reusing an instance whose memory kept everything the failed call had allocated. State that the module keeps between messages is reset at that point.
-Setting `camel.health.enabled=false` now disables the health check registry. Previously the registry was still enabled, and health checks (such as the context health check) were still loaded and invoked.
+#### the wasm predicate
-### camel-core - properties component locations
+The `wasm` language used as a predicate only matched a Jackson `BooleanNode` result, so with the default result type (`byte[]`) or `resultType` set to `Boolean` or `String` it never matched. The result is now evaluated with the standard Camel rules (`true`/`false` text, a `Boolean`, empty is `false`), so filters and choices that never matched before can now match. A `JsonNode` result still only matches when it is the JSON boolean `true`.
-A properties location with an unknown (or misspelled) resolver, such as `Classpath:app.properties` or `C:\app.properties` (use `file:` for a file path), now fails when Camel is started. Previously the location was silently ignored. The supported resolvers are `classpath:`, `file:` and `ref:`. Mark the location as optional (`;optional=true`) or set `ignoreMissingLocation=true` to ignore it.
+### camel-weaviate - removed the unused vector field name header
-A `;` in the path of a location (such as `file:/opt/a;b/app.properties`) is now kept as part of the path. Previously the path was cut off at the `;` (only `;optional=true` is an option of a location).
+The `CamelweaviateVectorFieldName` header (`WeaviateVectorDbHeaders.VECTOR_FIELD_NAME`) has been removed. It was read by the Weaviate embeddings data-type transformer but its value was never used — the embedding vector is always sent as the object vector, so a "vector field name" had no effect (Weaviate has no named vector-field concept in this producer). Routes that set this header can simply drop it; behaviour is unchanged.
### camel-xmlsecurity, camel-avro - data format options now carry their security metadata
@@ -2870,41 +3044,31 @@ Two data formats are affected. On `xmlSecurity` the `passPhrase`, `passPhraseByt
This is visible in two places. `passPhraseByte` is now masked as `xxxxxx` wherever Camel sanitizes values, such as in logged endpoint URIs and route dumps; `passPhrase` and `keyPassword` were already masked because other components declare options with the same names. The YAML DSL JSON schema now also marks `passPhrase` and `keyPassword` with `"format": "password"`, so editors that consume the schema render them as password fields.
-### camel-core - simple contains on a collection and comparing a String with a boolean
-
-The `contains` operator of the simple language now type coerces each element of a collection, the same way it already did for an array. For example `${header.ids} contains '2'` is now `true` when the header is a `List` of the numbers 1, 2 and 3. With `ignoreCase` (the `~~` operator) an element of a collection must now be equal to the value (ignoring case), where previously it was enough for the element to contain the value as a substring, which was also not the case without `ignoreCase`.
-
-A String is now only equal to a boolean when it is `true` or `false` (ignoring case). Previously any other String was equal to `false`, so `${body} == false` was `true` when the body was `hello`.
+### camel-xpath
-### camel-coap
+The XPath language now parses the message with the same hardened XML parser for every `documentType`.
-The CoAP consumer now answers a failed exchange with `5.00 Internal Server Error`, and no longer returns the exception’s message to the client.
+With the default `documentType` of `org.w3c.dom.Document` the payload was already converted to a DOM through Camel’s `DocumentBuilderFactory`, which disallows a `DOCTYPE` declaration and does not resolve external entities. When `documentType` was set to `org.xml.sax.InputSource` (or `javax.xml.transform.sax.SAXSource`) the payload was instead handed straight to `javax.xml.xpath.XPathExpression`, which builds a `DocumentBuilder` of its own using the JDK defaults — so a `DOCTYPE` was accep [...]
-Previously the consumer did not check whether the exchange had failed: a route failure was answered with `2.05 Content` and whatever body the message held when the route failed. When the response could not be built once the route had completed, for example because the body could not be converted to `byte[]`, the exception’s message was sent to the client as the payload of a `5.00 Internal Server Error` response.
+Those document types now go through the same conversion as `Document`. A message carrying a `DOCTYPE` declaration that previously evaluated is now rejected with a `SAXParseException`, matching the behaviour the default `documentType` has always had.
-A new `muteException` consumer option controls the payload of the error response, and it defaults to `true`, the same default as the HTTP consumers and the `camel-knative`, `camel-mina`, `camel-cxf` and `camel-grpc` consumers: the payload is empty. A route that relies on the exception’s message reaching the client must opt back in explicitly:
+A deployment that genuinely needs to parse documents with a `DOCTYPE` can relax the parser as before, through the `org.apache.camel.xmlconverter.documentBuilderFactory.feature:` system properties, for example:
```text
-coap://0.0.0.0:5683/my/resource?muteException=false
+-Dorg.apache.camel.xmlconverter.documentBuilderFactory.feature:http://apache.org/xml/features/disallow-doctype-decl=false
```
-For the Rest DSL, set it with `restConfiguration().endpointProperty("muteException", "false")`.
-
-#### Producer
-
-When the CoAP server does not answer a `GET`, `POST`, `PUT` or `DELETE` request (the request timed out or was rejected), the producer now fails the exchange with a `CamelExchangeException`. Before, the exchange continued as if the request had succeeded, with the request body as its body. The `CamelCoapMethod` header is now also accepted in lower case, and an unknown method fails the exchange with an `IllegalArgumentException` instead of sending nothing.
-
-### camel-quickfix - InOut replies are sent on the session the request arrived on
+This is not a functional change for messages without a `DOCTYPE`, and it does not add a document parse: `XPathExpression.evaluate(InputSource)` already built a full DOM internally.
-With `exchangePattern=InOut`, the QuickFIX/J consumer now sends the reply on the session the request was received on. Previously it read the `SessionID` header when the route completed, so a route that changed that header also changed which session received the reply. A route that changed the `SessionID` header to send the reply to another session must now send that message with a QuickFIX/J producer endpoint that sets the `sessionID` option.
+### camel-xslt and camel-xslt-saxon
-### camel-xslt and camel-xslt-saxon - implicit DOM sources
+#### implicit DOM sources
When a non-`Source` input is implicitly converted to a `DOMSource` pointing at its owner document’s root element, the Saxon-backed XSLT transformer now starts at the document node. This preserves document-root (`match="/"`) template behavior when, for example, a CXF payload is converted to a DOM source. The default JDK XSLT transformer already starts at the document node; the change also applies to `xslt:` when configured with Saxon as its transformer factory. The original DOM and source [...]
Custom implicit converters that intentionally select the document element as the XSLT context may observe different template selection. To retain element-context semantics, provide an explicit `DOMSource(element)` as the body or through the endpoint’s `source` expression.
-### camel-xslt / camel-xslt-saxon - external document() access is denied by default
+#### camel-xslt / camel-xslt-saxon - external document() access is denied by default
Camel’s default XSLT transformer factory (`XMLConverterHelper`) sets `ACCESS_EXTERNAL_DTD` and `ACCESS_EXTERNAL_STYLESHEET` to the empty (deny-all) value. JAXP enforces `ACCESS_EXTERNAL_STYLESHEET` only when no `URIResolver` returns a `Source`, but the `xslt` component always installs its own `XsltUriResolver` on the transformer, so that resolver used to resolve external `http:`, `https:`, `ftp:` and `file:` references regardless — the factory’s deny-all setting silently did nothing at t [...]
@@ -2916,46 +3080,19 @@ This also affects a **relative** `document()` when the stylesheet itself was loa
If a route legitimately needs `document()` to read an external resource, supply a custom `TransformerFactory` via the `transformerFactory` option whose `ACCESS_EXTERNAL_STYLESHEET` permits the required protocols (set the attribute to a comma-separated protocol list such as `file` or `http,https`, or to `all`). Camel’s internal `classpath:`, `ref:` and `bean:` schemes are outside the JAXP external-access model and remain resolvable. Stylesheet `xsl:include` / `xsl:import` references are r [...]
-### camel-openapi-validator - repeated request headers are validated value by value
-
-A header that occurs more than once in a request used to be passed to the request validator as the text of the Java collection holding its values, such as `[a, b]`. The values are now passed as they were sent. As a result:
-
-- A header that the contract declares as a single value (not an array) and that occurs more than once is now rejected with `400`, where it was accepted before.
-
-- A header that the contract declares as an array may be repeated. This is treated like one header with the values joined by commas (RFC 9110, section 5.3), and each value is checked against the item schema of the array. This applies to OpenAPI 3.0 contracts: for an OpenAPI 3.1 contract the validator does not recognise a header parameter as an array, so a repeated header is rejected like a single-value one.
-
-
-### camel-jms - request/reply completes the exchange once when a send fails late
-
-An InOut exchange whose JMS send fails after the request timeout, or the reply, has already completed the exchange (for example a send that blocks longer than `requestTimeout` and then fails) is no longer completed a second time with the send exception. The send failure is logged at WARN level instead, and the exchange keeps the outcome of the timeout or the reply.
-
-The `cancelCorrelationId` method of `org.apache.camel.component.jms.reply.ReplyManager` (added in 4.22) now returns a `boolean`: `true` if the pending reply was cancelled, `false` if the request timeout or the reply had already taken it. A custom `ReplyManager` implementation has to change the return type.
-
-### camel-milo - potential breaking change
-
-Since 4.16, the `samplingInterval` default of 0.0 was ignored and milo’s own `OpcUaMonitoredItem` default of 1000 ms was used. Now the parameter is used again, but the default is changed to 1000.0 to take the previous behaviour (starting with 4.16) into account. The same applies to a configured `requestedPublishingInterval` or data-change filter, which now take effect. The parameter `requestedPublishingInterval` is now part of the cache key, resulting in multiple clients for different va [...]
-
-The parameter `dataChangeFilterDeadbandType` changes type from `UInteger` to `Integer`. This changes the public `MonitorFilterConfiguration` getter/setter and the endpoint-DSL builder method, so Java code passing a `UInteger` will no longer compile.
-
-## ThrottlingExceptionRoutePolicy
+### camel-yaml-dsl
-`ThrottlingExceptionRoutePolicy.setKeepOpen(true)` now opens the circuit immediately and synchronously (the consumer is suspended before the setter returns) rather than waiting for the next `onExchangeDone()` callback. This is the intended behaviour and makes the `keepOpen` toggle deterministic, but callers that previously relied on the setter being inert until an exchange arrived must be aware of the change. Setting `keepOpen` back to `false` remains deferred: the half-open timer attemp [...]
-
-## Route reload
-
-Dev-mode route reloading now finds changed files by scanning the watched folder on an interval and comparing each file’s modification time and length with the previous scan, instead of using the JDK `WatchService`. A scan reports all the files of one save together, which is what a reload needs: a route is built with the properties of the moment, so a route and a property saved together must be reloaded together. It also removes the macOS penalty, where Java has no native file notificatio [...]
+#### the canonical schema requires route:
-A dot directory under the watched folder is no longer scanned. `.camel-jbang`, where `camel run` keeps the properties of the run it is doing, was reloading the routes whenever it was written, and `.git` or `.idea` were walked on every scan for nothing. A route file inside a dot directory is therefore no longer watched.
-
-`FileWatcherResourceReloadStrategy.setPollTimeout` is now how often the folder is scanned. Its default is unchanged at 2000 milliseconds, so on Linux and Windows a change is noticed within two seconds rather than immediately, and on macOS within two seconds rather than up to ten. A new `setStableTimeout` (default 200 milliseconds) leaves a file that was only just modified for the next scan, so a save still being written is not reloaded half-finished.
+A top-level `- from:` without `- route:` is the compact notation of a route, and the canonical schema (`camelYamlDsl-canonical.json`) no longer lists `from` among its top-level entries: a route is written under `route:`, as an XML route is always a `<route>`, and as Kaoto and Karavan write it. `camel validate yaml --canonical` now reports a top-level `from:` with the form to write, the way it reports the other compact shapes, and `camel validate normalize` rewrites it. The Integration te [...]
-### camel-cli-connector
+#### endpoint parameters keep the order they are written in
-The ~/.camel file handling moved from `LocalCliConnector` to the new `FileCliConnectorTransport`, so the protected `task()`, `actionTask()`, `statusTask()` and `traceTask()` methods were removed from `LocalCliConnector`. Subclasses that only override `sigterm()` are not affected.
+The endpoint uri of a YAML DSL endpoint written with `parameters:` has its query options in the order they are written, where it had them sorted by name: `uri: seda` with `name: foo`, `size: 1234` and `multipleConsumers: true` is now `seda:foo?size=1234&multipleConsumers=true`. Route dumps in YAML keep that order as well. The options of an endpoint are the same, and the endpoint resolved is the same, as Camel sorts the options when it normalizes the uri.
-The thread of the file transport (`LocalCliConnector` in its name) is now a daemon thread, as the threads of the WebSocket transport already were. Before, it kept the JVM alive when the application failed to start, for example a Spring Boot application whose port was in use: Camel had not started, so it never stopped the connector. An application that only kept running because of this thread now exits; keep it running on purpose, for example with `camel.main.run-controller=true` for a Sp [...]
+The same applies to `EndpointUriFactory.buildUri` and the catalog `asEndpointUri` given an ordered map such as a `LinkedHashMap`: the options are in the order of the map. A map without an order, such as a `HashMap`, has its options sorted as before.
-### Route dumps as YAML and Java
+#### Route dumps as YAML and Java
Routes dumped as YAML (`camel.main.dumpRoutes=yaml`, `camel transform route --format=yaml`) are now written as the YAML DSL loads them:
@@ -2976,45 +3113,8 @@ A top-level `onException` (of a YAML file, or in the `configure` method of a `Ro
When `camel.main.dumpRoutesOutput` is a file and the routes come from several files, they are now dumped together, so a top-level `onException` comes before the first route. When the dump is loaded, such an `onException` applies to the routes of all the files, not only to those of its own file, and a WARN is logged when the routes are dumped. Dump into a directory to keep one file per source file.
-### camel-jbang-mcp - camel\_transform\_route
-
-The `camel_transform_route` tool now converts with the same route DSL converter as `camel transform route --format=java`. It reads the routes without running them, so a Java route is no longer compiled. Instead it is read by the Java DSL parser, and a route the parser cannot read (such as a processor lambda) is refused with the reason. Property placeholders are kept as written instead of being resolved.
-
-In return, Java is also a target format, and rests, route templates, route configurations and beans are converted instead of only routes. A new `notes` field of the result lists what differs or is not carried over.
-
-### camel-ai-tool - route tools receive the caller’s context but a clean message
-
-Route tools invoked by an agent (`camel-langchain4j-agent`, `camel-openai`, `camel-spring-ai-chat`) now run on an exchange that carries the calling exchange’s **properties** and **variables** — so a tool route can be guarded on the caller’s identity, for example `exchangeProperty.subject` — but with a **clean message**: the tool route receives only its own arguments (as headers), not the caller’s body or inbound headers.
-
-`camel-langchain4j-agent` previously copied the whole calling exchange, so its tool routes also saw the caller’s body and inbound headers, and a tool that set no body returned the caller’s body to the model. A tool route that read the caller’s body or a caller header must now obtain that data another way (for example an exchange variable or property). The tool exchange also now runs in its own unit of work and with its own exchange id instead of the caller’s, so a tool route’s `onComplet [...]
-
-`camel-openai` and `camel-spring-ai-chat` previously created a fresh exchange and did not propagate the caller’s context at all; they now do, which is what makes a tool route guarded on `exchangeProperty.subject` work under those runtimes.
-
-### camel-ai-tool - new AiToolResult.AuthorizationDenied result variant (SPI)
-
-`org.apache.camel.component.ai.tool.AiToolResult` is a sealed interface and gained a new variant, `AiToolResult.AuthorizationDenied`, returned when an `ai-tool` route’s `authorizationPolicy` denies a call. Code that consumes `AiToolResult` and handles its variants exhaustively — for example an AI adapter whose final branch casts to `AiToolResult.ExecutionError` — must add a branch for `AuthorizationDenied` and relay its `message()` to the model as a refusal (do not rethrow). The in-tree [...]
-
-### camel-kubernetes
-
-The `kubernetes-configmaps` developer console now reports the config map names and refresh settings from `camel.vault.kubernetescm` instead of reading the Kubernetes secrets vault configuration. Its text output labels the list `Config maps in use:` instead of `Secrets in use:`. Both Kubernetes vault consoles return empty lists when no resource names are configured.
-
-### camel-datasonnet - DataWeave auto-conversion now fails fast on unsupported or malformed scripts
-
-`camel-datasonnet` can auto-convert DataWeave 2.0 expressions to DataSonnet at route startup. Two aspects of that conversion are now stricter:
-
-- **Unsupported semantic constructs:** Previously, when the DataWeave expression contained constructs that could not be auto-converted, the language emitted a `WARN` log and continued, yielding a partially-converted (and likely broken) expression. Starting with this release, such expressions throw `DataWeaveConversionException` at expression-creation time, failing the route startup with a clear error message.
-
-- **Syntactically malformed scripts:** Previously, a DataWeave script with syntax errors (e.g. a missing `}`) could pass the parser and produce a garbled or partial AST, leading to unpredictable runtime behaviour. The parser now throws `DataWeaveConversionException` for any syntactically invalid input, failing fast at startup instead of silently tolerating malformed scripts.
-
-
-In both cases the exception is thrown at expression-creation time (route startup), not at message processing time. Users who relied on the previous lenient behaviour must fix the malformed or unconvertible expressions. Scripts with unsupported DataWeave constructs must be rewritten in DataSonnet directly, or moved to a `.ds` file.
-
-The conversion also follows the DataWeave semantics more closely, which changes the result of some scripts that were converted before. For example, a selector on a missing field now gives `null` (as in DataWeave) instead of failing, `default` applies to missing fields, and a field selector on an array selects the field of every element. With an XML input, a selector matches an element by its local name (whatever its namespace prefix), an empty element is `null`, and an element written to [...]
-
-### camel-datasonnet - `c.sortBy` sorts arrays of numbers and strings by the key function
-
-The `c.sortBy(arr, f)` function of `camel.libsonnet` ignored the key function `f` for an array of numbers or strings, and sorted the values themselves. It now sorts by the key function, as documented (for example `c.sortBy([1, 3, 2], function(x) -x)` gives `[3, 2, 1]`). Arrays of objects are sorted as before.
+### camel-zipfile, camel-tarfile - a maxDecompressedSize of 2 GiB or more is now enforced
-### camel-jbang - `camel transform dataweave` no longer aborts on parse errors in directory mode
+The `maxDecompressedSize` option of the Zip File and Tar File data formats (and of `ZipSplitter`) was not enforced when set to 2 GiB (`Integer.MAX_VALUE` bytes) or more, because the byte count behind the check wrapped around. The limit is now enforced for any value: unmarshalling an entry that decompresses to more than the configured `maxDecompressedSize` fails with an `IOException`, as documented. The default limit (1 GiB) is unchanged, and `-1` still disables the limit.
-The `camel transform dataweave` CLI command previously let a `DataWeaveConversionException` propagate out of `converter.convert()`, which caused the entire batch to stop at the first file that triggered a parse error. The command now catches the exception per file, prints `<filename>: <error message>` to standard output, continues with the remaining files, and exits non-zero when at least one file failed. Files that convert successfully are still written to the output directory.
\ No newline at end of file
+`IOHelper.copy(InputStream, OutputStream, int, boolean, long)` now returns `Integer.MAX_VALUE`, instead of a negative number, when it copies more than `Integer.MAX_VALUE` bytes.
\ No newline at end of file
diff --git a/manual/camel-4x-upgrade-guide-4_24.html b/manual/camel-4x-upgrade-guide-4_24.html
index e642b01760..49bb4d182c 100644
--- a/manual/camel-4x-upgrade-guide-4_24.html
+++ b/manual/camel-4x-upgrade-guide-4_24.html
@@ -1 +1 @@
-<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>Apache Camel 4.x Upgrade Guide :: Apache Camel</title> <link rel="canonical" href="https://camel.apache.org/manual/camel-4x-upgrade-guide-4_24.html"> <meta name="generator" content="Antora 3.2.0"> <link rel="stylesheet" href="../_/css/vendor/docsearch-5db8a73adb.css"> <link rel="stylesheet" href="../_/css/site-fcc1ff1ab1.css"> <meta name="application-n [...]
\ No newline at end of file
+<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>Apache Camel 4.x Upgrade Guide :: Apache Camel</title> <link rel="canonical" href="https://camel.apache.org/manual/camel-4x-upgrade-guide-4_24.html"> <meta name="generator" content="Antora 3.2.0"> <link rel="stylesheet" href="../_/css/vendor/docsearch-5db8a73adb.css"> <link rel="stylesheet" href="../_/css/site-fcc1ff1ab1.css"> <meta name="application-n [...]
\ No newline at end of file
diff --git a/manual/camel-4x-upgrade-guide-4_24.md b/manual/camel-4x-upgrade-guide-4_24.md
index 2306b15838..f9034804db 100644
--- a/manual/camel-4x-upgrade-guide-4_24.md
+++ b/manual/camel-4x-upgrade-guide-4_24.md
@@ -20,10 +20,139 @@ This document is for helping you upgrade your Apache Camel application from Came
So `camel validate` can report an endpoint it did not report before.
+### camel-jpa, camel-hazelcast - an exchange marked rollback only is not consumed
+
+When a route marks the exchange rollback only (for example with `markRollbackOnly()` or `markRollbackOnlyLast()`) there is no exception on the exchange, and these consumers treated it as a success. The JPA consumer deleted the entity (or called its `@Consumed` method) and committed the poll, and the transacted (`transacted=true`) Hazelcast SEDA consumer committed its transaction, so the message was removed from the queue. Now a rollback only exchange is not consumed: the JPA consumer lea [...]
+
+A message that the route marks rollback only every time was removed before, and is now consumed again at every poll (JPA), or taken from the queue again at once, without a delay (transacted Hazelcast SEDA, as for a failed exchange). Handle such a message in the route instead, for example by moving it aside, rather than marking it rollback only every time.
+
### camel-hashicorp-vault - properties without engine use the `secret` engine
A `hashicorp:` property without an engine, such as `{{hashicorp:mysecret}}` or `{{hashicorp:mysecret#field}}`, now reads the secret from the `secret` engine. Before, it read from the engine of the `hashicorp:` property resolved before it (or from a `null` engine), and `{{hashicorp:mysecret#field}}` always resolved to no value. Properties with an engine, such as `{{hashicorp:secret:mysecret#field}}`, are not affected.
A `hashicorp:` property without an engine and with a version, such as `{{hashicorp:mysecret@2}}`, now reads version 2 of the secret `mysecret` in the `secret` engine. Before, the `@2` was kept as part of the secret name.
-A `hashicorp:` property with a field of a secret that does not exist, such as `{{hashicorp:secret:missing#field}}`, now resolves to no value, as it already did without a field, so its default value or an optional placeholder (`{{?hashicorp:secret:missing#field}}`) applies. Before, without a default value, it failed with a `NullPointerException`.
\ No newline at end of file
+A `hashicorp:` property with a field of a secret that does not exist, such as `{{hashicorp:secret:missing#field}}`, now resolves to no value, as it already did without a field, so its default value or an optional placeholder (`{{?hashicorp:secret:missing#field}}`) applies. Before, without a default value, it failed with a `NullPointerException`.
+
+### camel-lra - only an LRA hosted by the configured coordinator is joined
+
+The LRA saga service now joins, completes or compensates an LRA only when its URL is under the configured LRA coordinator (`coordinatorUrl` followed by `coordinatorContextPath`). A message whose `Long-Running-Action` header holds the URL of another coordinator now fails, instead of the saga service calling that URL.
+
+If your participants reach the same coordinator under different URLs, for example with different host names, list the other coordinator URLs, including the context path, in the new `allowedCoordinatorUrls` option (`camel.lra.allowedCoordinatorUrls`).
+
+This also applies to the LRAs the service starts itself, which a nested saga route looks up again: when the coordinator returns LRA URLs under another base URL than `coordinatorUrl`, for example behind a proxy, add that base URL to `allowedCoordinatorUrls` as well.
+
+### camel-report-maven-plugin - Java routes are read with the Java DSL parser
+
+The `validate` and `route-coverage` goals read Java routes with the Java DSL parser of camel-java-io instead of camel-route-parser (Roaster). XML routes are read as before. The parser reads every `configure()` method of a source file, including those of a route builder created inside a test, so `validate` can find and validate endpoints it did not see before. An endpoint uri that is only a method call, such as `from(inboxQueue())`, is not validated (it was validated as a property placeho [...]
+
+### camel-jbang - the route-parser plugin is removed
+
+The `route-parser` plugin (`camel route-parser`) and its `camel-jbang-plugin-route-parser` artifact are removed. Use `camel cmd route-structure MyRoute.java` instead: it prints the structure of the routes of a Java source, read without compiling it, and of YAML and XML sources too. If you installed the plugin, remove it with `camel plugin delete route-parser`.
+
+### camel-wasm - the endpoint runs WASI command modules (Breaking change)
+
+The `wasm` endpoint now runs WASI Preview 1 command modules (the body is standard input, standard output becomes the body, the exit code and standard error are in `CamelWasmExitCode` and `CamelWasmStderr`) and no longer supports the custom `alloc`/`dealloc` and JSON message ABI. The URI path is now the module (`wasm:classpath:upper.wasm`); the function name and the `module` option are removed, and a header reaches the module only when listed in `environmentHeaders`. To migrate, turn the [...]
+
+The endpoint runs every exchange on a new instance of the module, so a module can no longer keep state from one message to the next. The 4.23 note that a failed call discards the Wasm instance therefore now only applies to the `wasm` expression.
+
+The following API of `camel-wasm` is removed or changed with the old ABI:
+
+- `WasmComponent.getModule()` and `setModule(String)`, and `WasmConfiguration.getModule()` and `setModule(String)`: the module is the path of the endpoint URI, available as `WasmEndpoint.getModule()`.
+
+- The `functionName` path parameter of the endpoint: the third argument of the `WasmEndpoint` constructor is now the module.
+
+- `WasmSupport.deserialize(byte[], Exchange)`.
+
+- The constructor `WasmProducer(Endpoint, String, String)` is replaced by `WasmProducer(WasmEndpoint)`.
+
+
+### camel-vertx-http - a header with several values is sent as several headers
+
+A message header whose value is a `java.util.Collection` or an object array (as the HTTP consumers map a request header that occurs more than once) was sent as one HTTP header with the `toString()` of the value, for example `[a, b]`. The producer now sends one HTTP header per value. A collection or an object array that is empty, or that holds only null values, now sends no header (an empty List was sent as the header value `[]`).
+
+Every other value is converted to one String and sent as one header as before: a String (also when it contains commas), a `byte[]` and the other primitive arrays, a `Map`, and a Vert.x `JsonObject` or `JsonArray` (sent as JSON). A route that needs the old single header can set the header to a String, for example with `String.valueOf(list)`.
+
+### camel-knative-http - a header with several values is sent as several headers
+
+A message header whose value is a `java.util.Collection` or an object array (as the consumer maps a request header that occurs more than once) is now sent as one HTTP header per value. The Knative HTTP producer sent it as one HTTP header with the `toString()` of the value, for example `[a, b]`, and the reply of the consumer sent only its last value. A collection or an object array that is empty, or that holds only null values, sends no header (the producer sent an empty List as the heade [...]
+
+Every other value is one header. A String is sent as before, also when it contains commas, and the reply still sends no header for a blank String. A `byte[]` is now converted to a String with the type converter (the producer sent its `toString()`, such as `[B@1dc9f5ad`, and the reply only its last byte as a number). The producer sends a `Map` and a Vert.x `JsonObject` or `JsonArray` as before, as their `toString()` (JSON for the Vert.x types). The reply now does the same: it sent only th [...]
+
+A route that needs the old single header of the producer can set the header to a String, for example with `String.valueOf(list)`.
+
+### camel-dapr - the saveBulk and executeTransaction state operations are sent
+
+The `saveBulk` and `executeTransaction` operations of `dapr:state` built their request but never sent it to Dapr, so nothing was stored and the exchange completed without an error. The requests are now sent, and the producer waits for the answer like the other state operations: the states are stored, and a request that Dapr rejects (or a sidecar that cannot be reached) fails the exchange.
+
+### camel-jira - the producers wait for the answer of Jira
+
+The `addComment`, `addIssueLink`, `addWorkLog`, `attach`, `deleteIssue`, `transitionIssue` and `watchers` producers (and `addIssue` for its watchers) sent their request without waiting for the answer, so the exchange continued before Jira had done the work, and a request that Jira rejected (for example no permission, or a transition that is not allowed) was not noticed. They now wait for the answer, as `addIssue` and `updateIssue` already did, and a rejected request fails the exchange wi [...]
+
+A producer that sends several requests can fail after some of them were done: `transitionIssue` can fail on its comment after the transition was made, `watchers` and `addIssue` can fail after some of the watchers were changed (`addIssue` sets the created issue as the message body before it adds the watchers), and a retry or redelivery repeats the earlier requests.
+
+### camel-twitter - twitter-search applies its query options again
+
+Since Camel 4.0 (the upgrade to Twitter4J 4.1, whose `Query` is immutable) the `twitter-search` endpoint sent only the keywords. The consumer ignored `filterOld` (default `true`), `lang`, `count` and the geolocation options, so it routed the same tweets again at every poll. The producer ignored `sinceId`, `lang`, `count` and the `CamelTwitterSinceId`, `CamelTwitterMaxId`, `CamelTwitterSearchLanguage` and `CamelTwitterCount` headers. The options are applied again: a poll returns only the [...]
+
+### camel-atom - sortEntries sorts by the updated date and routes the oldest entry first
+
+With `sortEntries=true` the `atom` consumer sorted the entries of a feed by their published date and routed them from the newest to the oldest one. With the default idempotent strategy (which skips an entry that is not newer than the one routed before it) only some entries of a feed were routed, and the others were skipped.
+
+This is fixed. The entries are now sorted by their updated date (by the published date for an entry without an updated date), which is the date the idempotent strategy compares, and they are routed from the oldest to the newest one, as camel-rss does and as Camel 3.x did. Entries are no longer skipped because of the routing order, also when an older entry was updated after newer ones were published.
+
+Routes using `sortEntries=true` with `idempotent=false` get the entries in this order too: the entry that was updated first is routed first, where the entry that was published last was routed first before.
+
+### camel-aws2-s3 - a listed object that cannot be fetched is skipped
+
+When the consumer lists the bucket, a failure to get one of the listed objects (or to download its content) no longer fails the poll, as long as another object of that listing could be got: the object is skipped, the other listed objects are consumed in that poll, and the skipped object is tried again by a later poll. An object that no longer exists (for example deleted by another consumer after the listing) is skipped with a log line at `DEBUG`. Any other failure is given to the excepti [...]
+
+The poll still fails, as before, when none of the listed objects could be got and at least one get failed with an error other than that the object no longer exists (for example expired credentials, no permission to get objects, throttling): the failure of the first object is then the failure of the poll, and `backoffErrorThreshold` applies. In both cases the objects are no longer kept in the `inProgressRepository`; before, the object (or a new object with the same key) was skipped by all [...]
+
+### camel-aws2-kinesis - the consumer continues after the last record when a shard iterator expired
+
+When a cached shard iterator has expired (an iterator is valid for 5 minutes, so after a route was suspended for longer, or with a `delay` or back-off above 5 minutes), the consumer now continues after the last record it routed from that shard. Previously it requested a new iterator of the configured `iteratorType`: with `TRIM_HORIZON` (the default) it routed all the records of the shard again, with `LATEST` it skipped the records stored meanwhile.
+
+A shard created by a split or a merge while the consumer is running is now read from its first record, whatever the `iteratorType`. Previously, with `LATEST`, the records stored in the new shard before the consumer listed it were skipped. The shards that exist when the consumer starts are read from the configured `iteratorType`, as before.
+
+### camel-servlet and camel-jetty - gzip request body that arrives after the headers
+
+The servlet and Jetty consumers uncompressed a request body with `Content-Encoding: gzip` only when some of its bytes had already arrived when the consumer started to read it. When the client sent the body later than the headers (for example a client that sends `Expect: 100-continue`), the route got the compressed bytes. Such a body is now uncompressed like any other gzip request body. A route that uncompressed the body itself in that case must no longer do so. An empty body is passed on [...]
+
+### camel-github2 - consumers and items of a poll that were not routed
+
+The `github2` consumers (`commit`, `event`, `pullRequest`, `pullRequestComment`, `tag`) remembered every item of a poll as consumed before routing it. Items that were not routed because the route was suspended during the poll were never routed. They are now routed by the first poll after the route is resumed.
+
+The `commit` consumer also lost the new commits of a poll in which the GitHub lookup of an author or a committer failed (for example a 404 for a deleted account, or a server error). Such a commit is now routed, and a WARN is logged for it. Its `CamelGitHubCommitAuthor` and `CamelGitHubCommitCommitter` headers then have the name that git recorded in the commit instead of the name of the GitHub profile, and are not set when the commit has no name either.
+
+### camel-netty-http - the request body read as an InputStream
+
+The body of a request received by the consumer is a `NettyChannelBufferStreamCache`. Its `read()` method now returns a byte as a value from 0 to 255, and -1 at the end of the body, as `java.io.InputStream` requires. Before, a byte from 0x80 was returned as a negative value (0xFF as -1, which a reader takes for the end of the body), and the method threw an `IndexOutOfBoundsException` at the end. `markSupported()` now returns `false` (`mark(int)` never did anything): a reader that needs ma [...]
+
+### camel-dropbox - search and get read every page of the result
+
+The `search` operation (producer and consumer) now returns every match that the service gives. Previously it returned only the first page of the matches (the Dropbox SDK asks for 100 matches per page), and the rest was dropped without any sign. A search with many matches now sends one request per page, for the consumer at each poll. When one of these requests fails, the operation fails and no match is returned, as before.
+
+The `get` operation on a folder (producer and consumer) now downloads every file of the folder. Previously it downloaded only the files of the first page of the folder listing. As before, the content of all the files is in the message body, so a large folder needs more memory than it did when only the first page was read.
+
+### camel-box - getEnterpriseEvents returns the events of every chunk
+
+The `getEnterpriseEvents` operation of the `event-logs` API now returns all the events between `after` and `before`. Previously it returned only the first chunk of the event log (at most 500 events), and the rest was dropped without any sign. A wide `after`/`before` window now returns every event in one list: that is one request per 500 events plus one that finds the end of the log, and more memory. Narrow the window when the event log is large.
+
+### camel-telegram - a failed send fails the exchange once
+
+When Telegram answers a message with an error status (for example `400` for an unknown chat), or with a body that cannot be read, the producer now fails the exchange once and the route stops there. Previously the route first continued after the producer as if the message had been sent, and then the exchange failed as well.
+
+The exception of the exchange is the one that `process()` of the producer threw before: a `RuntimeException` that wraps an `ExecutionException`, with the `RuntimeCamelException` (status and body of the answer) as its cause, or the `IOException` when the request got no answer. The producer still waits for the answer before it returns, so the order of the messages is the same. The steps after the producer now run on the calling thread, and no longer on a thread of the HTTP client.
+
+### camel-vertx-websocket - the client consumer makes one reconnect attempt at a time
+
+When the WebSocket of a consumer with `consumeAsClient=true` is closed, the consumer now makes one reconnect attempt at a time: while an attempt waits for the server (up to the connect timeout), the next runs of `reconnectInterval` are skipped, and `maxReconnectAttempts` counts these attempts one after the other. Previously every interval started another attempt, and when the server answered late each of them opened a WebSocket, so that every message was routed once per WebSocket. A cons [...]
+
+### camel-core - a route from a route template has the template’s resource as its source
+
+A route created from a route template or a Kamelet now returns the resource with the route template from `Route.getSourceResource()` (it returned null). This is the resource its source location (`Route.getSourceLocation()`) was already in, so the debugger and message history consoles show the source code of these routes too.
+
+A route created from a `templatedRoute` also remembers the resource that declares the `templatedRoute` (`Route.getTemplatedRouteResource()`, the `TemplatedRouteSource` JMX attribute, and `templatedRouteSource` in the route dev console), and the route template id is available from `Route.getRouteTemplateId()`, the `RouteTemplateId` JMX attribute, and `routeTemplateId` in the route dev console.
+
+Code that took a null source resource to mean that a route was created from a route template should use `Route.isCreatedByRouteTemplate()` instead.
\ No newline at end of file
diff --git a/manual/camel-jbang-projects.html b/manual/camel-jbang-projects.html
index a6b1638a36..db980a8ae0 100644
--- a/manual/camel-jbang-projects.html
+++ b/manual/camel-jbang-projects.html
@@ -18,7 +18,7 @@ org.apache.camel:camel-kamelet:3.20.0
org.apache.camel:camel-log:3.20.0
...</code></pre> </div> </div> <div class="paragraph"> <p>Output defaults to GAV format. Use <code>--output=maven</code> for Maven XML format. Use <code>--runtime=spring-boot</code> or <code>--runtime=quarkus</code> for runtime-specific dependencies.</p> </div> </div> </div> <div class="sect1"> <h2 id="_generating_sbom_report"><a class="anchor" href="#_generating_sbom_report"></a>Generating SBOM report</h2> <div class="sectionbody"> <div class="paragraph"> <p>Generate a Software Bill of [...]
camel sbom --sbom-format=spdx
-camel sbom --runtime=quarkus</code></pre> </div> </div> <div class="paragraph"> <p>Defaults to CycloneDX format (<code>sbom.json</code>) with <code>camel-main</code> runtime.</p> </div> <div class="sect2"> <h3 id="_copying_dependency_jars"><a class="anchor" href="#_copying_dependency_jars"></a>Copying dependency JARs</h3> <div class="paragraph"> <p>Copy required JARs to a folder (defaults to <code>lib/</code>):</p> </div> <div class="listingblock"> <div class="content"> <pre class="highl [...]
+camel sbom --runtime=quarkus</code></pre> </div> </div> <div class="paragraph"> <p>Defaults to CycloneDX format (<code>sbom.json</code>) with <code>camel-main</code> runtime.</p> </div> <div class="sect2"> <h3 id="_copying_dependency_jars"><a class="anchor" href="#_copying_dependency_jars"></a>Copying dependency JARs</h3> <div class="paragraph"> <p>Copy required JARs to a folder (defaults to <code>lib/</code>):</p> </div> <div class="listingblock"> <div class="content"> <pre class="highl [...]
camel plugin add forage --version=1.2.3
camel plugin get
camel plugin delete <plugin-name></code></pre> </div> </div> <div class="sect2"> <h3 id="_building_custom_plugins"><a class="anchor" href="#_building_custom_plugins"></a>Building custom plugins</h3> <div class="paragraph"> <p>It is possible to build custom Camel CLI plugins. We suggest to take a look at one of the <a href="https://github.com/apache/camel/tree/main/dsl/camel-jbang">existing plugins</a>, to see how that is done.</p> </div> <div class="admonitionblock important"> <div [...]
diff --git a/manual/camel-jbang-projects.md b/manual/camel-jbang-projects.md
index ab4aa2a136..d545ef7a1e 100644
--- a/manual/camel-jbang-projects.md
+++ b/manual/camel-jbang-projects.md
@@ -220,7 +220,6 @@ The plugins of the Apache Camel project:
| `tui` | `camel tui`: the [Camel TUI](camel-jbang-tui.md) |
| `mcp` | `camel mcp`: the [Camel MCP Server](camel-jbang-mcp.md) |
| `edit` | `camel edit`: edit a Camel file in the terminal with suggestions and diagnostics |
-| `route-parser` | `camel route-parser`: parse Java routes and dump their structure |
Plugins bundled with the CLI, such as `tui`, are installed on first use.
diff --git a/manual/camel-jbang-tui-source-editor.html b/manual/camel-jbang-tui-source-editor.html
index e2b42d36d4..2ef0769609 100644
--- a/manual/camel-jbang-tui-source-editor.html
+++ b/manual/camel-jbang-tui-source-editor.html
@@ -1 +1 @@
-<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>Camel TUI Source Editor :: Apache Camel</title> <link rel="canonical" href="https://camel.apache.org/manual/camel-jbang-tui-source-editor.html"> <meta name="generator" content="Antora 3.2.0"> <link rel="stylesheet" href="../_/css/vendor/docsearch-5db8a73adb.css"> <link rel="stylesheet" href="../_/css/site-fcc1ff1ab1.css"> <meta name="application-name" [...]
\ No newline at end of file
+<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>Camel TUI Source Editor :: Apache Camel</title> <link rel="canonical" href="https://camel.apache.org/manual/camel-jbang-tui-source-editor.html"> <meta name="generator" content="Antora 3.2.0"> <link rel="stylesheet" href="../_/css/vendor/docsearch-5db8a73adb.css"> <link rel="stylesheet" href="../_/css/site-fcc1ff1ab1.css"> <meta name="application-name" [...]
\ No newline at end of file
diff --git a/manual/camel-jbang-tui-source-editor.md b/manual/camel-jbang-tui-source-editor.md
index 37fbc812f4..37e35d7a02 100644
--- a/manual/camel-jbang-tui-source-editor.md
+++ b/manual/camel-jbang-tui-source-editor.md
@@ -270,6 +270,7 @@ The template of a Kamelet is a route of the project: **g** lists it under the na
| **Alt+Up/Down** | Move YAML block up/down |
| **Ctrl+D** | Duplicate block |
| **Ctrl+K** | Delete current line |
+| **Ctrl+/** | Comment out the current block, or bring it back (`#` in YAML and properties, `//` in Java) |
| **Ctrl+Left/Right** | Word navigation |
| **Home** | Smart home (content indent / column 0) |
| **Ctrl+R** | Refactoring menu: replace URI, extract to property, extract a step to a new file (YAML, XML) |
diff --git a/manual/camel-report-maven-plugin.html b/manual/camel-report-maven-plugin.html
index f4ae570951..351fc62c8a 100644
--- a/manual/camel-report-maven-plugin.html
+++ b/manual/camel-report-maven-plugin.html
@@ -1,4 +1,4 @@
-<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>Camel Report Maven Plugin :: Apache Camel</title> <link rel="canonical" href="https://camel.apache.org/manual/camel-report-maven-plugin.html"> <meta name="generator" content="Antora 3.2.0"> <link rel="stylesheet" href="../_/css/vendor/docsearch-5db8a73adb.css"> <link rel="stylesheet" href="../_/css/site-fcc1ff1ab1.css"> <meta name="application-name" co [...]
+<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>Camel Report Maven Plugin :: Apache Camel</title> <link rel="canonical" href="https://camel.apache.org/manual/camel-report-maven-plugin.html"> <meta name="generator" content="Antora 3.2.0"> <link rel="stylesheet" href="../_/css/vendor/docsearch-5db8a73adb.css"> <link rel="stylesheet" href="../_/css/site-fcc1ff1ab1.css"> <meta name="application-name" co [...]
<groupId>org.apache.camel</groupId>
<artifactId>camel-report-maven-plugin</artifactId>
<executions>
diff --git a/manual/camel-report-maven-plugin.md b/manual/camel-report-maven-plugin.md
index 4cf19e69a7..5055d7d7f3 100644
--- a/manual/camel-report-maven-plugin.md
+++ b/manual/camel-report-maven-plugin.md
@@ -22,6 +22,8 @@ For validating the source code for mis-configured Camel:
- configuration in properties files
+Java routes are read with the Java DSL parser of camel-java-io, and XML routes with camel-route-parser, without compiling or running them. In a Java route, a value only known at runtime, such as a port held in a field, is validated as a property placeholder (`http://localhost:{{port}}/orders`); an endpoint injected into a field with `@EndpointInject`, and a field with a string initializer, are read as well.
+
Then you can run the `validate` goal from the command line or from within your Java editor such as IDEA or Eclipse.
```bash
diff --git a/manual/jbang-commands/camel-jbang-commands.html b/manual/jbang-commands/camel-jbang-commands.html
index 3179caff1c..21cdd5e113 100644
--- a/manual/jbang-commands/camel-jbang-commands.html
+++ b/manual/jbang-commands/camel-jbang-commands.html
@@ -1 +1 @@
-<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>Camel CLI Command Reference :: Apache Camel</title> <link rel="canonical" href="https://camel.apache.org/manual/jbang-commands/camel-jbang-commands.html"> <meta name="generator" content="Antora 3.2.0"> <link rel="stylesheet" href="../../_/css/vendor/docsearch-5db8a73adb.css"> <link rel="stylesheet" href="../../_/css/site-fcc1ff1ab1.css"> <meta name="ap [...]
\ No newline at end of file
+<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>Camel CLI Command Reference :: Apache Camel</title> <link rel="canonical" href="https://camel.apache.org/manual/jbang-commands/camel-jbang-commands.html"> <meta name="generator" content="Antora 3.2.0"> <link rel="stylesheet" href="../../_/css/vendor/docsearch-5db8a73adb.css"> <link rel="stylesheet" href="../../_/css/site-fcc1ff1ab1.css"> <meta name="ap [...]
\ No newline at end of file
diff --git a/manual/jbang-commands/camel-jbang-commands.md b/manual/jbang-commands/camel-jbang-commands.md
index 34d1ec45a9..9d3b828a67 100644
--- a/manual/jbang-commands/camel-jbang-commands.md
+++ b/manual/jbang-commands/camel-jbang-commands.md
@@ -61,7 +61,6 @@ These commands are provided by plugins. A plugin is installed with `camel plugin
| [camel generate](camel-jbang-generate.md) | `generate` | Generate source code |
| [camel kubernetes](camel-jbang-kubernetes.md) | `kubernetes` | Manage Camel applications running on Kubernetes |
| [camel mcp](camel-jbang-mcp.md) | `mcp` | MCP server for AI coding assistants |
-| [camel route-parser](camel-jbang-route-parser.md) | `route-parser` | Parses Java route and dumps route structure |
| [camel test](camel-jbang-test.md) | `test` | Manage tests for Camel applications |
| [camel tui](camel-jbang-tui.md) | `tui` | Camel TUI |
| [camel validate](camel-jbang-validate.md) | `validate` | Validate Camel source code |
\ No newline at end of file
diff --git a/manual/jbang-commands/camel-jbang-route-parser.html b/manual/jbang-commands/camel-jbang-route-parser.html
deleted file mode 100644
index feac04310b..0000000000
--- a/manual/jbang-commands/camel-jbang-route-parser.html
+++ /dev/null
@@ -1 +0,0 @@
-<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1"> <title>camel route-parser :: Apache Camel</title> <link rel="canonical" href="https://camel.apache.org/manual/jbang-commands/camel-jbang-route-parser.html"> <meta name="generator" content="Antora 3.2.0"> <link rel="stylesheet" href="../../_/css/vendor/docsearch-5db8a73adb.css"> <link rel="stylesheet" href="../../_/css/site-fcc1ff1ab1.css"> <meta name="applica [...]
\ No newline at end of file
diff --git a/manual/jbang-commands/camel-jbang-route-parser.md b/manual/jbang-commands/camel-jbang-route-parser.md
deleted file mode 100644
index cc9b8df5d9..0000000000
--- a/manual/jbang-commands/camel-jbang-route-parser.md
+++ /dev/null
@@ -1,21 +0,0 @@
-# camel route-parser
-
-Parses Java route and dumps route structure
-
-> **Note**
-> This command is provided by the `route-parser` plugin. Install it with `camel plugin add route-parser`.
-
-## Usage
-
-```bash
-camel route-parser [options]
-```
-
-## Options
-
-
-| Option | Description | Default | Type |
-| --- | --- | --- | --- |
-| `--raw` | To output raw without metadata | | boolean |
-| `--watch` | Execute periodically and showing output fullscreen | | boolean |
-| `-h,--help` | Display the help and sub-commands | | boolean |
\ No newline at end of file
diff --git a/site-manifest.json b/site-manifest.json
index 5e347222f8..f377bfa0ca 100644
--- a/site-manifest.json
+++ b/site-manifest.json
@@ -1,6 +1,6 @@
{
"version": "3-dj.1",
- "generated": 1791815810463,
+ "generated": 1791878474831,
"url": "https://camel.apache.org",
"components": [
{
@@ -36588,12 +36588,6 @@
"url": "/manual/jbang-commands/camel-jbang-restart.html",
"title": "camel restart"
},
- {
- "module": "ROOT",
- "path": "jbang-commands/camel-jbang-route-parser.adoc",
- "url": "/manual/jbang-commands/camel-jbang-route-parser.html",
- "title": "camel route-parser"
- },
{
"module": "ROOT",
"path": "jbang-commands/camel-jbang-run.adoc",
diff --git a/sitemap-camel-core.md b/sitemap-camel-core.md
index ebe6fc4726..786f3150c6 100644
--- a/sitemap-camel-core.md
+++ b/sitemap-camel-core.md
@@ -1,9 +1,9 @@
urls[8]{loc,lastmod}:
- https://camel.apache.org/camel-core/advanced-camel-core-guides/index.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-core/contributing/building.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-core/contributing/expectations.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-core/contributing/index.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-core/contributing/testing-camel.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-core/getting-started/index.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-core/reference/index.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-core/working-with-camel-core/index.md,2026-10-12T14:37:16.420Z
+ https://camel.apache.org/camel-core/advanced-camel-core-guides/index.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-core/contributing/building.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-core/contributing/expectations.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-core/contributing/index.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-core/contributing/testing-camel.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-core/getting-started/index.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-core/reference/index.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-core/working-with-camel-core/index.md,2026-10-13T08:01:41.088Z
diff --git a/sitemap-camel-core.xml b/sitemap-camel-core.xml
index f063af3be0..c1c8810b85 100644
--- a/sitemap-camel-core.xml
+++ b/sitemap-camel-core.xml
@@ -2,34 +2,34 @@
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://camel.apache.org/camel-core/advanced-camel-core-guides/index.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-core/contributing/building.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-core/contributing/expectations.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-core/contributing/index.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-core/contributing/testing-camel.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-core/getting-started/index.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-core/reference/index.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-core/working-with-camel-core/index.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
</urlset>
diff --git a/sitemap-camel-k.md b/sitemap-camel-k.md
index 6ffad96c78..bc254c14e6 100644
--- a/sitemap-camel-k.md
+++ b/sitemap-camel-k.md
@@ -1,370 +1,370 @@
urls[369]{loc,lastmod}:
- https://camel.apache.org/camel-k/next/apis/camel-k.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/architecture/architecture.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/architecture/cr/build.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/architecture/cr/camel-catalog.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/architecture/cr/integration-kit.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/architecture/cr/integration-platform.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/architecture/cr/integration.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/architecture/incremental-image.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/architecture/operator.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/architecture/runtime.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/architecture/traits.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/concepts/dependencies.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/concepts/overview.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/concepts/releases.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/configuration/base-image.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/configuration/build-time-properties.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/configuration/camel-properties.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/configuration/configuration.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/configuration/dependencies.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/configuration/integrationprofiles.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/configuration/quarkus-native.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/configuration/runtime-config.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/configuration/runtime-resources.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/configuration/runtime-version.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/contributing/developers.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/contributing/e2e.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/contributing/local-development.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/contributing/local-execution.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/contributing/remote-debugging.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/index.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/installation/advanced/advanced.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/installation/advanced/http-proxy.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/installation/advanced/jdk-version.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/installation/advanced/maven-proxy.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/installation/advanced/multi.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/installation/advanced/network.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/installation/advanced/offline.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/installation/advanced/platform-architecture.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/installation/advanced/pruning-registry.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/installation/advanced/resources.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/installation/builds.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/installation/cert-manager.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/installation/installation.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/installation/keda.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/installation/knative.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/installation/platform/gke.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/installation/platform/iks.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/installation/registry.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/installation/registry/registry-secret.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/installation/registry/special/docker-desktop.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/installation/registry/special/gcr.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/installation/registry/special/github.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/installation/registry/special/icr.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/installation/registry/special/kind.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/installation/registry/special/minikube.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/installation/registry/special/openshift.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/installation/registry/special/own.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/installation/uninstalling.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/installation/upgrade.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/kamelets/architecture.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/kamelets/configuration.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/kamelets/distribution.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/kamelets/kamelets.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/languages/java.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/languages/languages.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/languages/xml.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/languages/yaml.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/observability/dashboard.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/observability/monitoring.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/observability/monitoring/operator-sops.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/observability/monitoring/operator.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/observability/operator-logging.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/pipeline/external.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/pipeline/pipeline.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/pipes/bind-cli.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/pipes/error-handler.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/pipes/pipes.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/pipes/promoting.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/running/build-from-git.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/running/dry-build.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/running/gitops.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/running/promoting.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/running/running-cli.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/running/running.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/running/self-managed.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/scaling/integration.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/scaling/pipe.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/traits/affinity.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/traits/builder.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/traits/camel.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/traits/container.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/traits/cron.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/traits/deployer.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/traits/deployment.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/traits/environment.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/traits/gateway.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/traits/gitops.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/traits/health.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/traits/ingress.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/traits/init-containers.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/traits/istio.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/traits/jvm.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/traits/kamelets.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/traits/keda.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/traits/knative-service.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/traits/knative.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/traits/mount.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/traits/owner.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/traits/pdb.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/traits/prometheus.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/traits/pull-secret.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/traits/quarkus.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/traits/route.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/traits/security-context.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/traits/service.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/traits/toleration.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/traits/traits.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/troubleshooting/debugging.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/next/troubleshooting/troubleshooting.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/apis/camel-k.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/architecture/architecture.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/architecture/cr/build.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/architecture/cr/camel-catalog.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/architecture/cr/integration-kit.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/architecture/cr/integration-platform.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/architecture/cr/integration.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/architecture/incremental-image.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/architecture/operator.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/architecture/runtime.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/architecture/traits.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/concepts/dependencies.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/concepts/overview.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/concepts/releases.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/configuration/base-image.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/configuration/build-time-properties.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/configuration/camel-properties.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/configuration/configuration.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/configuration/dependencies.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/configuration/integrationprofiles.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/configuration/quarkus-native.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/configuration/runtime-config.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/configuration/runtime-resources.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/configuration/runtime-version.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/contributing/developers.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/contributing/e2e.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/contributing/local-development.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/contributing/local-execution.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/contributing/remote-debugging.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/index.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/installation/advanced/advanced.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/installation/advanced/http-proxy.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/installation/advanced/jdk-version.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/installation/advanced/maven-proxy.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/installation/advanced/multi.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/installation/advanced/network.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/installation/advanced/offline.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/installation/advanced/platform-architecture.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/installation/advanced/pruning-registry.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/installation/advanced/resources.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/installation/builds.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/installation/installation.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/installation/keda.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/installation/knative.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/installation/platform/gke.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/installation/platform/iks.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/installation/registry.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/installation/registry/registry-secret.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/installation/registry/special/docker-desktop.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/installation/registry/special/gcr.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/installation/registry/special/github.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/installation/registry/special/icr.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/installation/registry/special/kind.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/installation/registry/special/minikube.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/installation/registry/special/openshift.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/installation/registry/special/own.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/installation/uninstalling.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/installation/upgrade.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/kamelets/architecture.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/kamelets/configuration.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/kamelets/distribution.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/kamelets/kamelets.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/languages/java.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/languages/languages.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/languages/xml.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/languages/yaml.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/observability/dashboard.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/observability/monitoring.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/observability/monitoring/operator-sops.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/observability/monitoring/operator.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/observability/operator-logging.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/pipeline/external.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/pipeline/pipeline.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/pipes/bind-cli.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/pipes/error-handler.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/pipes/pipes.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/pipes/promoting.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/running/build-from-git.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/running/dry-build.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/running/gitops.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/running/promoting.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/running/running-cli.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/running/running.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/running/self-managed.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/running/synthetic.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/scaling/integration.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/scaling/pipe.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/traits/affinity.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/traits/builder.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/traits/camel.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/traits/container.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/traits/cron.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/traits/deployer.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/traits/deployment.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/traits/environment.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/traits/gateway.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/traits/gitops.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/traits/health.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/traits/ingress.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/traits/init-containers.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/traits/istio.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/traits/jvm.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/traits/kamelets.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/traits/keda.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/traits/knative-service.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/traits/knative.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/traits/logging.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/traits/master.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/traits/mount.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/traits/owner.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/traits/pdb.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/traits/prometheus.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/traits/pull-secret.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/traits/quarkus.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/traits/route.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/traits/security-context.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/traits/service.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/traits/telemetry.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/traits/toleration.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/traits/traits.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/troubleshooting/debugging.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.11.x/troubleshooting/troubleshooting.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/apis/camel-k.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/architecture/architecture.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/architecture/cr/build.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/architecture/cr/camel-catalog.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/architecture/cr/integration-kit.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/architecture/cr/integration-platform.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/architecture/cr/integration.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/architecture/incremental-image.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/architecture/operator.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/architecture/runtime.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/architecture/traits.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/concepts/dependencies.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/concepts/overview.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/concepts/releases.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/configuration/base-image.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/configuration/build-time-properties.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/configuration/camel-properties.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/configuration/configuration.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/configuration/dependencies.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/configuration/integrationprofiles.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/configuration/quarkus-native.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/configuration/runtime-config.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/configuration/runtime-resources.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/configuration/runtime-version.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/contributing/developers.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/contributing/e2e.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/contributing/local-development.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/contributing/local-execution.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/contributing/remote-debugging.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/index.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/installation/advanced/advanced.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/installation/advanced/build-config.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/installation/advanced/http-proxy.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/installation/advanced/jdk-version.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/installation/advanced/maven-proxy.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/installation/advanced/maven.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/installation/advanced/multi.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/installation/advanced/network.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/installation/advanced/offline.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/installation/advanced/platform-architecture.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/installation/advanced/pruning-registry.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/installation/advanced/resources.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/installation/installation.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/installation/integrationplatform.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/installation/keda.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/installation/knative.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/installation/platform/gke.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/installation/platform/iks.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/installation/registry/registry-secret.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/installation/registry/registry.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/installation/registry/special/docker-desktop.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/installation/registry/special/gcr.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/installation/registry/special/github.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/installation/registry/special/icr.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/installation/registry/special/kind.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/installation/registry/special/minikube.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/installation/registry/special/openshift.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/installation/registry/special/own.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/installation/uninstalling.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/installation/upgrade.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/kamelets/architecture.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/kamelets/configuration.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/kamelets/distribution.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/kamelets/kamelets.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/languages/java.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/languages/languages.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/languages/xml.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/languages/yaml.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/observability/dashboard.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/observability/monitoring.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/observability/monitoring/integration.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/observability/monitoring/operator-sops.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/observability/monitoring/operator.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/observability/operator-logging.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/pipeline/external.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/pipeline/pipeline.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/pipes/bind-cli.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/pipes/error-handler.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/pipes/pipes.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/pipes/promoting.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/running/build-from-git.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/running/dry-build.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/running/gitops.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/running/promoting.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/running/running-cli.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/running/running.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/running/self-managed.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/running/synthetic.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/scaling/integration.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/scaling/pipe.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/traits/affinity.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/traits/builder.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/traits/camel.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/traits/container.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/traits/cron.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/traits/deployer.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/traits/deployment.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/traits/environment.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/traits/gateway.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/traits/gitops.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/traits/health.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/traits/ingress.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/traits/init-containers.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/traits/istio.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/traits/jolokia.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/traits/jvm.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/traits/kamelets.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/traits/keda.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/traits/knative-service.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/traits/knative.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/traits/logging.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/traits/master.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/traits/mount.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/traits/openapi.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/traits/owner.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/traits/pdb.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/traits/pod.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/traits/prometheus.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/traits/pull-secret.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/traits/quarkus.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/traits/route.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/traits/security-context.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/traits/service.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/traits/telemetry.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/traits/toleration.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/traits/traits.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/troubleshooting/debugging.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-k/2.10.x/troubleshooting/troubleshooting.md,2026-10-12T14:37:16.420Z
+ https://camel.apache.org/camel-k/next/apis/camel-k.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/architecture/architecture.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/architecture/cr/build.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/architecture/cr/camel-catalog.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/architecture/cr/integration-kit.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/architecture/cr/integration-platform.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/architecture/cr/integration.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/architecture/incremental-image.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/architecture/operator.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/architecture/runtime.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/architecture/traits.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/concepts/dependencies.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/concepts/overview.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/concepts/releases.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/configuration/base-image.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/configuration/build-time-properties.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/configuration/camel-properties.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/configuration/configuration.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/configuration/dependencies.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/configuration/integrationprofiles.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/configuration/quarkus-native.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/configuration/runtime-config.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/configuration/runtime-resources.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/configuration/runtime-version.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/contributing/developers.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/contributing/e2e.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/contributing/local-development.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/contributing/local-execution.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/contributing/remote-debugging.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/index.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/installation/advanced/advanced.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/installation/advanced/http-proxy.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/installation/advanced/jdk-version.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/installation/advanced/maven-proxy.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/installation/advanced/multi.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/installation/advanced/network.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/installation/advanced/offline.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/installation/advanced/platform-architecture.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/installation/advanced/pruning-registry.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/installation/advanced/resources.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/installation/builds.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/installation/cert-manager.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/installation/installation.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/installation/keda.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/installation/knative.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/installation/platform/gke.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/installation/platform/iks.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/installation/registry.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/installation/registry/registry-secret.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/installation/registry/special/docker-desktop.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/installation/registry/special/gcr.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/installation/registry/special/github.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/installation/registry/special/icr.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/installation/registry/special/kind.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/installation/registry/special/minikube.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/installation/registry/special/openshift.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/installation/registry/special/own.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/installation/uninstalling.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/installation/upgrade.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/kamelets/architecture.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/kamelets/configuration.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/kamelets/distribution.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/kamelets/kamelets.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/languages/java.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/languages/languages.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/languages/xml.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/languages/yaml.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/observability/dashboard.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/observability/monitoring.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/observability/monitoring/operator-sops.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/observability/monitoring/operator.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/observability/operator-logging.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/pipeline/external.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/pipeline/pipeline.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/pipes/bind-cli.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/pipes/error-handler.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/pipes/pipes.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/pipes/promoting.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/running/build-from-git.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/running/dry-build.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/running/gitops.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/running/promoting.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/running/running-cli.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/running/running.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/running/self-managed.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/scaling/integration.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/scaling/pipe.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/traits/affinity.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/traits/builder.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/traits/camel.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/traits/container.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/traits/cron.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/traits/deployer.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/traits/deployment.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/traits/environment.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/traits/gateway.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/traits/gitops.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/traits/health.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/traits/ingress.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/traits/init-containers.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/traits/istio.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/traits/jvm.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/traits/kamelets.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/traits/keda.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/traits/knative-service.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/traits/knative.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/traits/mount.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/traits/owner.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/traits/pdb.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/traits/prometheus.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/traits/pull-secret.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/traits/quarkus.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/traits/route.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/traits/security-context.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/traits/service.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/traits/toleration.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/traits/traits.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/troubleshooting/debugging.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/next/troubleshooting/troubleshooting.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/apis/camel-k.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/architecture/architecture.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/architecture/cr/build.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/architecture/cr/camel-catalog.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/architecture/cr/integration-kit.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/architecture/cr/integration-platform.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/architecture/cr/integration.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/architecture/incremental-image.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/architecture/operator.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/architecture/runtime.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/architecture/traits.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/concepts/dependencies.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/concepts/overview.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/concepts/releases.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/configuration/base-image.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/configuration/build-time-properties.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/configuration/camel-properties.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/configuration/configuration.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/configuration/dependencies.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/configuration/integrationprofiles.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/configuration/quarkus-native.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/configuration/runtime-config.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/configuration/runtime-resources.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/configuration/runtime-version.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/contributing/developers.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/contributing/e2e.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/contributing/local-development.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/contributing/local-execution.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/contributing/remote-debugging.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/index.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/installation/advanced/advanced.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/installation/advanced/http-proxy.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/installation/advanced/jdk-version.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/installation/advanced/maven-proxy.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/installation/advanced/multi.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/installation/advanced/network.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/installation/advanced/offline.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/installation/advanced/platform-architecture.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/installation/advanced/pruning-registry.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/installation/advanced/resources.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/installation/builds.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/installation/installation.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/installation/keda.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/installation/knative.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/installation/platform/gke.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/installation/platform/iks.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/installation/registry.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/installation/registry/registry-secret.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/installation/registry/special/docker-desktop.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/installation/registry/special/gcr.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/installation/registry/special/github.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/installation/registry/special/icr.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/installation/registry/special/kind.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/installation/registry/special/minikube.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/installation/registry/special/openshift.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/installation/registry/special/own.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/installation/uninstalling.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/installation/upgrade.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/kamelets/architecture.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/kamelets/configuration.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/kamelets/distribution.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/kamelets/kamelets.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/languages/java.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/languages/languages.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/languages/xml.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/languages/yaml.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/observability/dashboard.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/observability/monitoring.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/observability/monitoring/operator-sops.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/observability/monitoring/operator.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/observability/operator-logging.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/pipeline/external.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/pipeline/pipeline.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/pipes/bind-cli.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/pipes/error-handler.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/pipes/pipes.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/pipes/promoting.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/running/build-from-git.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/running/dry-build.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/running/gitops.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/running/promoting.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/running/running-cli.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/running/running.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/running/self-managed.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/running/synthetic.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/scaling/integration.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/scaling/pipe.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/traits/affinity.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/traits/builder.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/traits/camel.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/traits/container.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/traits/cron.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/traits/deployer.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/traits/deployment.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/traits/environment.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/traits/gateway.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/traits/gitops.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/traits/health.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/traits/ingress.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/traits/init-containers.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/traits/istio.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/traits/jvm.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/traits/kamelets.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/traits/keda.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/traits/knative-service.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/traits/knative.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/traits/logging.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/traits/master.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/traits/mount.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/traits/owner.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/traits/pdb.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/traits/prometheus.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/traits/pull-secret.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/traits/quarkus.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/traits/route.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/traits/security-context.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/traits/service.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/traits/telemetry.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/traits/toleration.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/traits/traits.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/troubleshooting/debugging.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.11.x/troubleshooting/troubleshooting.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/apis/camel-k.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/architecture/architecture.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/architecture/cr/build.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/architecture/cr/camel-catalog.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/architecture/cr/integration-kit.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/architecture/cr/integration-platform.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/architecture/cr/integration.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/architecture/incremental-image.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/architecture/operator.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/architecture/runtime.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/architecture/traits.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/concepts/dependencies.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/concepts/overview.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/concepts/releases.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/configuration/base-image.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/configuration/build-time-properties.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/configuration/camel-properties.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/configuration/configuration.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/configuration/dependencies.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/configuration/integrationprofiles.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/configuration/quarkus-native.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/configuration/runtime-config.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/configuration/runtime-resources.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/configuration/runtime-version.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/contributing/developers.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/contributing/e2e.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/contributing/local-development.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/contributing/local-execution.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/contributing/remote-debugging.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/index.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/installation/advanced/advanced.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/installation/advanced/build-config.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/installation/advanced/http-proxy.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/installation/advanced/jdk-version.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/installation/advanced/maven-proxy.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/installation/advanced/maven.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/installation/advanced/multi.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/installation/advanced/network.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/installation/advanced/offline.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/installation/advanced/platform-architecture.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/installation/advanced/pruning-registry.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/installation/advanced/resources.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/installation/installation.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/installation/integrationplatform.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/installation/keda.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/installation/knative.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/installation/platform/gke.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/installation/platform/iks.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/installation/registry/registry-secret.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/installation/registry/registry.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/installation/registry/special/docker-desktop.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/installation/registry/special/gcr.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/installation/registry/special/github.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/installation/registry/special/icr.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/installation/registry/special/kind.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/installation/registry/special/minikube.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/installation/registry/special/openshift.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/installation/registry/special/own.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/installation/uninstalling.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/installation/upgrade.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/kamelets/architecture.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/kamelets/configuration.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/kamelets/distribution.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/kamelets/kamelets.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/languages/java.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/languages/languages.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/languages/xml.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/languages/yaml.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/observability/dashboard.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/observability/monitoring.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/observability/monitoring/integration.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/observability/monitoring/operator-sops.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/observability/monitoring/operator.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/observability/operator-logging.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/pipeline/external.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/pipeline/pipeline.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/pipes/bind-cli.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/pipes/error-handler.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/pipes/pipes.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/pipes/promoting.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/running/build-from-git.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/running/dry-build.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/running/gitops.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/running/promoting.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/running/running-cli.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/running/running.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/running/self-managed.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/running/synthetic.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/scaling/integration.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/scaling/pipe.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/traits/affinity.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/traits/builder.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/traits/camel.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/traits/container.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/traits/cron.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/traits/deployer.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/traits/deployment.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/traits/environment.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/traits/gateway.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/traits/gitops.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/traits/health.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/traits/ingress.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/traits/init-containers.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/traits/istio.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/traits/jolokia.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/traits/jvm.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/traits/kamelets.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/traits/keda.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/traits/knative-service.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/traits/knative.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/traits/logging.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/traits/master.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/traits/mount.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/traits/openapi.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/traits/owner.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/traits/pdb.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/traits/pod.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/traits/prometheus.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/traits/pull-secret.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/traits/quarkus.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/traits/route.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/traits/security-context.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/traits/service.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/traits/telemetry.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/traits/toleration.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/traits/traits.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/troubleshooting/debugging.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-k/2.10.x/troubleshooting/troubleshooting.md,2026-10-13T08:01:41.088Z
diff --git a/sitemap-camel-k.xml b/sitemap-camel-k.xml
index cc7a213cf1..ecfbff8e90 100644
--- a/sitemap-camel-k.xml
+++ b/sitemap-camel-k.xml
@@ -2,1478 +2,1478 @@
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://camel.apache.org/camel-k/next/apis/camel-k.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/architecture/architecture.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/architecture/cr/build.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/architecture/cr/camel-catalog.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/architecture/cr/integration-kit.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/architecture/cr/integration-platform.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/architecture/cr/integration.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/architecture/incremental-image.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/architecture/operator.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/architecture/runtime.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/architecture/traits.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/concepts/dependencies.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/concepts/overview.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/concepts/releases.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/configuration/base-image.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/configuration/build-time-properties.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/configuration/camel-properties.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/configuration/configuration.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/configuration/dependencies.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/configuration/integrationprofiles.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/configuration/quarkus-native.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/configuration/runtime-config.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/configuration/runtime-resources.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/configuration/runtime-version.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/contributing/developers.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/contributing/e2e.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/contributing/local-development.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/contributing/local-execution.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/contributing/remote-debugging.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/index.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/installation/advanced/advanced.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/installation/advanced/http-proxy.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/installation/advanced/jdk-version.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/installation/advanced/maven-proxy.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/installation/advanced/multi.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/installation/advanced/network.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/installation/advanced/offline.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/installation/advanced/platform-architecture.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/installation/advanced/pruning-registry.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/installation/advanced/resources.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/installation/builds.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/installation/cert-manager.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/installation/installation.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/installation/keda.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/installation/knative.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/installation/platform/gke.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/installation/platform/iks.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/installation/registry.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/installation/registry/registry-secret.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/installation/registry/special/docker-desktop.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/installation/registry/special/gcr.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/installation/registry/special/github.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/installation/registry/special/icr.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/installation/registry/special/kind.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/installation/registry/special/minikube.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/installation/registry/special/openshift.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/installation/registry/special/own.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/installation/uninstalling.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/installation/upgrade.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/kamelets/architecture.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/kamelets/configuration.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/kamelets/distribution.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/kamelets/kamelets.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/languages/java.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/languages/languages.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/languages/xml.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/languages/yaml.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/observability/dashboard.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/observability/monitoring.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/observability/monitoring/operator-sops.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/observability/monitoring/operator.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/observability/operator-logging.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/pipeline/external.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/pipeline/pipeline.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/pipes/bind-cli.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/pipes/error-handler.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/pipes/pipes.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/pipes/promoting.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/running/build-from-git.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/running/dry-build.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/running/gitops.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/running/promoting.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/running/running-cli.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/running/running.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/running/self-managed.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/scaling/integration.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/scaling/pipe.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/traits/affinity.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/traits/builder.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/traits/camel.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/traits/container.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/traits/cron.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/traits/deployer.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/traits/deployment.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/traits/environment.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/traits/gateway.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/traits/gitops.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/traits/health.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/traits/ingress.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/traits/init-containers.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/traits/istio.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/traits/jvm.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/traits/kamelets.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/traits/keda.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/traits/knative-service.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/traits/knative.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/traits/mount.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/traits/owner.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/traits/pdb.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/traits/prometheus.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/traits/pull-secret.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/traits/quarkus.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/traits/route.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/traits/security-context.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/traits/service.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/traits/toleration.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/traits/traits.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/troubleshooting/debugging.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/next/troubleshooting/troubleshooting.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/apis/camel-k.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/architecture/architecture.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/architecture/cr/build.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/architecture/cr/camel-catalog.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/architecture/cr/integration-kit.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/architecture/cr/integration-platform.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/architecture/cr/integration.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/architecture/incremental-image.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/architecture/operator.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/architecture/runtime.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/architecture/traits.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/concepts/dependencies.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/concepts/overview.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/concepts/releases.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/configuration/base-image.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/configuration/build-time-properties.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/configuration/camel-properties.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/configuration/configuration.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/configuration/dependencies.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/configuration/integrationprofiles.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/configuration/quarkus-native.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/configuration/runtime-config.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/configuration/runtime-resources.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/configuration/runtime-version.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/contributing/developers.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/contributing/e2e.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/contributing/local-development.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/contributing/local-execution.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/contributing/remote-debugging.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/index.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/installation/advanced/advanced.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/installation/advanced/http-proxy.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/installation/advanced/jdk-version.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/installation/advanced/maven-proxy.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/installation/advanced/multi.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/installation/advanced/network.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/installation/advanced/offline.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/installation/advanced/platform-architecture.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/installation/advanced/pruning-registry.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/installation/advanced/resources.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/installation/builds.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/installation/installation.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/installation/keda.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/installation/knative.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/installation/platform/gke.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/installation/platform/iks.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/installation/registry.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/installation/registry/registry-secret.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/installation/registry/special/docker-desktop.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/installation/registry/special/gcr.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/installation/registry/special/github.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/installation/registry/special/icr.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/installation/registry/special/kind.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/installation/registry/special/minikube.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/installation/registry/special/openshift.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/installation/registry/special/own.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/installation/uninstalling.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/installation/upgrade.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/kamelets/architecture.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/kamelets/configuration.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/kamelets/distribution.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/kamelets/kamelets.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/languages/java.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/languages/languages.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/languages/xml.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/languages/yaml.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/observability/dashboard.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/observability/monitoring.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/observability/monitoring/operator-sops.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/observability/monitoring/operator.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/observability/operator-logging.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/pipeline/external.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/pipeline/pipeline.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/pipes/bind-cli.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/pipes/error-handler.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/pipes/pipes.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/pipes/promoting.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/running/build-from-git.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/running/dry-build.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/running/gitops.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/running/promoting.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/running/running-cli.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/running/running.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/running/self-managed.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/running/synthetic.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/scaling/integration.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/scaling/pipe.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/traits/affinity.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/traits/builder.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/traits/camel.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/traits/container.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/traits/cron.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/traits/deployer.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/traits/deployment.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/traits/environment.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/traits/gateway.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/traits/gitops.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/traits/health.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/traits/ingress.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/traits/init-containers.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/traits/istio.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/traits/jvm.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/traits/kamelets.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/traits/keda.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/traits/knative-service.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/traits/knative.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/traits/logging.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/traits/master.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/traits/mount.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/traits/owner.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/traits/pdb.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/traits/prometheus.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/traits/pull-secret.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/traits/quarkus.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/traits/route.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/traits/security-context.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/traits/service.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/traits/telemetry.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/traits/toleration.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/traits/traits.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/troubleshooting/debugging.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.11.x/troubleshooting/troubleshooting.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/apis/camel-k.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/architecture/architecture.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/architecture/cr/build.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/architecture/cr/camel-catalog.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/architecture/cr/integration-kit.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/architecture/cr/integration-platform.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/architecture/cr/integration.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/architecture/incremental-image.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/architecture/operator.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/architecture/runtime.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/architecture/traits.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/concepts/dependencies.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/concepts/overview.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/concepts/releases.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/configuration/base-image.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/configuration/build-time-properties.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/configuration/camel-properties.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/configuration/configuration.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/configuration/dependencies.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/configuration/integrationprofiles.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/configuration/quarkus-native.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/configuration/runtime-config.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/configuration/runtime-resources.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/configuration/runtime-version.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/contributing/developers.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/contributing/e2e.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/contributing/local-development.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/contributing/local-execution.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/contributing/remote-debugging.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/index.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/installation/advanced/advanced.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/installation/advanced/build-config.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/installation/advanced/http-proxy.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/installation/advanced/jdk-version.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/installation/advanced/maven-proxy.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/installation/advanced/maven.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/installation/advanced/multi.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/installation/advanced/network.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/installation/advanced/offline.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/installation/advanced/platform-architecture.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/installation/advanced/pruning-registry.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/installation/advanced/resources.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/installation/installation.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/installation/integrationplatform.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/installation/keda.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/installation/knative.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/installation/platform/gke.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/installation/platform/iks.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/installation/registry/registry-secret.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/installation/registry/registry.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/installation/registry/special/docker-desktop.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/installation/registry/special/gcr.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/installation/registry/special/github.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/installation/registry/special/icr.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/installation/registry/special/kind.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/installation/registry/special/minikube.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/installation/registry/special/openshift.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/installation/registry/special/own.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/installation/uninstalling.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/installation/upgrade.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/kamelets/architecture.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/kamelets/configuration.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/kamelets/distribution.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/kamelets/kamelets.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/languages/java.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/languages/languages.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/languages/xml.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/languages/yaml.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/observability/dashboard.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/observability/monitoring.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/observability/monitoring/integration.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/observability/monitoring/operator-sops.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/observability/monitoring/operator.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/observability/operator-logging.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/pipeline/external.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/pipeline/pipeline.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/pipes/bind-cli.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/pipes/error-handler.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/pipes/pipes.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/pipes/promoting.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/running/build-from-git.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/running/dry-build.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/running/gitops.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/running/promoting.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/running/running-cli.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/running/running.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/running/self-managed.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/running/synthetic.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/scaling/integration.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/scaling/pipe.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/traits/affinity.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/traits/builder.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/traits/camel.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/traits/container.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/traits/cron.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/traits/deployer.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/traits/deployment.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/traits/environment.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/traits/gateway.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/traits/gitops.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/traits/health.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/traits/ingress.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/traits/init-containers.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/traits/istio.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/traits/jolokia.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/traits/jvm.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/traits/kamelets.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/traits/keda.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/traits/knative-service.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/traits/knative.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/traits/logging.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/traits/master.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/traits/mount.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/traits/openapi.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/traits/owner.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/traits/pdb.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/traits/pod.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/traits/prometheus.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/traits/pull-secret.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/traits/quarkus.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/traits/route.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/traits/security-context.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/traits/service.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/traits/telemetry.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/traits/toleration.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/traits/traits.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/troubleshooting/debugging.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-k/2.10.x/troubleshooting/troubleshooting.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
</urlset>
diff --git a/sitemap-camel-kafka-connector.md b/sitemap-camel-kafka-connector.md
index 02aa15b56e..47429e0232 100644
--- a/sitemap-camel-kafka-connector.md
+++ b/sitemap-camel-kafka-connector.md
@@ -1,220 +1,220 @@
urls[219]{loc,lastmod}:
- https://camel.apache.org/camel-kafka-connector/next/contributor-guide/index.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/contributor-guide/release-guide.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/contributor-guide/testing.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/contributor-guide/troubleshooting.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/index.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-bedrock-agent-runtime-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-bedrock-text-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-cloudtrail-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-cloudwatch-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-comprehend-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-ddb-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-ddb-streams-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-ec2-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-eventbridge-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-kinesis-firehose-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-kinesis-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-kinesis-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-lambda-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-polly-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-redshift-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-redshift-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-s3-event-based-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-s3-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-s3-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-s3-streaming-upload-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-secrets-manager-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-ses-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-sns-fifo-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-sns-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-sqs-batch-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-sqs-fifo-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-sqs-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-sqs-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-timestream-query-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws2-iam-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws2-kms-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-cosmosdb-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-cosmosdb-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-eventhubs-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-eventhubs-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-functions-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-servicebus-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-servicebus-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-storage-blob-append-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-storage-blob-changefeed-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-storage-blob-event-based-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-storage-blob-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-storage-blob-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-storage-datalake-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-storage-datalake-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-storage-files-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-storage-files-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-storage-queue-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-storage-queue-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-bitcoin-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-cassandra-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-cassandra-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-ceph-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-ceph-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-chuck-norris-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-couchbase-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-counter-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-cron-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-cxf-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-cxf-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-cxfrs-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-cxfrs-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-databricks-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-databricks-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-dropbox-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-dropbox-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-earthquake-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-elasticsearch-index-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-elasticsearch-search-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-exec-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-fhir-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-fhir-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-file-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-file-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-file-watch-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-ftp-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-ftp-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-ftps-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-ftps-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-google-bigquery-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-google-calendar-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-google-functions-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-google-mail-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-google-pubsub-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-google-pubsub-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-google-sheets-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-google-sheets-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-google-storage-event-based-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-google-storage-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-google-storage-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-google-vertexai-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-graphql-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-http-secured-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-http-secured-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-http-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-http-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-https-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-ibm-cos-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-ibm-cos-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-ibm-watson-language-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-infinispan-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-infinispan-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-jdbc-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-jms-amqp-10-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-jms-amqp-10-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-jms-apache-artemis-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-jms-apache-artemis-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-jms-ibm-mq-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-jms-ibm-mq-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-jms-pooled-apache-artemis-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-jms-pooled-apache-artemis-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-kafka-apicurio-registry-not-secured-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-kafka-apicurio-registry-not-secured-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-kafka-azure-schema-registry-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-kafka-azure-schema-registry-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-kafka-batch-apicurio-registry-not-secured-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-kafka-batch-apicurio-registry-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-kafka-batch-azure-schema-registry-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-kafka-batch-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-kafka-not-secured-apicurio-registry-json-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-kafka-not-secured-apicurio-registry-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-kafka-not-secured-apicurio-registry-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-kafka-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-kafka-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-kubernetes-namespaces-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-kubernetes-nodes-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-kubernetes-pods-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-log-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-mail-imap-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-mail-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-mariadb-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-mariadb-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-minio-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-minio-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-mongodb-changes-stream-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-mongodb-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-mongodb-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-mqtt-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-mqtt-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-mqtt5-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-mqtt5-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-mysql-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-mysql-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-nats-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-nats-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-netty-http-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-netty-http-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-netty-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-netty-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-opensearch-index-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-opensearch-search-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-oracle-database-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-oracle-database-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-postgresql-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-postgresql-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-pulsar-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-pulsar-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-redis-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-redis-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-rest-openapi-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-salesforce-composite-upsert-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-salesforce-create-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-salesforce-delete-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-salesforce-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-salesforce-update-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-scp-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-sftp-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-sftp-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-sjms2-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-sjms2-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-slack-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-slack-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-snowflake-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-snowflake-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-solr-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-solr-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-splunk-hec-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-splunk-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-splunk-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-spring-rabbitmq-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-spring-rabbitmq-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-sqlserver-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-sqlserver-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-ssh-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-ssh-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-syslog-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-syslog-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-telegram-sink-kafka-sink-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-telegram-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-timer-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-twitter-directmessage-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-twitter-search-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-twitter-timeline-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-webhook-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-wttrin-source-kafka-source-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/index.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/transformers/fieldsToHeaders.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/reference/transformers/index.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/security-model.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/user-guide/aggregation.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/user-guide/basic-concepts.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/user-guide/basic-configuration.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/user-guide/extending-connector/archetype-apicurio-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/user-guide/extending-connector/archetype-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/user-guide/extending-connector/archetype-dataformat-connector.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/user-guide/extending-connector/index.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/user-guide/getting-started/getting-started-with-packages.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/user-guide/getting-started/try-it-out-locally.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/user-guide/getting-started/try-it-out-on-docker.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/user-guide/getting-started/try-it-out-on-kubernetes.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/user-guide/getting-started/try-it-out-on-openshift-with-strimzi.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/user-guide/idempotency.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/user-guide/index.md,2026-10-12T14:37:16.420Z
- https://camel.apache.org/camel-kafka-connector/next/user-guide/remove-headers.md,2026-10-12T14:37:16.420Z
+ https://camel.apache.org/camel-kafka-connector/next/contributor-guide/index.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/contributor-guide/release-guide.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/contributor-guide/testing.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/contributor-guide/troubleshooting.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/index.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-bedrock-agent-runtime-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-bedrock-text-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-cloudtrail-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-cloudwatch-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-comprehend-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-ddb-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-ddb-streams-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-ec2-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-eventbridge-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-kinesis-firehose-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-kinesis-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-kinesis-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-lambda-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-polly-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-redshift-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-redshift-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-s3-event-based-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-s3-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-s3-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-s3-streaming-upload-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-secrets-manager-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-ses-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-sns-fifo-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-sns-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-sqs-batch-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-sqs-fifo-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-sqs-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-sqs-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-timestream-query-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws2-iam-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws2-kms-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-cosmosdb-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-cosmosdb-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-eventhubs-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-eventhubs-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-functions-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-servicebus-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-servicebus-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-storage-blob-append-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-storage-blob-changefeed-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-storage-blob-event-based-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-storage-blob-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-storage-blob-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-storage-datalake-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-storage-datalake-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-storage-files-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-storage-files-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-storage-queue-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-storage-queue-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-bitcoin-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-cassandra-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-cassandra-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-ceph-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-ceph-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-chuck-norris-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-couchbase-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-counter-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-cron-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-cxf-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-cxf-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-cxfrs-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-cxfrs-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-databricks-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-databricks-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-dropbox-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-dropbox-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-earthquake-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-elasticsearch-index-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-elasticsearch-search-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-exec-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-fhir-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-fhir-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-file-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-file-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-file-watch-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-ftp-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-ftp-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-ftps-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-ftps-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-google-bigquery-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-google-calendar-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-google-functions-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-google-mail-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-google-pubsub-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-google-pubsub-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-google-sheets-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-google-sheets-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-google-storage-event-based-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-google-storage-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-google-storage-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-google-vertexai-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-graphql-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-http-secured-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-http-secured-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-http-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-http-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-https-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-ibm-cos-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-ibm-cos-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-ibm-watson-language-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-infinispan-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-infinispan-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-jdbc-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-jms-amqp-10-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-jms-amqp-10-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-jms-apache-artemis-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-jms-apache-artemis-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-jms-ibm-mq-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-jms-ibm-mq-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-jms-pooled-apache-artemis-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-jms-pooled-apache-artemis-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-kafka-apicurio-registry-not-secured-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-kafka-apicurio-registry-not-secured-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-kafka-azure-schema-registry-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-kafka-azure-schema-registry-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-kafka-batch-apicurio-registry-not-secured-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-kafka-batch-apicurio-registry-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-kafka-batch-azure-schema-registry-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-kafka-batch-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-kafka-not-secured-apicurio-registry-json-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-kafka-not-secured-apicurio-registry-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-kafka-not-secured-apicurio-registry-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-kafka-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-kafka-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-kubernetes-namespaces-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-kubernetes-nodes-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-kubernetes-pods-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-log-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-mail-imap-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-mail-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-mariadb-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-mariadb-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-minio-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-minio-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-mongodb-changes-stream-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-mongodb-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-mongodb-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-mqtt-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-mqtt-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-mqtt5-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-mqtt5-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-mysql-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-mysql-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-nats-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-nats-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-netty-http-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-netty-http-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-netty-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-netty-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-opensearch-index-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-opensearch-search-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-oracle-database-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-oracle-database-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-postgresql-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-postgresql-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-pulsar-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-pulsar-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-redis-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-redis-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-rest-openapi-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-salesforce-composite-upsert-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-salesforce-create-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-salesforce-delete-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-salesforce-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-salesforce-update-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-scp-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-sftp-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-sftp-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-sjms2-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-sjms2-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-slack-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-slack-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-snowflake-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-snowflake-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-solr-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-solr-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-splunk-hec-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-splunk-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-splunk-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-spring-rabbitmq-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-spring-rabbitmq-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-sqlserver-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-sqlserver-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-ssh-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-ssh-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-syslog-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-syslog-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-telegram-sink-kafka-sink-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-telegram-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-timer-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-twitter-directmessage-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-twitter-search-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-twitter-timeline-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-webhook-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-wttrin-source-kafka-source-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/index.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/transformers/fieldsToHeaders.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/reference/transformers/index.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/security-model.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/user-guide/aggregation.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/user-guide/basic-concepts.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/user-guide/basic-configuration.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/user-guide/extending-connector/archetype-apicurio-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/user-guide/extending-connector/archetype-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/user-guide/extending-connector/archetype-dataformat-connector.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/user-guide/extending-connector/index.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/user-guide/getting-started/getting-started-with-packages.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/user-guide/getting-started/try-it-out-locally.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/user-guide/getting-started/try-it-out-on-docker.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/user-guide/getting-started/try-it-out-on-kubernetes.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/user-guide/getting-started/try-it-out-on-openshift-with-strimzi.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/user-guide/idempotency.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/user-guide/index.md,2026-10-13T08:01:41.088Z
+ https://camel.apache.org/camel-kafka-connector/next/user-guide/remove-headers.md,2026-10-13T08:01:41.088Z
diff --git a/sitemap-camel-kafka-connector.xml b/sitemap-camel-kafka-connector.xml
index c604dbf699..dd3736ff8f 100644
--- a/sitemap-camel-kafka-connector.xml
+++ b/sitemap-camel-kafka-connector.xml
@@ -2,878 +2,878 @@
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/contributor-guide/index.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/contributor-guide/release-guide.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/contributor-guide/testing.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/contributor-guide/troubleshooting.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/index.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-bedrock-agent-runtime-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-bedrock-text-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-cloudtrail-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-cloudwatch-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-comprehend-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-ddb-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-ddb-streams-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-ec2-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-eventbridge-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-kinesis-firehose-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-kinesis-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-kinesis-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-lambda-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-polly-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-redshift-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-redshift-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-s3-event-based-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-s3-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-s3-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-s3-streaming-upload-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-secrets-manager-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-ses-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-sns-fifo-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-sns-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-sqs-batch-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-sqs-fifo-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-sqs-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-sqs-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws-timestream-query-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws2-iam-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-aws2-kms-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-cosmosdb-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-cosmosdb-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-eventhubs-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-eventhubs-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-functions-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-servicebus-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-servicebus-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-storage-blob-append-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-storage-blob-changefeed-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-storage-blob-event-based-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-storage-blob-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-storage-blob-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-storage-datalake-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-storage-datalake-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-storage-files-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-storage-files-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-storage-queue-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-azure-storage-queue-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-bitcoin-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-cassandra-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-cassandra-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-ceph-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-ceph-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-chuck-norris-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-couchbase-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-counter-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-cron-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-cxf-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-cxf-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-cxfrs-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-cxfrs-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-databricks-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-databricks-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-dropbox-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-dropbox-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-earthquake-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-elasticsearch-index-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-elasticsearch-search-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-exec-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-fhir-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-fhir-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-file-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-file-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-file-watch-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-ftp-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-ftp-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-ftps-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-ftps-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-google-bigquery-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-google-calendar-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-google-functions-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-google-mail-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-google-pubsub-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-google-pubsub-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-google-sheets-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-google-sheets-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-google-storage-event-based-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-google-storage-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-google-storage-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-google-vertexai-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-graphql-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-http-secured-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-http-secured-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-http-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-http-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-https-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-ibm-cos-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-ibm-cos-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-ibm-watson-language-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-infinispan-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-infinispan-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-jdbc-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-jms-amqp-10-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-jms-amqp-10-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-jms-apache-artemis-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-jms-apache-artemis-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-jms-ibm-mq-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-jms-ibm-mq-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-jms-pooled-apache-artemis-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-jms-pooled-apache-artemis-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-kafka-apicurio-registry-not-secured-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-kafka-apicurio-registry-not-secured-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-kafka-azure-schema-registry-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-kafka-azure-schema-registry-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-kafka-batch-apicurio-registry-not-secured-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-kafka-batch-apicurio-registry-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-kafka-batch-azure-schema-registry-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-kafka-batch-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-kafka-not-secured-apicurio-registry-json-source-kafka-source-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
+<lastmod>2026-10-13T08:01:41.088Z</lastmod>
</url>
<url>
<loc>https://camel.apache.org/camel-kafka-connector/next/reference/connectors/camel-kafka-not-secured-apicurio-registry-sink-kafka-sink-connector.html</loc>
-<lastmod>2026-10-12T14:37:16.420Z</lastmod>
... 37988 lines suppressed ...