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.

Reply via email to