From 298d10ee400c1156834d5f694e7aae0158bfb65a Mon Sep 17 00:00:00 2001 From: Gary Russell Date: Thu, 28 Feb 2019 11:55:11 -0500 Subject: [PATCH] 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** --- .../endpoint/AbstractMessageSource.java | 75 +++++++++---------- 1 file changed, 34 insertions(+), 41 deletions(-) diff --git a/spring-integration-core/src/main/java/org/springframework/integration/endpoint/AbstractMessageSource.java b/spring-integration-core/src/main/java/org/springframework/integration/endpoint/AbstractMessageSource.java index 424cade975..4f92229514 100644 --- a/spring-integration-core/src/main/java/org/springframework/integration/endpoint/AbstractMessageSource.java +++ b/spring-integration-core/src/main/java/org/springframework/integration/endpoint/AbstractMessageSource.java @@ -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 extends AbstractExpressionEvaluat private final ManagementOverrides managementOverrides = new ManagementOverrides(); - private volatile Map headerExpressions = Collections.emptyMap(); + private Map headerExpressions; private String beanName; @@ -68,9 +67,10 @@ public abstract class AbstractMessageSource extends AbstractExpressionEvaluat private CounterFacade receiveCounter; - public void setHeaderExpressions(Map headerExpressions) { - this.headerExpressions = (headerExpressions != null) - ? headerExpressions : Collections.emptyMap(); + public void setHeaderExpressions(@Nullable Map headerExpressions) { + if (!CollectionUtils.isEmpty(headerExpressions)) { + this.headerExpressions = new HashMap<>(headerExpressions); + } } @Override @@ -162,41 +162,31 @@ public abstract class AbstractMessageSource extends AbstractExpressionEvaluat @SuppressWarnings("unchecked") protected Message buildMessage(Object result) { - Message message = null; + Message message = null; Map headers = evaluateHeaders(); - if (result instanceof AbstractIntegrationMessageBuilder) { + if (result instanceof AbstractIntegrationMessageBuilder) { if (!CollectionUtils.isEmpty(headers)) { - ((AbstractIntegrationMessageBuilder) result).copyHeaders(headers); + ((AbstractIntegrationMessageBuilder) result).copyHeaders(headers); } - message = ((AbstractIntegrationMessageBuilder) result).build(); + message = ((AbstractIntegrationMessageBuilder) result).build(); } else if (result instanceof Message) { - try { - message = (Message) 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 extends AbstractExpressionEvaluat } this.messageCount.incrementAndGet(); } - return message; + return (Message) 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 evaluateHeaders() { - return ExpressionEvalMap.from(this.headerExpressions) - .usingEvaluationContext(getEvaluationContext()) - .build(); + return CollectionUtils.isEmpty(this.headerExpressions) + ? null + : ExpressionEvalMap.from(this.headerExpressions) + .usingEvaluationContext(getEvaluationContext()) + .build(); } /**