Skip to content

Commit 4365eae

Browse files
garyrussellartembilan
authored andcommitted
GH-2770: AbstractMessageSource EvaluationContext
Fixes #2770 Only create an evaluation context for header expressions if we actually have header expressions. * Some `AbstractMessageSource` refactoring to avoid unnecessary code and some optimization **Cherry-pick to 5.1.x**
1 parent d2e974a commit 4365eae

File tree

1 file changed

+34
-41
lines changed

1 file changed

+34
-41
lines changed

spring-integration-core/src/main/java/org/springframework/integration/endpoint/AbstractMessageSource.java

+34-41
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
package org.springframework.integration.endpoint;
1818

19-
import java.util.Collections;
19+
import java.util.HashMap;
2020
import java.util.Map;
2121
import java.util.concurrent.atomic.AtomicLong;
2222

@@ -33,7 +33,6 @@
3333
import org.springframework.integration.util.AbstractExpressionEvaluator;
3434
import org.springframework.lang.Nullable;
3535
import org.springframework.messaging.Message;
36-
import org.springframework.messaging.MessagingException;
3736
import org.springframework.util.CollectionUtils;
3837

3938
/**
@@ -52,7 +51,7 @@ public abstract class AbstractMessageSource<T> extends AbstractExpressionEvaluat
5251

5352
private final ManagementOverrides managementOverrides = new ManagementOverrides();
5453

55-
private volatile Map<String, Expression> headerExpressions = Collections.emptyMap();
54+
private Map<String, Expression> headerExpressions;
5655

5756
private String beanName;
5857

@@ -68,9 +67,10 @@ public abstract class AbstractMessageSource<T> extends AbstractExpressionEvaluat
6867

6968
private CounterFacade receiveCounter;
7069

71-
public void setHeaderExpressions(Map<String, Expression> headerExpressions) {
72-
this.headerExpressions = (headerExpressions != null)
73-
? headerExpressions : Collections.emptyMap();
70+
public void setHeaderExpressions(@Nullable Map<String, Expression> headerExpressions) {
71+
if (!CollectionUtils.isEmpty(headerExpressions)) {
72+
this.headerExpressions = new HashMap<>(headerExpressions);
73+
}
7474
}
7575

7676
@Override
@@ -162,68 +162,61 @@ public final Message<T> receive() {
162162

163163
@SuppressWarnings("unchecked")
164164
protected Message<T> buildMessage(Object result) {
165-
Message<T> message = null;
165+
Message<?> message = null;
166166
Map<String, Object> headers = evaluateHeaders();
167-
if (result instanceof AbstractIntegrationMessageBuilder) {
167+
if (result instanceof AbstractIntegrationMessageBuilder<?>) {
168168
if (!CollectionUtils.isEmpty(headers)) {
169-
((AbstractIntegrationMessageBuilder<T>) result).copyHeaders(headers);
169+
((AbstractIntegrationMessageBuilder<?>) result).copyHeaders(headers);
170170
}
171-
message = ((AbstractIntegrationMessageBuilder<T>) result).build();
171+
message = ((AbstractIntegrationMessageBuilder<?>) result).build();
172172
}
173173
else if (result instanceof Message<?>) {
174-
try {
175-
message = (Message<T>) result;
176-
}
177-
catch (Exception e) {
178-
throw new MessagingException("MessageSource returned unexpected type.", e);
179-
}
174+
message = (Message<?>) result;
180175
if (!CollectionUtils.isEmpty(headers)) {
181176
// create a new Message from this one in order to apply headers
182-
message = getMessageBuilderFactory()
183-
.fromMessage(message)
184-
.copyHeaders(headers)
185-
.build();
177+
message =
178+
getMessageBuilderFactory()
179+
.fromMessage(message)
180+
.copyHeaders(headers)
181+
.build();
186182
}
187183
}
188184
else if (result != null) {
189-
T payload;
190-
try {
191-
payload = (T) result;
192-
}
193-
catch (Exception e) {
194-
throw new MessagingException("MessageSource returned unexpected type.", e);
195-
}
196-
message = getMessageBuilderFactory()
197-
.withPayload(payload)
198-
.copyHeaders(headers)
199-
.build();
185+
message =
186+
getMessageBuilderFactory()
187+
.withPayload(result)
188+
.copyHeaders(headers)
189+
.build();
200190
}
201191
if (this.countsEnabled && message != null) {
202192
if (this.metricsCaptor != null) {
203193
incrementReceiveCounter();
204194
}
205195
this.messageCount.incrementAndGet();
206196
}
207-
return message;
197+
return (Message<T>) message;
208198
}
209199

210200
private void incrementReceiveCounter() {
211201
if (this.receiveCounter == null) {
212202
this.receiveCounter = this.metricsCaptor.counterBuilder(RECEIVE_COUNTER_NAME)
213-
.tag("name", getComponentName() == null ? "unknown" : getComponentName())
214-
.tag("type", "source")
215-
.tag("result", "success")
216-
.tag("exception", "none")
217-
.description("Messages received")
218-
.build();
203+
.tag("name", getComponentName() == null ? "unknown" : getComponentName())
204+
.tag("type", "source")
205+
.tag("result", "success")
206+
.tag("exception", "none")
207+
.description("Messages received")
208+
.build();
219209
}
220210
this.receiveCounter.increment();
221211
}
222212

213+
@Nullable
223214
private Map<String, Object> evaluateHeaders() {
224-
return ExpressionEvalMap.from(this.headerExpressions)
225-
.usingEvaluationContext(getEvaluationContext())
226-
.build();
215+
return CollectionUtils.isEmpty(this.headerExpressions)
216+
? null
217+
: ExpressionEvalMap.from(this.headerExpressions)
218+
.usingEvaluationContext(getEvaluationContext())
219+
.build();
227220
}
228221

229222
/**

0 commit comments

Comments
 (0)