Skip to content

Commit 57f7fd5

Browse files
authored
GH-1080: SMLC: Fix concurrency configuration order
Fixes #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
1 parent e3d825d commit 57f7fd5

File tree

2 files changed

+18
-3
lines changed

2 files changed

+18
-3
lines changed

spring-rabbit/src/main/java/org/springframework/amqp/rabbit/listener/SimpleMessageListenerContainer.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -217,9 +217,14 @@ public void setConcurrency(String concurrency) {
217217
try {
218218
int separatorIndex = concurrency.indexOf('-');
219219
if (separatorIndex != -1) {
220-
setConcurrentConsumers(Integer.parseInt(concurrency.substring(0, separatorIndex)));
221-
setMaxConcurrentConsumers(
222-
Integer.parseInt(concurrency.substring(separatorIndex + 1, concurrency.length())));
220+
int concurrentConsumers = Integer.parseInt(concurrency.substring(0, separatorIndex));
221+
int maxConcurrentConsumers = Integer.parseInt(concurrency.substring(separatorIndex + 1));
222+
Assert.isTrue(maxConcurrentConsumers >= concurrentConsumers,
223+
"'maxConcurrentConsumers' value must be at least 'concurrentConsumers'");
224+
this.concurrentConsumers = 1;
225+
this.maxConcurrentConsumers = null;
226+
setConcurrentConsumers(concurrentConsumers);
227+
setMaxConcurrentConsumers(maxConcurrentConsumers);
223228
}
224229
else {
225230
setConcurrentConsumers(Integer.parseInt(concurrency));

spring-rabbit/src/test/java/org/springframework/amqp/rabbit/listener/MessageListenerContainerLifecycleIntegrationTests.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -472,6 +472,16 @@ public void testLongLivingConsumerStoppedProperlyAfterContextClose() throws Exce
472472
((DisposableBean) template.getConnectionFactory()).destroy();
473473
}
474474

475+
@Test
476+
public void testConcurrencyConfiguration() {
477+
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
478+
container.setConcurrentConsumers(1);
479+
container.setMaxConcurrentConsumers(1);
480+
container.setConcurrency("2-5");
481+
482+
assertThat(TestUtils.getPropertyValue(container, "concurrentConsumers")).isEqualTo(2);
483+
assertThat(TestUtils.getPropertyValue(container, "maxConcurrentConsumers")).isEqualTo(5);
484+
}
475485

476486
@Configuration
477487
static class LongLiveConsumerConfig {

0 commit comments

Comments
 (0)