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 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]

Reply via email to