GH-2770: AbstractMessageSource EvaluationContext

Fixes https://github.com/spring-projects/spring-integration/issues/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**
This commit is contained in:
Gary Russell
2019-02-28 11:55:11 -05:00
committed by Artem Bilan
parent cb1b1c81f1
commit 298d10ee40

View File

@@ -16,7 +16,7 @@
package org.springframework.integration.endpoint;
import java.util.Collections;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.atomic.AtomicLong;
@@ -33,7 +33,6 @@ import org.springframework.integration.support.management.metrics.MetricsCaptor;
import org.springframework.integration.util.AbstractExpressionEvaluator;
import org.springframework.lang.Nullable;
import org.springframework.messaging.Message;
import org.springframework.messaging.MessagingException;
import org.springframework.util.CollectionUtils;
/**
@@ -52,7 +51,7 @@ public abstract class AbstractMessageSource<T> extends AbstractExpressionEvaluat
private final ManagementOverrides managementOverrides = new ManagementOverrides();
private volatile Map<String, Expression> headerExpressions = Collections.emptyMap();
private Map<String, Expression> headerExpressions;
private String beanName;
@@ -68,9 +67,10 @@ public abstract class AbstractMessageSource<T> extends AbstractExpressionEvaluat
private CounterFacade receiveCounter;
public void setHeaderExpressions(Map<String, Expression> headerExpressions) {
this.headerExpressions = (headerExpressions != null)
? headerExpressions : Collections.emptyMap();
public void setHeaderExpressions(@Nullable Map<String, Expression> headerExpressions) {
if (!CollectionUtils.isEmpty(headerExpressions)) {
this.headerExpressions = new HashMap<>(headerExpressions);
}
}
@Override
@@ -162,41 +162,31 @@ public abstract class AbstractMessageSource<T> extends AbstractExpressionEvaluat
@SuppressWarnings("unchecked")
protected Message<T> buildMessage(Object result) {
Message<T> message = null;
Message<?> message = null;
Map<String, Object> headers = evaluateHeaders();
if (result instanceof AbstractIntegrationMessageBuilder) {
if (result instanceof AbstractIntegrationMessageBuilder<?>) {
if (!CollectionUtils.isEmpty(headers)) {
((AbstractIntegrationMessageBuilder<T>) result).copyHeaders(headers);
((AbstractIntegrationMessageBuilder<?>) result).copyHeaders(headers);
}
message = ((AbstractIntegrationMessageBuilder<T>) result).build();
message = ((AbstractIntegrationMessageBuilder<?>) result).build();
}
else if (result instanceof Message<?>) {
try {
message = (Message<T>) result;
}
catch (Exception e) {
throw new MessagingException("MessageSource returned unexpected type.", e);
}
message = (Message<?>) result;
if (!CollectionUtils.isEmpty(headers)) {
// create a new Message from this one in order to apply headers
message = getMessageBuilderFactory()
.fromMessage(message)
.copyHeaders(headers)
.build();
message =
getMessageBuilderFactory()
.fromMessage(message)
.copyHeaders(headers)
.build();
}
}
else if (result != null) {
T payload;
try {
payload = (T) result;
}
catch (Exception e) {
throw new MessagingException("MessageSource returned unexpected type.", e);
}
message = getMessageBuilderFactory()
.withPayload(payload)
.copyHeaders(headers)
.build();
message =
getMessageBuilderFactory()
.withPayload(result)
.copyHeaders(headers)
.build();
}
if (this.countsEnabled && message != null) {
if (this.metricsCaptor != null) {
@@ -204,26 +194,29 @@ public abstract class AbstractMessageSource<T> extends AbstractExpressionEvaluat
}
this.messageCount.incrementAndGet();
}
return message;
return (Message<T>) message;
}
private void incrementReceiveCounter() {
if (this.receiveCounter == null) {
this.receiveCounter = this.metricsCaptor.counterBuilder(RECEIVE_COUNTER_NAME)
.tag("name", getComponentName() == null ? "unknown" : getComponentName())
.tag("type", "source")
.tag("result", "success")
.tag("exception", "none")
.description("Messages received")
.build();
.tag("name", getComponentName() == null ? "unknown" : getComponentName())
.tag("type", "source")
.tag("result", "success")
.tag("exception", "none")
.description("Messages received")
.build();
}
this.receiveCounter.increment();
}
@Nullable
private Map<String, Object> evaluateHeaders() {
return ExpressionEvalMap.from(this.headerExpressions)
.usingEvaluationContext(getEvaluationContext())
.build();
return CollectionUtils.isEmpty(this.headerExpressions)
? null
: ExpressionEvalMap.from(this.headerExpressions)
.usingEvaluationContext(getEvaluationContext())
.build();
}
/**