GH-251: RKExpression interceptor improvements

Resolves https://github.com/spring-cloud/spring-cloud-stream-binder-rabbit/issues/251

We apply the interceptor only if the expression contains `payload` but the interceptor
is needed if the expression refers to the complete `Message` (`#root` or `#this`).
This commit is contained in:
Gary Russell
2019-07-30 15:42:36 -04:00
parent 6915e0b921
commit d9b776944b
2 changed files with 10 additions and 8 deletions

View File

@@ -23,6 +23,7 @@ import java.util.Arrays;
import java.util.List;
import java.util.Map;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.regex.Pattern;
import com.rabbitmq.client.AMQP;
import com.rabbitmq.client.Envelope;
@@ -141,6 +142,8 @@ public class RabbitMessageChannelBinder extends
}
};
private static final Pattern interceptorNeededPattern = Pattern.compile("(payload|#root|#this)");
// @checkstyle:on
private final RabbitProperties rabbitProperties;
@@ -386,13 +389,12 @@ public class RabbitMessageChannelBinder extends
}
}
private boolean expressionInterceptorNeeded(
RabbitProducerProperties extendedProperties) {
return extendedProperties.getRoutingKeyExpression() != null
&& extendedProperties.getRoutingKeyExpression().getExpressionString()
.contains("payload")
|| (extendedProperties.getDelayExpression() != null && extendedProperties
.getDelayExpression().getExpressionString().contains("payload"));
private boolean expressionInterceptorNeeded(RabbitProducerProperties extendedProperties) {
Expression rkExpression = extendedProperties.getRoutingKeyExpression();
Expression delayExpression = extendedProperties.getDelayExpression();
return (rkExpression != null && interceptorNeededPattern.matcher(rkExpression.getExpressionString()).find())
|| (delayExpression != null
&& interceptorNeededPattern.matcher(delayExpression.getExpressionString()).find());
}
private void checkConnectionFactoryIsErrorCapable() {

View File

@@ -1631,7 +1631,7 @@ public class RabbitBinderTests extends
RabbitTestBinder binder = getBinder();
ExtendedProducerProperties<RabbitProducerProperties> producerProperties = createProducerProperties();
producerProperties.getExtension().setRoutingKeyExpression(
spelExpressionParser.parseExpression("payload.field"));
spelExpressionParser.parseExpression("#root.getPayload().field"));
// requires delayed message exchange plugin; tested locally
// producerProperties.getExtension().setDelayedExchange(true);
producerProperties.getExtension()