Apache Camel 4.x Upgrade Guide

This document is for helping you upgrade your Apache Camel application from Camel 4.x to 4.y. For example, if you are upgrading Camel 4.0 to 4.2, then you should follow the guides from both 4.0 to 4.1 and 4.1 to 4.2.

The Camel Upgrade Recipes project provides automated assistance for some common migration tasks. Note that manual migration is still required. See the documentation page for details.

Upgrading from 4.14.3 to 4.14.8

camel-core

The org.apache.camel.support.DefaultHeaderFilterStrategy changed default setting for lowercase from false to true.

camel-jms

JMS ObjectMessage support is now disabled by default. Java object serialization is a recurring source of security issues, and Camel JMS routes rarely use ObjectMessage in practice. The component will now refuse to create or read jakarta.jms.ObjectMessage instances unless the new objectMessageEnabled option is explicitly set to true.

This affects the following endpoint/component options that rely on ObjectMessage internally:

  • jmsMessageType=Object (or sending a Serializable body that is auto-detected as Object)

  • transferExchange=true

  • transferException=true

  • receiving a JMS ObjectMessage produced by an external sender

To restore the previous behavior, enable the option at the component or endpoint level:

camel.component.jms.objectMessageEnabled=true

Or, on a single endpoint:

jms:queue:foo?objectMessageEnabled=true

camel-sjms / camel-sjms2

The same default applies to camel-sjms (and camel-sjms2, which inherits from it): JMS ObjectMessage support is now disabled by default and gated by a new objectMessageEnabled option (default false) on SjmsComponent / SjmsEndpoint.

This affects the same endpoint/component options as camel-jms:

  • jmsMessageType=Object (or sending a Serializable body that is auto-detected as Object)

  • transferException=true

  • receiving a JMS ObjectMessage produced by an external sender

To restore the previous behavior, enable the option at the component or endpoint level:

camel.component.sjms.objectMessageEnabled=true
camel.component.sjms2.objectMessageEnabled=true

Or, on a single endpoint:

sjms:queue:foo?objectMessageEnabled=true
sjms2:queue:foo?objectMessageEnabled=true

camel-hazelcast

Hazelcast instances created and managed by Camel (when no user-supplied Config or HazelcastInstance is provided) now apply a default JavaSerializationFilterConfig on the SerializationConfig of the Config built by Camel. The default whitelists the class name prefixes java., javax., org.apache.camel. and blacklists java.net..

This affects:

  • camel-hazelcast component endpoints when neither hazelcastInstance, hazelcastConfigUri, nor a referenced Config is supplied

  • HazelcastAggregationRepository and HazelcastIdempotentRepository when no hazelcastInstance is supplied

  • HazelcastUtil#newInstance() (no-arg)

A user-supplied JavaSerializationFilterConfig (set on the SerializationConfig of a Config provided via hazelcastConfigUri, a referenced Config bean, or already wired into a pre-built HazelcastInstance) is respected and is not overwritten.

Applications that store classes outside the default whitelist on a Hazelcast topic, queue, map, list, set, or in one of the repositories above must provide their own Config with a JavaSerializationFilterConfig configured for their class names.

camel-lucene

The Exchange header values exposed by LuceneConstants have been renamed to follow the standard Camel naming convention. The field names are unchanged, so routes referencing the constants (LuceneConstants.HEADER_QUERY, LuceneConstants.HEADER_RETURN_LUCENE_DOCS) continue to work without modification. However, routes that set or read these headers using the raw string values must be updated:

  • QUERYCamelLuceneQuery

  • RETURN_LUCENE_DOCSCamelLuceneReturnLuceneDocs

As a consequence, the generated Endpoint DSL header accessors on LuceneHeaderNameBuilder have been renamed accordingly:

  • qUERY()luceneQuery()

  • returnLuceneDocs()luceneReturnLuceneDocs()

camel-jgroups-raft

The Exchange header constants in JGroupsRaftConstants have been renamed to follow the Camel naming convention used across the rest of the component catalog. The Java field names are unchanged; only the header string values have changed:

Constant Previous value New value

JGroupsRaftConstants.HEADER_JGROUPSRAFT_LOG_SIZE

JGROUPSRAFT_LOG_SIZE

CamelJGroupsRaftLogSize

JGroupsRaftConstants.HEADER_JGROUPSRAFT_COMMIT_INDEX

JGROUPSRAFT_COMMIT_INDEX

CamelJGroupsRaftCommitIndex

JGroupsRaftConstants.HEADER_JGROUPSRAFT_CURRENT_TERM

JGROUPSRAFT_CURRENT_TERM

CamelJGroupsRaftCurrentTerm

JGroupsRaftConstants.HEADER_JGROUPSRAFT_IS_LEADER

JGROUPSRAFT_IS_LEADER

CamelJGroupsRaftIsLeader

JGroupsRaftConstants.HEADER_JGROUPSRAFT_LAST_APPLIED

JGROUPSRAFT_LAST_APPLIED

CamelJGroupsRaftLastApplied

JGroupsRaftConstants.HEADER_JGROUPSRAFT_LEADER_ADDRESS

JGROUPSRAFT_LEADER_ADDRESS

CamelJGroupsRaftLeaderAddress

JGroupsRaftConstants.HEADER_JGROUPSRAFT_RAFT_ID

JGROUPSRAFT_RAFT_ID

CamelJGroupsRaftRaftId

JGroupsRaftConstants.HEADER_JGROUPSRAFT_EVENT_TYPE

JGROUPSRAFT_EVENT_TYPE

CamelJGroupsRaftEventType

JGroupsRaftConstants.HEADER_JGROUPSRAFT_SET_OFFSET

JGROUPSRAFT_SET_OFFSET

CamelJGroupsRaftSetOffset

JGroupsRaftConstants.HEADER_JGROUPSRAFT_SET_LENGTH

JGROUPSRAFT_SET_LENGTH

CamelJGroupsRaftSetLength

JGroupsRaftConstants.HEADER_JGROUPSRAFT_SET_TIMEOUT

JGROUPSRAFT_SET_TIMEOUT

CamelJGroupsRaftSetTimeout

JGroupsRaftConstants.HEADER_JGROUPSRAFT_SET_TIMEUNIT

JGROUPSRAFT_SET_TIMEUNIT

CamelJGroupsRaftSetTimeUnit

Routes that reference the constant symbolically (for example setHeader(JGroupsRaftConstants.HEADER_JGROUPSRAFT_SET_TIMEOUT, …​)) continue to work without changes. Routes that set the header by its literal string value (for example setHeader("JGROUPSRAFT_SET_TIMEOUT", …​)) must be updated to use the new value (setHeader("CamelJGroupsRaftSetTimeout", …​)).

camel-neo4j

When using the RETRIEVE_NODES or DELETE_NODE operations with the CamelNeo4jMatchProperties header, the property names provided in the JSON match map are now validated before the MATCH / DELETE WHERE clause is built. Property names must be valid identifiers matching [A-Za-z_][A-Za-z0-9_]*. A request whose match map contains a property name that does not match this pattern now fails fast with an IllegalArgumentException (wrapped in a Neo4jOperationException) instead of producing a malformed query. Property values continue to be passed as bound query parameters and are unaffected.

camel-elasticsearch-rest-client

The Exchange header constants in ElasticSearchRestClientConstant have been renamed to follow the Camel naming convention used across the rest of the component catalog. The Java field names are unchanged; only the header string values have changed:

Constant Previous value New value

ElasticSearchRestClientConstant.ID

ID

CamelElasticsearchId

ElasticSearchRestClientConstant.SEARCH_QUERY

SEARCH_QUERY

CamelElasticsearchSearchQuery

ElasticSearchRestClientConstant.INDEX_SETTINGS

INDEX_SETTINGS

CamelElasticsearchIndexSettings

ElasticSearchRestClientConstant.INDEX_NAME

INDEX_NAME

CamelElasticsearchIndexName

ElasticSearchRestClientConstant.OPERATION

OPERATION

CamelElasticsearchOperation

Routes that reference the constant symbolically (for example setHeader(ElasticSearchRestClientConstant.SEARCH_QUERY, …​)) continue to work without changes. Routes that set the header by its literal string value (for example setHeader("SEARCH_QUERY", …​)) must be updated to use the new value (setHeader("CamelElasticsearchSearchQuery", …​)).

camel-mail

The SMTP producer no longer extracts dynamic JavaMail session properties from message headers by default. Previously any message header whose key started with mail.smtp. was applied to a per-message JavaMailSender, which meant an upstream producer that mapped untrusted input into the exchange header map (for example platform-http query parameters, JMS or Kafka messages from untrusted producers) could override transport-security settings such as mail.smtp.ssl.trust or mail.smtp.starttls.enable, or redirect the SMTP connection.

This behaviour is now disabled by default. Routes that legitimately rely on per-message mail.smtp.* headers must opt back in on the endpoint:

.to("smtp://mymailserver:1234?useJavaMailSessionPropertiesFromHeaders=true");

Even with the opt-in, route authors should still strip the namespace with removeHeaders("mail.smtp.*") between any untrusted ingress and the mail producer.

In addition, the inbound MailHeaderFilterStrategy now blocks the mail.smtp. / mail.smtps. prefix as well, so an external mail message can no longer inject these into a downstream exchange.

camel-jira - potential breaking change

The Exchange header constants in JiraConstants have been renamed to follow the Camel naming convention used across the rest of the component catalog. The Java field names are unchanged; only the header string values have changed:

Constant Previous value New value

JiraConstants.ISSUE_ASSIGNEE_ID

IssueAssigneeId

CamelJiraIssueAssigneeId

JiraConstants.ISSUE_ASSIGNEE

IssueAssignee

CamelJiraIssueAssignee

JiraConstants.ISSUE_COMPONENTS

IssueComponents

CamelJiraIssueComponents

JiraConstants.ISSUE_COMMENT

IssueComment

CamelJiraIssueComment

JiraConstants.ISSUE_CHANGED

IssueChanged

CamelJiraIssueChanged

JiraConstants.ISSUE_KEY

IssueKey

CamelJiraIssueKey

JiraConstants.ISSUE_PRIORITY_ID

IssuePriorityId

CamelJiraIssuePriorityId

JiraConstants.ISSUE_PRIORITY_NAME

IssuePriorityName

CamelJiraIssuePriorityName

JiraConstants.ISSUE_PROJECT_KEY

ProjectKey

CamelJiraIssueProjectKey

JiraConstants.ISSUE_SUMMARY

IssueSummary

CamelJiraIssueSummary

JiraConstants.ISSUE_TRANSITION_ID

IssueTransitionId

CamelJiraIssueTransitionId

JiraConstants.ISSUE_TYPE_ID

IssueTypeId

CamelJiraIssueTypeId

JiraConstants.ISSUE_TYPE_NAME

IssueTypeName

CamelJiraIssueTypeName

JiraConstants.ISSUE_WATCHED_ISSUES

IssueWatchedIssues

CamelJiraIssueWatchedIssues

JiraConstants.ISSUE_WATCHERS_ADD

IssueWatchersAdd

CamelJiraIssueWatchersAdd

JiraConstants.ISSUE_WATCHERS_REMOVE

IssueWatchersRemove

CamelJiraIssueWatchersRemove

JiraConstants.PARENT_ISSUE_KEY

ParentIssueKey

CamelJiraParentIssueKey

JiraConstants.CHILD_ISSUE_KEY

ChildIssueKey

CamelJiraChildIssueKey

JiraConstants.LINK_TYPE

linkType

CamelJiraLinkType

JiraConstants.MINUTES_SPENT

minutesSpent

CamelJiraMinutesSpent

Routes that reference the constants symbolically (for example setHeader(JiraConstants.ISSUE_KEY, …​)) continue to work without changes. Routes that set the header by its literal string value (for example setHeader("IssueKey", …​)) must be updated to use the new value (setHeader("CamelJiraIssueKey", …​)).

As a consequence, the generated Endpoint DSL header accessors on JiraHeaderNameBuilder have been renamed accordingly:

  • issueAssigneeId()jiraIssueAssigneeId()

  • issueAssignee()jiraIssueAssignee()

  • issueComponents()jiraIssueComponents()

  • issueChanged()jiraIssueChanged()

  • issueKey()jiraIssueKey()

  • issuePriorityId()jiraIssuePriorityId()

  • issuePriorityName()jiraIssuePriorityName()

  • projectKey()jiraIssueProjectKey()

  • issueSummary()jiraIssueSummary()

  • issueTransitionId()jiraIssueTransitionId()

  • issueTypeId()jiraIssueTypeId()

  • issueTypeName()jiraIssueTypeName()

  • issueWatchedIssues()jiraIssueWatchedIssues()

  • issueWatchersAdd()jiraIssueWatchersAdd()

  • issueWatchersRemove()jiraIssueWatchersRemove()

  • parentIssueKey()jiraParentIssueKey()

  • childIssueKey()jiraChildIssueKey()

  • linkType()jiraLinkType()

  • minutesSpent()jiraMinutesSpent()

camel-mongodb-gridfs - potential breaking change

The Exchange header values exposed by GridFsConstants have been renamed to follow the standard Camel naming convention, bringing camel-mongodb-gridfs in line with the parent camel-mongodb component (MongoDbConstants.OPERATION_HEADER = "CamelMongoDbOperation"). The Java field names are unchanged, so routes referencing the constants symbolically (e.g. GridFsConstants.GRIDFS_OPERATION, GridFsConstants.GRIDFS_OBJECT_ID) continue to work without modification. However, routes that set or read these headers using the raw string values must be updated:

  • gridfs.operationCamelGridFsOperation

  • gridfs.metadataCamelGridFsMetadata

  • gridfs.chunksizeCamelGridFsChunkSize

  • gridfs.objectidCamelGridFsObjectId

  • gridfs.fileidCamelGridFsFileId

As a consequence, the generated Endpoint DSL header accessors on GridFsHeaderNameBuilder have been renamed accordingly:

  • gridfsOperation()gridFsOperation()

  • gridfsMetadata()gridFsMetadata()

  • gridfsChunksize()gridFsChunkSize()

  • gridfsObjectid()gridFsObjectId()

  • gridfsFileid()gridFsFileId()

camel-solr

The two Exchange header prefix constants in SolrConstants have been renamed to follow the Camel naming convention already used by the other constants in the same file (which were renamed in 4.10 under CAMEL-21697). The Java field names are unchanged; only the prefix string values have changed:

Constant Previous value New value

SolrConstants.HEADER_FIELD_PREFIX

SolrField.

CamelSolrField.

SolrConstants.HEADER_PARAM_PREFIX

SolrParam.

CamelSolrParam.

Routes that reference the constants symbolically (for example setHeader(SolrConstants.HEADER_FIELD_PREFIX + "id", …​)) continue to work without changes. Routes that set the headers by their literal string value (for example setHeader("SolrField.id", …​) or setHeader("SolrParam.commit", …​)) must be updated to use the new prefix (CamelSolrField.id, CamelSolrParam.commit).

Because the renamed prefixes now begin with Camel, they are stripped by the standard transport HeaderFilterStrategy (HttpHeaderFilterStrategy, etc.) when crossing a transport boundary, by design — Camel* headers are framework-internal and are not propagated over the wire. Routes that bridge an external transport (HTTP, JMS, …​) into a solr: producer and want to drive Solr document fields or query parameters from a header supplied by the sender must therefore carry the value in a non-Camel-prefixed application header and map it to the appropriate CamelSolrField. / CamelSolrParam. header in the route between the transport from and the solr: to.

Upgrading from 4.14.2 to 4.14.3

camel-tika

Upgraded to Tika v3, and removed textMain from tikaParseOutputFormat option.

Upgrading from 4.14.1 to 4.14.2

camel-kamelet

The kamelet component is now parsing endpoint parameters using raw mode to ensure when using sensitive parameters such as access keys, passwords etc. they are not URI encoded.

Upgrading from 4.10.0 to 4.10.1

No changes

Upgrading Camel 4.13 to 4.14

camel-core

The org.apache.camel.spi.ExecutorServiceManager.ThreadFactoryListener has changed the method signature to include the source, so the method is changed from ThreadFactory onNewThreadFactory(ThreadFactory factory) to ThreadFactory onNewThreadFactory(Object source, ThreadFactory factory)

Splitter and Multicast EIPs

When using shareUnitOfWork=true in Split or Multicast EIPs, then Camel will now use a single shared UnitOfWork instance (parent) for the entire body of work. So if the Splitter is splitting into 1000 sub messages, then each of them will now reuse the same UnitOfWork and any completion tasks that each sub messages, will now be executed later, when the parent UnitOfWork is complete, usually when the original message is completed.

Previously, each sub-message was independent (despite the documentation refers to this not being the case). However this feature has been mistakenly for many years, as this feature is rarely in use. However, we had the opportunity to look into this as part of an issue, and felt it’s better to fix this before for this LTS release.

camel-main

The HTTP server for standalone camel-main applications has separated management services and business services. This means that configurations in application.properties should be changed from camel.server.xxx to camel.management.xxx as shown below:

Old Option

New Option

camel.server.devConsoleEnabled

camel.management.devConsoleEnabled

camel.server.healthCheckEnabled

camel.management.healthCheckEnabled

camel.server.jolokiaEnabled

camel.management.jolokiaEnabled

camel.server.metricsEnabled

camel.management.metricsEnabled

camel.server.uploadEnabled

camel.management.uploadEnabled

camel.server.uploadSourceDir

camel.management.uploadSourceDir

camel.server.downloadEnabled

camel.management.downloadEnabled

camel.server.sendEnabled

camel.management.sendEnabled

camel.server.healthPath

camel.management.healthPath

camel.server.jolokiaPath

camel.management.jolokiaPath

Make sure if you use any of the managed HTTP services such as health-checks then enable the management server with camel.management.enabled=true.

The default HTTP endpoints has changed in some management services as listed below:

Old Path

New Path

/q/health

/observe/health

/q/metrics

/observe/metrics

/q/info

/observe/info

/q/jolokia

/observe/jolokia

camel-jbang

The camel-jbang has upgraded to Java 21 as the default java-version when running and exporting. To keep using java 17, you can use --java-version=17 as parameter.

The camel export will not include camel-observabilities-services out of the box. To include this, then use --observe to enable this during export.

Notice when exporting to kubernetes then camel-observabilities-services is always enabled.

When controlling Camel JBang exports with configuration in application.properties then there was a duplicate option (camel.jbang.repositories and camel.jbang.repos) which has been fixed to be only camel.jbang.repos.

camel-google

The scopes parameter for camel-google-calendar, camel-google-calendar-streams, camel-google-drive, camel-google-mail, camel-google-mail-streams and camel-google-sheets-streams has been defined as String instead of Collection<String>. For the migration users will need to, eventually, define scopes as a comma separated list of scopes instead of a Collection instance. For more information the related issue is CAMEL-22247.

camel-consul

The nodeMeta and the tags parameter for camel-consul has been defined as String instead of List<String>. For the migration users will need to, eventually, define nodeMeta as a comma separated list of nodeMeta instead of a List or Set instance. For more information the related issue is CAMEL-17339.

camel-dapr

The configKeys parameter for camel-dapr has been defined as String instead of List<String>. For the migration users will need to, eventually, define configKeys as a comma separated list of config Keys instead of a List instance. For more information the related issue is CAMEL-17339.

camel-huawei-dms

The availableZones parameter for camel-huawei-dms has been defined as String instead of List<String>. For the migration users will need to, eventually, define availableZones as a comma separated list of available zones instead of a List instance. For more information the related issue is CAMEL-17339.

camel-weather

The ids parameter for camel-weather has been defined as String instead of List<String>. For the migration users will need to, eventually, define ids as a comma separated list of id instead of a List instance. For more information the related issue is CAMEL-17339.

camel-web3j

The addresses, privateFor and Topics parameters for camel-web3j have been defined as String instead of List<String>. For the migration users will need to, eventually, define addresses, privateFor or topics as a comma separated list of addresses, privateFor or topics instead of a List instance. For more information the related issue is CAMEL-17339.

camel-spring-batch

The jobLauncher and jobRegistry is now autowired on the component if there is a single instance pre-configured in the application. This avoids having to wire this into the Camel component or endpoints.

camel-nats

The default headerFilterStrategy is now a new NatsHeaderFilterStrategy that filters headers starting with Camel / camel (case-insensitive) in both the inbound and outbound directions, aligning the component with the rest of the Camel component catalog (camel-kafka, camel-mail, camel-coap, camel-google-pubsub, …​). Routes that relied on passing through these header names from NATS messages can supply a custom headerFilterStrategy to restore the previous behaviour.

camel-xmpp

The default headerFilterStrategy is now a new XmppHeaderFilterStrategy that filters headers starting with Camel / camel (case-insensitive) in both the inbound and outbound directions, aligning the component with the rest of the Camel component catalog (camel-kafka, camel-mail, camel-coap, camel-google-pubsub, …​). Routes that relied on passing through these header names from XMPP messages can supply a custom headerFilterStrategy to restore the previous behaviour.

camel-vertx-websocket

The vertx-websocket consumer now applies a HeaderFilterStrategy to the WebSocket query and path parameters before mapping them into the Camel message headers. The new default VertxWebsocketHeaderFilterStrategy filters headers starting with Camel / camel (case-insensitive) in both the inbound and outbound directions, aligning the component with the rest of the Camel component catalog (camel-coap, camel-kafka, camel-nats, …​). A new headerFilterStrategy endpoint option is available; routes that relied on receiving Camel-prefixed header names from WebSocket query or path parameters can supply a custom headerFilterStrategy to restore the previous behaviour.

camel-atmosphere-websocket

The atmosphere-websocket consumer now applies the endpoint HeaderFilterStrategy to the WebSocket query parameters before mapping them into the Camel message headers. The inherited default HttpHeaderFilterStrategy filters headers starting with Camel / camel (case-insensitive). Routes that relied on receiving Camel-prefixed header names from WebSocket query parameters can supply a custom headerFilterStrategy to restore the previous behaviour.

camel-aws2-sqs

Sqs2HeaderFilterStrategy now also configures an inbound filter aligned with the existing outbound regex. Headers starting with Camel / camel (case-insensitive), breadcrumbId and org.apache.camel.* are now filtered in both the inbound and outbound directions, aligning the component with the rest of the Camel component catalog (camel-kafka, camel-mail, camel-coap, camel-google-pubsub, …​). Routes that relied on receiving these header names from inbound SQS messages can supply a custom headerFilterStrategy to restore the previous behaviour.

camel-aws2-sns

Sns2HeaderFilterStrategy now also configures an inbound filter aligned with the existing outbound regex. Headers starting with Camel / camel (case-insensitive), breadcrumbId and org.apache.camel.* are now filtered in both the inbound and outbound directions, aligning the component with the rest of the Camel component catalog. Routes that relied on receiving these header names on inbound SNS messages can supply a custom headerFilterStrategy to restore the previous behaviour.

camel-cxf - potential breaking change

The Exchange header constants in CxfConstants (module camel-cxf-common, shared by camel-cxf and camel-cxfrs) have been renamed to follow the Camel naming convention used across the rest of the component catalog. The Java field names are unchanged; only the header string values have changed:

Constant Previous value New value

CxfConstants.OPERATION_NAME

operationName

CamelCxfOperationName

CxfConstants.OPERATION_NAMESPACE

operationNamespace

CamelCxfOperationNamespace

Routes that reference the constant symbolically (for example setHeader(CxfConstants.OPERATION_NAME, …​)) continue to work without changes. Routes that set the header by its literal string value (for example setHeader("operationName", …​)) must be updated to use the new value (setHeader("CamelCxfOperationName", …​)).

In particular, the documented cxfrs SimpleConsumer dispatch idiom that routes on the operation name by its literal header name must be updated:

// before
from("cxfrs:bean:rsServer?bindingStyle=SimpleConsumer")
    .recipientList(simple("direct:${header.operationName}"));

// after
from("cxfrs:bean:rsServer?bindingStyle=SimpleConsumer")
    .recipientList(simple("direct:${header.CamelCxfOperationName}"));

Behaviour change: cross-transport propagation of the operation header

Because the renamed header value now begins with Camel, it is filtered by the standard transport HeaderFilterStrategy (JmsHeaderFilterStrategy, HttpHeaderFilterStrategy, etc.) when crossing a transport boundary, by design — Camel* headers are framework-internal and are not propagated over the wire.

Routes that bridge an external transport (JMS, HTTP, …​) into a cxf: producer and select the SOAP operation from a header supplied by the sender must therefore carry the operation in a non-Camel-prefixed application header and map it to CxfConstants.OPERATION_NAME (CamelCxfOperationName) in the route between the transport from and the cxf: to:

<!-- before -->
<route>
    <from uri="jms:queue:bridge.cxf"/>
    <to uri="cxf://bean:serviceEndpoint"/>
</route>
<!-- caller sets the header keyed by the pre-rename value:
     setHeader("operationName", "greetMe") -->

<!-- after -->
<route>
    <from uri="jms:queue:bridge.cxf"/>
    <setHeader name="CamelCxfOperationName">
        <simple>${header.operationName}</simple>
    </setHeader>
    <to uri="cxf://bean:serviceEndpoint"/>
</route>
<!-- caller sets a non-Camel-prefixed application carrier header (any name
     that is not stripped by the transport HeaderFilterStrategy works);
     the route restores the CXF operation header after the transport hop. -->

The same pattern applies to HTTP-based bridges (platform-http/jetty/netty -http/httpcxf:) and any other transport whose default HeaderFilterStrategy filters Camel* headers.

camel-jgroups - potential breaking change

The Exchange header constants in JGroupsConstants have been renamed to follow the Camel naming convention used across the rest of the component catalog. The Java field names are unchanged; only the header string values have changed:

Constant Previous value New value

JGroupsConstants.HEADER_JGROUPS_CHANNEL_ADDRESS

JGROUPS_CHANNEL_ADDRESS

CamelJGroupsChannelAddress

JGroupsConstants.HEADER_JGROUPS_DEST

JGROUPS_DEST

CamelJGroupsDest

JGroupsConstants.HEADER_JGROUPS_SRC

JGROUPS_SRC

CamelJGroupsSrc

JGroupsConstants.HEADER_JGROUPS_ORIGINAL_MESSAGE

JGROUPS_ORIGINAL_MESSAGE

CamelJGroupsOriginalMessage

This is a breaking change for routes that read or write these headers by their literal string value. Routes that reference the constant symbolically (for example setHeader(JGroupsConstants.HEADER_JGROUPS_DEST, …​)) continue to work without changes. Routes that set the header by its literal string value (for example setHeader("JGROUPS_DEST", …​)) must be updated to use the new value (setHeader("CamelJGroupsDest", …​)).

camel-dns - potential breaking change

The Exchange header constants in DnsConstants have been renamed to follow the Camel naming convention used across the rest of the component catalog. The Java field names are unchanged; only the header string values have changed:

Constant Previous value New value

DnsConstants.DNS_CLASS

dns.class

CamelDnsClass

DnsConstants.DNS_NAME

dns.name

CamelDnsName

DnsConstants.DNS_DOMAIN

dns.domain

CamelDnsDomain

DnsConstants.DNS_SERVER

dns.server

CamelDnsServer

DnsConstants.DNS_TYPE

dns.type

CamelDnsType

DnsConstants.TERM

term

CamelDnsTerm

Routes that reference the constant symbolically (for example setHeader(DnsConstants.DNS_SERVER, …​)) continue to work without changes. Routes that set the header by its literal string value (for example setHeader("dns.server", …​) or setHeader("term", …​)) must be updated to use the new value:

// before
from("direct:start")
    .setHeader("dns.name", constant("www.example.com"))
    .setHeader("dns.type", constant("A"))
    .to("dns:lookup");

// after
from("direct:start")
    .setHeader("CamelDnsName", constant("www.example.com"))
    .setHeader("CamelDnsType", constant("A"))
    .to("dns:lookup");

Behaviour change: cross-transport propagation of dns.* headers

Because the renamed header values now begin with Camel, they are filtered by the standard transport HeaderFilterStrategy (JmsHeaderFilterStrategy, HttpHeaderFilterStrategy, etc.) when crossing a transport boundary, by design — Camel* headers are framework-internal and are not propagated over the wire.

Routes that bridge an external transport (HTTP, JMS, …​) into a dns: producer and let the sender choose the DNS operation parameters via headers must therefore carry those parameters in non-Camel-prefixed application headers and map them to the corresponding DnsConstants value in the route between the transport from and the dns: to. Allowing untrusted senders to drive DnsConstants.DNS_SERVER (the recursive resolver target in dns:dig) without such a mapping step is not the intended use of the component.