Skip to content

Commit ee1c431

Browse files
authored
CAMEL-20809: camel-core - Optimize hasHeaders to not create headers map if not needed. (#20605)
1 parent 949378a commit ee1c431

File tree

10 files changed

+69
-2
lines changed

10 files changed

+69
-2
lines changed

components/camel-irc/src/main/java/org/apache/camel/component/irc/IrcMessage.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,11 @@ public IrcMessage newInstance() {
131131
return new IrcMessage(getCamelContext());
132132
}
133133

134+
@Override
135+
protected boolean isPopulateHeadersSupported() {
136+
return true;
137+
}
138+
134139
@Override
135140
protected void populateInitialHeaders(Map<String, Object> map) {
136141
map.put(IrcConstants.IRC_MESSAGE_TYPE, messageType);

components/camel-jms/src/main/java/org/apache/camel/component/jms/JmsMessage.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -240,6 +240,11 @@ protected Object createBody() {
240240
return null;
241241
}
242242

243+
@Override
244+
protected boolean isPopulateHeadersSupported() {
245+
return true;
246+
}
247+
243248
@Override
244249
protected void populateInitialHeaders(Map<String, Object> map) {
245250
if (jmsMessage != null && map != null) {

components/camel-mail/src/main/java/org/apache/camel/component/mail/MailMessage.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,11 @@ protected Object createBody() {
9595
return null;
9696
}
9797

98+
@Override
99+
protected boolean isPopulateHeadersSupported() {
100+
return true;
101+
}
102+
98103
@Override
99104
protected void populateInitialHeaders(Map<String, Object> map) {
100105
if (mailMessage != null) {

components/camel-quartz/src/main/java/org/apache/camel/component/quartz/QuartzMessage.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
* A Camel message to be created upon each scheduled job execution.
2828
*/
2929
public class QuartzMessage extends DefaultMessage {
30+
3031
private final JobExecutionContext jobExecutionContext;
3132

3233
public QuartzMessage(Exchange exchange, JobExecutionContext jobExecutionContext) {
@@ -40,6 +41,11 @@ public JobExecutionContext getJobExecutionContext() {
4041
return jobExecutionContext;
4142
}
4243

44+
@Override
45+
protected boolean isPopulateHeadersSupported() {
46+
return true;
47+
}
48+
4349
@Override
4450
protected void populateInitialHeaders(Map<String, Object> map) {
4551
super.populateInitialHeaders(map);

components/camel-sjms/src/main/java/org/apache/camel/component/sjms/SjmsMessage.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,11 @@ protected Object createBody() {
262262
return null;
263263
}
264264

265+
@Override
266+
protected boolean isPopulateHeadersSupported() {
267+
return true;
268+
}
269+
265270
@Override
266271
protected void populateInitialHeaders(Map<String, Object> map) {
267272
if (jmsMessage != null && map != null) {

components/camel-xmpp/src/main/java/org/apache/camel/component/xmpp/XmppMessage.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
* Represents a {@link org.apache.camel.Message} for working with XMPP
3030
*/
3131
public class XmppMessage extends DefaultMessage {
32+
3233
private Stanza xmppPacket;
3334

3435
public XmppMessage(CamelContext camelContext) {
@@ -89,6 +90,11 @@ protected Object createBody() {
8990
return null;
9091
}
9192

93+
@Override
94+
protected boolean isPopulateHeadersSupported() {
95+
return true;
96+
}
97+
9298
@Override
9399
protected void populateInitialHeaders(Map<String, Object> map) {
94100
if (xmppPacket != null) {

core/camel-core/src/test/java/org/apache/camel/impl/DefaultMessageHeaderTest.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,16 @@ protected void setUp() {
3535
camelContext.start();
3636
}
3737

38+
@Test
39+
public void testHasHeaders() {
40+
Message msg = new DefaultMessage(camelContext);
41+
assertFalse(msg.hasHeaders());
42+
43+
msg.setHeader("foo", "cheese");
44+
assertTrue(msg.hasHeaders());
45+
assertEquals("cheese", msg.getHeader("foo"));
46+
}
47+
3848
@Test
3949
public void testLookupCaseAgnostic() {
4050
Message msg = new DefaultMessage(camelContext);

core/camel-core/src/test/java/org/apache/camel/issues/PopulateInitialHeadersFailedIssueTest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,11 @@ public MyFaultMessage(Exchange exchange) {
6565
super(exchange);
6666
}
6767

68+
@Override
69+
protected boolean isPopulateHeadersSupported() {
70+
return true;
71+
}
72+
6873
@Override
6974
protected void populateInitialHeaders(Map<String, Object> map) {
7075
throw new IllegalArgumentException("Forced headers error");

core/camel-support/src/main/java/org/apache/camel/support/DefaultMessage.java

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -287,11 +287,11 @@ public void setHeaders(Map<String, Object> headers) {
287287

288288
@Override
289289
public boolean hasHeaders() {
290-
if (headers == null) {
290+
if (headers == null && isPopulateHeadersSupported()) {
291291
// force creating headers
292292
headers = createHeaders();
293293
}
294-
return !headers.isEmpty();
294+
return headers != null && !headers.isEmpty();
295295
}
296296

297297
@Override
@@ -328,6 +328,13 @@ protected void populateInitialHeaders(Map<String, Object> map) {
328328
// do nothing by default
329329
}
330330

331+
/**
332+
* Whether subclasses need to populate headers when creating message.
333+
*/
334+
protected boolean isPopulateHeadersSupported() {
335+
return false;
336+
}
337+
331338
/**
332339
* Returns true if the headers have been mutated in some way
333340
*/

docs/user-manual/modules/ROOT/pages/camel-4x-upgrade-guide-4_17.adoc

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,19 @@ from("direct:start")
3636
.to("mock:result");
3737
----
3838

39+
==== Custom Camel components
40+
41+
Custom components which has a custom message implementation by extending `DefaultMessage`, which rely on the `populateInitialHeaders`
42+
to initialize headers must now add the following method:
43+
44+
[source,java]
45+
----
46+
@Override
47+
protected boolean isPopulateHeadersSupported() {
48+
return true;
49+
}
50+
----
51+
3952
=== camel-jbang
4053

4154
The `camel-kamelets-catalog` JAR is now downloaded on-demand.

0 commit comments

Comments
 (0)