From 0a6ba19b75550de05865d59928ef5cc12cb3d87d Mon Sep 17 00:00:00 2001 From: Gary Russell Date: Fri, 20 Jul 2012 12:35:50 -0400 Subject: [PATCH] AMQP-256 Add channel-transacted to SLC Namespace Namespace support for SimpleListenerContainer was missing channel-transacted attribute. AMQP-256 Polishing Add cross check - disallow a transacted channel when acknowlege='NONE' (autoack in Rabbit-speak). --- .../rabbit/config/RabbitNamespaceUtils.java | 12 +++++++ .../amqp/rabbit/config/spring-rabbit-1.1.xsd | 8 +++++ .../config/ListenerContainerParserTests.java | 25 ++++++++++++++ .../ListenerContainerParserTests-context.xml | 4 +++ ...tenerContainerParserTests-fail-context.xml | 33 +++++++++++++++++++ 5 files changed, 82 insertions(+) create mode 100644 spring-rabbit/src/test/resources/org/springframework/amqp/rabbit/config/ListenerContainerParserTests-fail-context.xml diff --git a/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/config/RabbitNamespaceUtils.java b/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/config/RabbitNamespaceUtils.java index cc7324c4..e2ca73e1 100644 --- a/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/config/RabbitNamespaceUtils.java +++ b/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/config/RabbitNamespaceUtils.java @@ -52,6 +52,8 @@ public class RabbitNamespaceUtils { private static final String PREFETCH_ATTRIBUTE = "prefetch"; + private static final String CHANNEL_TRANSACTED_ATTRIBUTE = "channel-transacted"; + private static final String TRANSACTION_SIZE_ATTRIBUTE = "transaction-size"; private static final String PHASE_ATTRIBUTE = "phase"; @@ -110,6 +112,16 @@ public class RabbitNamespaceUtils { containerDef.getPropertyValues().add("prefetchCount", new TypedStringValue(prefetch)); } + String channelTransacted = containerEle.getAttribute(CHANNEL_TRANSACTED_ATTRIBUTE); + if (StringUtils.hasText(channelTransacted)) { + // Note: a placeholder will pass this test, but if it resolves to true, it will be caught during container initialization + if (acknowledgeMode.isAutoAck() && channelTransacted.equalsIgnoreCase("true")) { + parserContext.getReaderContext().error( + "Listener Container - cannot set channel-transacted with acknowledge='NONE'", containerEle); + } + containerDef.getPropertyValues().add("channelTransacted", new TypedStringValue(channelTransacted)); + } + String transactionSize = containerEle.getAttribute(TRANSACTION_SIZE_ATTRIBUTE); if (StringUtils.hasText(transactionSize)) { containerDef.getPropertyValues().add("txSize", new TypedStringValue(transactionSize)); diff --git a/spring-rabbit/src/main/resources/org/springframework/amqp/rabbit/config/spring-rabbit-1.1.xsd b/spring-rabbit/src/main/resources/org/springframework/amqp/rabbit/config/spring-rabbit-1.1.xsd index 07ed22ba..a78aaaa5 100644 --- a/spring-rabbit/src/main/resources/org/springframework/amqp/rabbit/config/spring-rabbit-1.1.xsd +++ b/spring-rabbit/src/main/resources/org/springframework/amqp/rabbit/config/spring-rabbit-1.1.xsd @@ -605,6 +605,14 @@ + + + + + + + + + diff --git a/spring-rabbit/src/test/resources/org/springframework/amqp/rabbit/config/ListenerContainerParserTests-fail-context.xml b/spring-rabbit/src/test/resources/org/springframework/amqp/rabbit/config/ListenerContainerParserTests-fail-context.xml new file mode 100644 index 00000000..b4bb0490 --- /dev/null +++ b/spring-rabbit/src/test/resources/org/springframework/amqp/rabbit/config/ListenerContainerParserTests-fail-context.xml @@ -0,0 +1,33 @@ + + + + + + + + + + + + + + + + + + + + + + + + + +