You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@camel.apache.org by da...@apache.org on 2025/12/26 14:18:12 UTC
(camel) 01/01: CAMEL-20809: camel-core - Optimize hasHeaders to not create headers map if not needed.
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 <cl...@gmail.com>
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.