This is an automated email from the ASF dual-hosted git repository. davsclaus pushed a commit to branch mh in repository https://gitbox.apache.org/repos/asf/camel.git
commit 5ce23a5bdae551b4b655b543f62d15df9a3f0dd5 Author: Claus Ibsen <[email protected]> AuthorDate: Fri Dec 26 15:11:07 2025 +0100 CAMEL-20809: camel-core - Optimize hasHeaders to not create headers map if not needed. --- .../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 77f729fe98a7..f193e38b519a 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.
