From 633936e0a8a24a633165ae8e15c0b1f93c70e6e9 Mon Sep 17 00:00:00 2001 From: Gary Russell Date: Mon, 27 Sep 2021 12:09:38 -0400 Subject: [PATCH] GH-1732: Fix Listener Container Parser Resolves https://github.com/spring-projects/spring-amqp/issues/1372 Do not split `queue-names` in the parser - leave it to Spring's type converter. Also support SpEL in `queues`; a more elegant solution would require major refactoring of the parser; so this is just a compromise. **cherry-pick to 2.3.x, 2.2.x** --- .../config/ListenerContainerParser.java | 24 +++++++++---------- ...stenerContainerPlaceholderParserTests.java | 19 ++++++++++++++- .../annotation/rabbit-listener.properties | 2 ++ ...ontainerPlaceholderParserTests-context.xml | 10 ++++++++ 4 files changed, 42 insertions(+), 13 deletions(-) diff --git a/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/config/ListenerContainerParser.java b/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/config/ListenerContainerParser.java index d574c87657..0fb64b643c 100644 --- a/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/config/ListenerContainerParser.java +++ b/spring-rabbit/src/main/java/org/springframework/amqp/rabbit/config/ListenerContainerParser.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2019 the original author or authors. + * Copyright 2002-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -179,21 +179,21 @@ private void parseListener(Element listenerEle, Element containerEle, ParserCont String queueNames = listenerEle.getAttribute(QUEUE_NAMES_ATTRIBUTE); if (StringUtils.hasText(queueNames)) { - String[] names = StringUtils.commaDelimitedListToStringArray(queueNames); - List values = new ManagedList(); - for (int i = 0; i < names.length; i++) { - values.add(new TypedStringValue(names[i].trim())); - } - containerDef.getPropertyValues().add("queueNames", values); + containerDef.getPropertyValues().add("queueNames", queueNames); } String queues = listenerEle.getAttribute(QUEUES_ATTRIBUTE); if (StringUtils.hasText(queues)) { - String[] names = StringUtils.commaDelimitedListToStringArray(queues); - List values = new ManagedList(); - for (int i = 0; i < names.length; i++) { - values.add(new RuntimeBeanReference(names[i].trim())); + if (queues.startsWith("#{")) { + containerDef.getPropertyValues().add("queues", queues); + } + else { + String[] names = StringUtils.commaDelimitedListToStringArray(queues); + List values = new ManagedList(); + for (int i = 0; i < names.length; i++) { + values.add(new RuntimeBeanReference(names[i].trim())); + } + containerDef.getPropertyValues().add("queues", values); } - containerDef.getPropertyValues().add("queues", values); } ManagedMap args = new ManagedMap(); diff --git a/spring-rabbit/src/test/java/org/springframework/amqp/rabbit/config/ListenerContainerPlaceholderParserTests.java b/spring-rabbit/src/test/java/org/springframework/amqp/rabbit/config/ListenerContainerPlaceholderParserTests.java index 5baf91f756..ebbdd8a5ab 100644 --- a/spring-rabbit/src/test/java/org/springframework/amqp/rabbit/config/ListenerContainerPlaceholderParserTests.java +++ b/spring-rabbit/src/test/java/org/springframework/amqp/rabbit/config/ListenerContainerPlaceholderParserTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2010-2019 the original author or authors. + * Copyright 2010-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -82,4 +82,21 @@ public void testParseWithQueueNames() throws Exception { assertThat(Arrays.asList(container.getQueueNames()).toString()).isEqualTo("[foo, " + queue.getName() + "]"); } + @Test + public void commasInPropertyNames() { + SimpleMessageListenerContainer container = this.context.getBean("commaProps1", + SimpleMessageListenerContainer.class); + assertThat(container.getQueueNames()).containsExactly("foo", "bar"); + } + + @Test + public void commasInPropertyQueues() { + SimpleMessageListenerContainer container = this.context.getBean("commaProps2", + SimpleMessageListenerContainer.class); + String[] queueNames = container.getQueueNames(); + assertThat(queueNames).hasSize(2); + assertThat(queueNames[0]).isEqualTo("foo"); + assertThat(queueNames[1]).startsWith("spring.gen"); + } + } diff --git a/spring-rabbit/src/test/resources/org/springframework/amqp/rabbit/annotation/rabbit-listener.properties b/spring-rabbit/src/test/resources/org/springframework/amqp/rabbit/annotation/rabbit-listener.properties index 991af5e15b..61aa68f57f 100644 --- a/spring-rabbit/src/test/resources/org/springframework/amqp/rabbit/annotation/rabbit-listener.properties +++ b/spring-rabbit/src/test/resources/org/springframework/amqp/rabbit/annotation/rabbit-listener.properties @@ -4,3 +4,5 @@ rabbit.listener.queue=queue1 rabbit.listener.priority=34 rabbit.listener.responseRoutingKey=routing-123 rabbit.listener.admin=rabbitAdmin + +foo.and.bar=foo, bar diff --git a/spring-rabbit/src/test/resources/org/springframework/amqp/rabbit/config/ListenerContainerPlaceholderParserTests-context.xml b/spring-rabbit/src/test/resources/org/springframework/amqp/rabbit/config/ListenerContainerPlaceholderParserTests-context.xml index 35c7c46591..725bdb42c8 100644 --- a/spring-rabbit/src/test/resources/org/springframework/amqp/rabbit/config/ListenerContainerPlaceholderParserTests-context.xml +++ b/spring-rabbit/src/test/resources/org/springframework/amqp/rabbit/config/ListenerContainerPlaceholderParserTests-context.xml @@ -11,6 +11,7 @@ 5 1 false + foo, bar @@ -28,4 +29,13 @@ + + + + + + + +