GH-1080: SMLC: Fix concurrency configuration order

Fixes https://github.com/spring-projects/spring-amqp/issues/1080

When we have a configuration like this:
```
container.setConcurrentConsumers(1);
container.setMaxConcurrentConsumers(1);
container.setConcurrency("2-5");
```
we fail with an assertion like
`'concurrentConsumers' cannot be more than 'maxConcurrentConsumers'`

* Change the order in the `SimpleMessageListenerContainer.setConcurrency()`
how we populate `maxConcurrentConsumers` and `concurrentConsumers`

**Cherry-pick to 2.1.x and 1.7.x**

* * Reset `concurrentConsumers` and `maxConcurrentConsumers` to their
default before parsing `concurrency` string

* * Validate concurrency values before setting into properties

* * Reset old values and call setters for concurrency bits
This commit is contained in:
Artem Bilan
2019-09-05 08:57:42 -04:00
committed by GitHub
parent e3d825d470
commit 57f7fd53f0
2 changed files with 18 additions and 3 deletions

View File

@@ -217,9 +217,14 @@ public class SimpleMessageListenerContainer extends AbstractMessageListenerConta
try {
int separatorIndex = concurrency.indexOf('-');
if (separatorIndex != -1) {
setConcurrentConsumers(Integer.parseInt(concurrency.substring(0, separatorIndex)));
setMaxConcurrentConsumers(
Integer.parseInt(concurrency.substring(separatorIndex + 1, concurrency.length())));
int concurrentConsumers = Integer.parseInt(concurrency.substring(0, separatorIndex));
int maxConcurrentConsumers = Integer.parseInt(concurrency.substring(separatorIndex + 1));
Assert.isTrue(maxConcurrentConsumers >= concurrentConsumers,
"'maxConcurrentConsumers' value must be at least 'concurrentConsumers'");
this.concurrentConsumers = 1;
this.maxConcurrentConsumers = null;
setConcurrentConsumers(concurrentConsumers);
setMaxConcurrentConsumers(maxConcurrentConsumers);
}
else {
setConcurrentConsumers(Integer.parseInt(concurrency));

View File

@@ -472,6 +472,16 @@ public class MessageListenerContainerLifecycleIntegrationTests {
((DisposableBean) template.getConnectionFactory()).destroy();
}
@Test
public void testConcurrencyConfiguration() {
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
container.setConcurrentConsumers(1);
container.setMaxConcurrentConsumers(1);
container.setConcurrency("2-5");
assertThat(TestUtils.getPropertyValue(container, "concurrentConsumers")).isEqualTo(2);
assertThat(TestUtils.getPropertyValue(container, "maxConcurrentConsumers")).isEqualTo(5);
}
@Configuration
static class LongLiveConsumerConfig {