This is an automated email from the ASF dual-hosted git repository.
davsclaus pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/camel.git
The following commit(s) were added to refs/heads/main by this push:
new ee1c43156559 CAMEL-20809: camel-core - Optimize hasHeaders to not
create headers map if not needed. (#20605)
ee1c43156559 is described below
commit ee1c43156559647d180ce66419df5d616b59ce83
Author: Claus Ibsen <[email protected]>
AuthorDate: Sun Dec 28 16:32:07 2025 +0100
CAMEL-20809: camel-core - Optimize hasHeaders to not create headers map if
not needed. (#20605)
---
.../java/org/apache/camel/component/irc/IrcMessage.java | 5 +++++
.../java/org/apache/camel/component/jms/JmsMessage.java | 5 +++++
.../java/org/apache/camel/component/mail/MailMessage.java | 5 +++++
.../org/apache/camel/component/quartz/QuartzMessage.java | 6 ++++++
.../java/org/apache/camel/component/sjms/SjmsMessage.java | 5 +++++
.../java/org/apache/camel/component/xmpp/XmppMessage.java | 6 ++++++
.../org/apache/camel/impl/DefaultMessageHeaderTest.java | 10 ++++++++++
.../camel/issues/PopulateInitialHeadersFailedIssueTest.java | 5 +++++
.../main/java/org/apache/camel/support/DefaultMessage.java | 11 +++++++++--
.../modules/ROOT/pages/camel-4x-upgrade-guide-4_17.adoc | 13 +++++++++++++
10 files changed, 69 insertions(+), 2 deletions(-)
diff --git
a/components/camel-irc/src/main/java/org/apache/camel/component/irc/IrcMessage.java
b/components/camel-irc/src/main/java/org/apache/camel/component/irc/IrcMessage.java
index 22d43f609952..db07e53da80a 100644
---
a/components/camel-irc/src/main/java/org/apache/camel/component/irc/IrcMessage.java
+++
b/components/camel-irc/src/main/java/org/apache/camel/component/irc/IrcMessage.java
@@ -131,6 +131,11 @@ public class IrcMessage extends DefaultMessage {
return new IrcMessage(getCamelContext());
}
+ @Override
+ protected boolean isPopulateHeadersSupported() {
+ return true;
+ }
+
@Override
protected void populateInitialHeaders(Map<String, Object> map) {
map.put(IrcConstants.IRC_MESSAGE_TYPE, messageType);
diff --git
a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessage.java
b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessage.java
index 9b900ceb9480..38bf1c9cf1a3 100644
---
a/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessage.java
+++
b/components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessage.java
@@ -240,6 +240,11 @@ public class JmsMessage extends DefaultMessage {
return null;
}
+ @Override
+ protected boolean isPopulateHeadersSupported() {
+ return true;
+ }
+
@Override
protected void populateInitialHeaders(Map<String, Object> map) {
if (jmsMessage != null && map != null) {
diff --git
a/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailMessage.java
b/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailMessage.java
index 1d24a0fd4681..f9ab6972dab4 100644
---
a/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailMessage.java
+++
b/components/camel-mail/src/main/java/org/apache/camel/component/mail/MailMessage.java
@@ -95,6 +95,11 @@ public class MailMessage extends DefaultMessage {
return null;
}
+ @Override
+ protected boolean isPopulateHeadersSupported() {
+ return true;
+ }
+
@Override
protected void populateInitialHeaders(Map<String, Object> map) {
if (mailMessage != null) {
diff --git
a/components/camel-quartz/src/main/java/org/apache/camel/component/quartz/QuartzMessage.java
b/components/camel-quartz/src/main/java/org/apache/camel/component/quartz/QuartzMessage.java
index 205f82013ec3..8eaa05e97dba 100644
---
a/components/camel-quartz/src/main/java/org/apache/camel/component/quartz/QuartzMessage.java
+++
b/components/camel-quartz/src/main/java/org/apache/camel/component/quartz/QuartzMessage.java
@@ -27,6 +27,7 @@ import org.quartz.Trigger;
* A Camel message to be created upon each scheduled job execution.
*/
public class QuartzMessage extends DefaultMessage {
+
private final JobExecutionContext jobExecutionContext;
public QuartzMessage(Exchange exchange, JobExecutionContext
jobExecutionContext) {
@@ -40,6 +41,11 @@ public class QuartzMessage extends DefaultMessage {
return jobExecutionContext;
}
+ @Override
+ protected boolean isPopulateHeadersSupported() {
+ return true;
+ }
+
@Override
protected void populateInitialHeaders(Map<String, Object> map) {
super.populateInitialHeaders(map);
diff --git
a/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/SjmsMessage.java
b/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/SjmsMessage.java
index 69c2b8153455..0edec65ccd4a 100644
---
a/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/SjmsMessage.java
+++
b/components/camel-sjms/src/main/java/org/apache/camel/component/sjms/SjmsMessage.java
@@ -262,6 +262,11 @@ public class SjmsMessage extends DefaultMessage {
return null;
}
+ @Override
+ protected boolean isPopulateHeadersSupported() {
+ return true;
+ }
+
@Override
protected void populateInitialHeaders(Map<String, Object> map) {
if (jmsMessage != null && map != null) {
diff --git
a/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppMessage.java
b/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppMessage.java
index 9d754ca04524..4eb85c77bb04 100644
---
a/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppMessage.java
+++
b/components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppMessage.java
@@ -29,6 +29,7 @@ import org.jivesoftware.smack.packet.Stanza;
* Represents a {@link org.apache.camel.Message} for working with XMPP
*/
public class XmppMessage extends DefaultMessage {
+
private Stanza xmppPacket;
public XmppMessage(CamelContext camelContext) {
@@ -89,6 +90,11 @@ public class XmppMessage extends DefaultMessage {
return null;
}
+ @Override
+ protected boolean isPopulateHeadersSupported() {
+ return true;
+ }
+
@Override
protected void populateInitialHeaders(Map<String, Object> map) {
if (xmppPacket != null) {
diff --git
a/core/camel-core/src/test/java/org/apache/camel/impl/DefaultMessageHeaderTest.java
b/core/camel-core/src/test/java/org/apache/camel/impl/DefaultMessageHeaderTest.java
index 12da5f9676e6..d5a4b25eb1fe 100644
---
a/core/camel-core/src/test/java/org/apache/camel/impl/DefaultMessageHeaderTest.java
+++
b/core/camel-core/src/test/java/org/apache/camel/impl/DefaultMessageHeaderTest.java
@@ -35,6 +35,16 @@ public class DefaultMessageHeaderTest {
camelContext.start();
}
+ @Test
+ public void testHasHeaders() {
+ Message msg = new DefaultMessage(camelContext);
+ assertFalse(msg.hasHeaders());
+
+ msg.setHeader("foo", "cheese");
+ assertTrue(msg.hasHeaders());
+ assertEquals("cheese", msg.getHeader("foo"));
+ }
+
@Test
public void testLookupCaseAgnostic() {
Message msg = new DefaultMessage(camelContext);
diff --git
a/core/camel-core/src/test/java/org/apache/camel/issues/PopulateInitialHeadersFailedIssueTest.java
b/core/camel-core/src/test/java/org/apache/camel/issues/PopulateInitialHeadersFailedIssueTest.java
index ad3db65add52..76a9a4ecd992 100644
---
a/core/camel-core/src/test/java/org/apache/camel/issues/PopulateInitialHeadersFailedIssueTest.java
+++
b/core/camel-core/src/test/java/org/apache/camel/issues/PopulateInitialHeadersFailedIssueTest.java
@@ -65,6 +65,11 @@ public class PopulateInitialHeadersFailedIssueTest extends
ContextTestSupport {
super(exchange);
}
+ @Override
+ protected boolean isPopulateHeadersSupported() {
+ return true;
+ }
+
@Override
protected void populateInitialHeaders(Map<String, Object> map) {
throw new IllegalArgumentException("Forced headers error");
diff --git
a/core/camel-support/src/main/java/org/apache/camel/support/DefaultMessage.java
b/core/camel-support/src/main/java/org/apache/camel/support/DefaultMessage.java
index 728486f44ddf..5f79a1520785 100644
---
a/core/camel-support/src/main/java/org/apache/camel/support/DefaultMessage.java
+++
b/core/camel-support/src/main/java/org/apache/camel/support/DefaultMessage.java
@@ -287,11 +287,11 @@ public class DefaultMessage extends MessageSupport {
@Override
public boolean hasHeaders() {
- if (headers == null) {
+ if (headers == null && isPopulateHeadersSupported()) {
// force creating headers
headers = createHeaders();
}
- return !headers.isEmpty();
+ return headers != null && !headers.isEmpty();
}
@Override
@@ -328,6 +328,13 @@ public class DefaultMessage extends MessageSupport {
// do nothing by default
}
+ /**
+ * Whether subclasses need to populate headers when creating message.
+ */
+ protected boolean isPopulateHeadersSupported() {
+ return false;
+ }
+
/**
* Returns true if the headers have been mutated in some way
*/
diff --git
a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_17.adoc
b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_17.adoc
index 5b85ed11717e..de011c13e751 100644
--- a/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_17.adoc
+++ b/docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_17.adoc
@@ -36,6 +36,19 @@ from("direct:start")
.to("mock:result");
----
+==== Custom Camel components
+
+Custom components which has a custom message implementation by extending
`DefaultMessage`, which rely on the `populateInitialHeaders`
+to initialize headers must now add the following method:
+
+[source,java]
+----
+ @Override
+ protected boolean isPopulateHeadersSupported() {
+ return true;
+ }
+----
+
=== camel-jbang
The `camel-kamelets-catalog` JAR is now downloaded on-demand.