Michwo commented on code in PR #1683:
URL: https://github.com/apache/camel-website/pull/1683#discussion_r3506972101
##########
content/blog/2026/07/camel421-whatsnew/index.md:
##########
@@ -0,0 +1,396 @@
+---
+title: "Apache Camel 4.21 What's New"
+date: 2026-07-03
+draft: false
+authors: [ davsclaus ]
+categories: [ "Releases" ]
+keywords: ["apache camel", "whats new", "camel 4", "release", "camel 4.21",
"integration framework"]
+preview: "Details of what we have done in the Camel 4.21 release."
+---
+
+Apache Camel 4.21 has just been [released](/blog/2026/07/RELEASE-4.21.0/).
+
+This release introduces a large set of new features and noticeable
improvements that we will cover in this blog post.
+
+## Camel Core
+
+### Error Registry
+
+The Error Registry has been enhanced to capture rich exchange data snapshots
at error time,
+following the same pattern as BacklogTracer. This includes the message body,
headers, exchange properties,
+and variables — giving you a complete picture of what was happening when the
error occurred.
+
+Error registry configuration has moved to a dedicated `camel.errorRegistry.*`
prefix:
+
+```properties
+camel.errorRegistry.enabled=true
+camel.errorRegistry.maximumEntries=100
+camel.errorRegistry.timeToLiveSeconds=300
+```
+
+The error registry integrates with the route diagram rendering, allowing you
to visualize the
+exact path a failed exchange took through your routes.
+
+### Route Topology
+
+A new route topology service computes inter-route relationships — which routes
send messages to
+which other routes (via `direct`, `seda`, `kafka`, etc.). The topology is
available through a dev console
+and powers the new topology diagram rendering in both the CLI and the
embeddable web component.
+
+See the dedicated [Route Topology](/blog/2026/06/camel-route-topology/) blog
post for more details.
+
+### Group-Scoped Variables
+
+Variables can now be scoped to a route group. When multiple routes share a
`routeGroup`,
+they can share variables within that group scope using `variable.group:myVar`:
+
+```java
+from("direct:a").routeGroup("myGroup")
+ .setVariable("group:counter", simple("${variable.group:counter}++"))
+ .to("direct:b");
+
+from("direct:b").routeGroup("myGroup")
+ .log("Counter is ${variable.group:counter}");
+```
+
+### Exchange Memory Optimization
+
+We made significant work to reduce memory pressure on the Exchange object:
+
+- **Copy-on-write headers**: Message headers are now shared across exchange
copies (multicast, splitter, etc.)
+ and only copied when actually modified, reducing allocation overhead.
+- **Lazy initialization**: Several internal data structures on the Exchange
are now initialized lazily,
+ reducing the baseline memory footprint.
+- **O(1) CaseInsensitiveMap**: The default `CaseInsensitiveMap` used for
message headers now uses a custom
+ hash table with zero-allocation lookups and header key deduplication, making
the external
+ `camel-headersmap` dependency unnecessary (now deprecated).
+
+### Virtual Threads
+
+When virtual threads are enabled, the `threads()` EIP now honors `maxQueueSize`
+for backpressure. Previously, `maxQueueSize` was silently ignored and tasks
were accepted unboundedly.
+
+A new `Block` rejected policy has been added to `ThreadPoolRejectedPolicy`,
where the caller blocks
+until capacity becomes available.
+
+### JSpecify Null Annotations
+
+The `camel-api` module now uses `@NullMarked` and `@Nullable` annotations from
JSpecify to document
+nullability contracts across the Camel API surface. This enables compile-time
null checking with tools like NullAway.
+
+### Simple Language
+
+Several improvements to the Simple language:
+
+- `floor`/`ceil` now return `long` instead of `int` to avoid overflow for
large values.
+- `range(N)` in csimple now starts at 1 (consistent with the `simple`
language).
+- The internal implementation has been refactored into domain-aligned builder
classes for better maintainability.
+
+## Camel CLI
+
+Camel JBang has been rebranded as **Camel CLI** in the documentation.
+
+### Camel TUI
+
+The Camel TUI (Terminal User Interface) is a new feature in heavy development,
and we will publish
+dedicated blog posts to highlight this feature in more detail. More
improvements are coming in the
+following releases.
+
+In this release the TUI received many improvements:
+
+- **History tab** — Browse the exchange processing history.
+- **Error tab** — View errors captured by the error registry with full
exchange snapshots.
+- **Shell tab** — An embedded shell for advanced CLI usage directly within the
TUI.
+- **OpenTelemetry tab** — View distributed traces and spans directly in the
TUI.
+- **Route diagrams** — Graphical route diagram rendering with live metrics
overlay in the TUI.
+- **Send Message dialog** — Send test messages to routes directly from the TUI.
+- **Screenshot action (Shift+F5)** — Capture the current TUI screen as ASCII
art.
+- **F2 actions menu** — Quick actions including _Run an example_ and _Run
Infra Service_.
+- **Notifications** — TUI now shows `(n)` notification counts.
+
+### Embedded MCP Server
+
+The TUI now includes an embedded MCP server that allows AI coding agents to
observe and interact
+with a running Camel application's screen. New MCP runtime tools provide
access to topology, errors,
+thread dumps, exchange history, and the ability to stop routes or send
messages.
+
+### `camel dev` Alias
+
+A new `camel dev` command has been added as a convenient alias for `camel run
--dev`.
+
+### Auto-Detect application.properties
+
+The `camel run` and `camel export` commands now auto-detect
`application.properties` (and profile-specific
+variants) in the current directory and include them automatically. You no
longer need to list the
+properties file explicitly on the command line.
+
+### Container-Optimized Docker Export
+
+The `camel export` command now generates Dockerfiles optimized for container
image layer caching.
+Dependencies (stable) and application code (volatile) are placed in separate
Docker layers,
+so rebuilds only update the thin application layer.
+
+- **Camel Main**: uses `maven-jar-plugin` with classpath manifest and
`maven-dependency-plugin:copy-dependencies`.
+- **Spring Boot**: uses Spring Boot's `jarmode=tools extract --layers` for
4-layer Docker images.
+
+### Lazy Plugin Loading
+
+Plugins are now loaded lazily. Built-in commands that do not consume plugins
+(such as `camel get`, `camel version`, `camel ps`) skip plugin discovery
entirely,
+making these commands faster. Plugin classpath resolution is also cached.
+
+### Wrapper Renamed
+
+The `camel wrapper` command now installs scripts as `camel` instead of
`camelw`.
+
+### Quarkus Version Auto-Resolution
+
+The default Quarkus Platform version is now determined at runtime by querying
the Quarkus Extension Registry,
+finding the newest platform compatible with the current Camel version. No more
stale hardcoded defaults.
+
+### AI-Friendly Exports
+
+Exported projects now include an `AGENTS.md` file and a _For AI coding
assistants_ section in the generated
+`readme.md`, linking to the Apache Camel LLM index for better AI coding
assistant context.
+
+## Route Diagrams
+
+The new `camel-diagram` component provides route diagram rendering in multiple
formats:
+
+- **ASCII art** — Text-based diagrams for CLI and logging with configurable
themes.
+- **HTML** — Interactive diagrams with an embeddable `<camel-route-diagram>`
web component that renders
+ routes as SVG with optional live metrics overlay and periodic refresh.
+- **Topology** — Inter-route relationship diagrams showing how routes connect
to each other.
+
+The component includes a dev console, integrates with the TUI, and can
highlight error paths
+from the error registry message history.
+
+```properties
+# show route diagrams with live counters
+camel.diagram.enabled=true
+```
+
+## Camel AI
+
+### Agent-to-Agent Protocol (A2A)
+
+A new `camel-a2a` component (Preview) provides support for the
+[Agent-to-Agent (A2A) protocol](https://google.github.io/A2A/). As a consumer,
it exposes Camel routes
+as A2A-compliant agents; as a producer, it calls remote A2A agents. The
component also provides an
+`a2aSubTask` route step for scoped progress updates.
+
+### Audio Transcription
+
+The `camel-openai` component now supports audio transcription (speech-to-text)
via the Whisper API.
+
+The component also now accepts `WrappedFile`, `byte[]`, and `InputStream`
bodies for vision models,
+so you can pipe files directly from `camel-file`, `camel-ftp`, or
`camel-aws2-s3` to an AI model
+without conversion issues.
+
+### LangChain4j Structured Output
+
+The `camel-langchain4j-agent` component now supports structured outputs,
allowing you to specify a
+Java class as the response format. The LLM response is automatically parsed
into the specified type.
+
+### MCP Server Improvements
+
+The Camel MCP Server received further improvements:
+
+- **Runtime tools** — New tools for route topology, errors, thread dumps,
exchange history,
+ stopping routes, and sending messages to running Camel applications.
+- **MCP SDK 2.0** — Embraced the new MCP Java SDK 2.0 API.
+- **Claude Code plugin** — The Camel MCP Server is now published as a Claude
Code plugin.
+- **Route diagram tool** — Generate visual route diagrams via MCP, including
ASCII diagrams.
+- **Leaner responses** — Reduced token consumption by removing verbose
descriptions from catalog
+ list responses and stripping null fields from JSON responses.
+
+### Tool Argument Filtering
+
+Tool argument headers in `camel-langchain4j-tools`, `camel-langchain4j-agent`,
and `camel-spring-ai-tools`
+are now filtered against the tool's declared parameter schema. Only declared
parameters are set as headers,
+preventing undeclared LLM-generated arguments from leaking into the Exchange.
+
+### Multi-Tool Isolation
+
+When the LLM requests multiple tool invocations within a single request, each
tool is now invoked on its
+own independent copy of the exchange, guaranteeing complete isolation between
tool calls.
+
+## Observability
+
+### OpenTelemetry Java Agent in TUI
+
+A new `--open-telemetry-agent` flag for `camel run`/`camel dev` attaches the
OpenTelemetry Java Agent
+to the Camel process. An embedded OTLP receiver feeds spans directly into the
TUI Spans tab — no
+external collector needed.
+
+```bash
+camel dev myRoute.yaml --open-telemetry-agent
+```
+
+### Reduced Span Verbosity
+
+Processors that send to an endpoint (`to`, `toD`, `wireTap`, `enrich`) no
longer emit a redundant
+processor span wrapping the endpoint event span. This reduces span tree depth
and total span count.
+
+### AWS Span Decorators
+
+New span decorators have been added for AWS components, providing better trace
context for AWS service calls.
+
+### Baggage Management
+
+The `camel-micrometer-observability` component now supports baggage management
for propagating
+contextual data across service boundaries.
+
+## Security Hardening
+
+This release includes a comprehensive security hardening effort:
+
+### Header Naming Convention
+
+Exchange header constants across 30+ components have been aligned to the
`Camel*` naming convention
+(e.g., `kafka.TOPIC` -> `CamelKafkaTopic`). This ensures that
framework-internal headers are properly
+filtered by the default `HeaderFilterStrategy` at transport boundaries,
preventing header injection attacks.
+
+Components affected include: Kafka, Salesforce, CXF, Elasticsearch,
OpenSearch, JGroups, Jira, IRC,
+OpenStack, Web3j, PDF, Solr, and many more. See the [upgrade
guide](/manual/camel-4x-upgrade-guide-4_21.html)
+for the complete list.
+
+### Deserialization Hardening
+
+- Default `ObjectInputFilter` now includes JEP-290 graph-shape limits
(`maxdepth=20`, `maxrefs=10000`,
+ `maxbytes=10485760`) and denies `java.net.**` classes across all
deserialization sites.
+- JMS `ObjectMessage` support is disabled by default in `camel-jms` and
`camel-sjms`.
+- Java serialization type converters for `ObjectInput`/`ObjectOutput` have
been removed from camel-core.
+- Jackson data formats (`camel-jackson`, `camel-jacksonxml`,
`camel-jackson-avro`, `camel-jackson-protobuf`)
+ now block unsafe polymorphic base types by default.
+
+### Mail Security
+
+The `camel-mail` component now defaults `useHeaderRecipients`,
`useHeaderFrom`, `useHeaderSubject`,
+and `useHeaderReplyTo` to `false`, preventing untrusted exchange headers from
overriding endpoint-configured
+mail settings.
+
+### CXF WS-Security Optional
+
+The `cxf-rt-ws-security` dependency in `camel-cxf-soap` is now optional. Most
users don't need
+WS-Security, and the transitive OpenSAML dependencies hosted on the unreliable
`build.shibboleth.net`
+repository caused build failures.
+
+## Canonical YAML DSL
+
+A new canonical JSON Schema variant (`camelYamlDsl-canonical.json`) removes
all implicit patterns (string
+shorthands, inline expressions, `oneOf`/`anyOf`/`not` constructs) to provide a
simpler, more predictable
+schema for tooling and AI assistants.
+
+A new `camel validate normalize` command rewrites YAML routes from the compact
(shorthand) form
+to the canonical (explicit) form. Camel also now logs a WARN when YAML routes
use compact notation,
+encouraging adoption of the canonical style.
+
+The YAML DSL now supports a classpath-discovered extension point for
component-provided custom route step
+deserializers, enabling optional modules to contribute YAML step names
automatically.
+
+## Camel Kafka / Spring Boot
+
+### Spring Kafka Properties Bridge
+
+When using `camel-kafka-starter` with Spring Boot, the standard
`spring.kafka.*` properties are now
+automatically bridged to the Camel Kafka component. You no longer need to
duplicate settings under both
+`spring.kafka.*` and `camel.component.kafka.*`.
+
+```properties
+# These Spring Boot properties are now automatically picked up by Camel Kafka
+spring.kafka.bootstrap-servers=localhost:9092
+spring.kafka.consumer.group-id=my-group
+spring.kafka.security.protocol=SASL_SSL
+```
+
+Explicit `camel.component.kafka.*` settings always take precedence.
+
+### Spring Boot 4.1
+
+Upgraded to Spring Boot 4.1.
+
+## Azure Blob Storage
+
+The `camel-azure-storage-blob` component gained several new operations:
+
+- **Index tags** — Set, get, and find blobs by index tags.
+- **Blob versions** — List all versions of blobs in a container with version
ID and current-version flag.
+- **Immutability policies** — Set immutability policies and legal holds on
blobs.
+- **Soft-delete recovery** — Undelete soft-deleted blobs.
+- **Access tier** — Change the access tier of existing blobs.
+
+## Miscellaneous
+
+The `camel-bindy` component can now handle parse failures gracefully with a
new `continueParseOnFailure`
+option, substituting default values instead of aborting the entire unmarshal.
+
+The `camel-keycloak` component gained support for Keycloak 26+ Organizations
API and token revocation
+and session logout operations.
+
+The `camel-nats` component now works properly in JetStream pull mode
(previously pull requests were
+never issued) and supports manual acknowledgement.
+
+The `camel-mongodb` consumer now exposes the resume token for change streams.
Review Comment:
May be worth adding that it camel-mongodb also supports resume strategies
now as this was not described in initial issue/PR.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]