Skip to content

Commit c55c5c0

Browse files
committed
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 * Fix AssertJ structures in the `MessageListenerContainerLifecycleIntegrationTests`
1 parent 9758552 commit c55c5c0

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
@@ -212,9 +212,14 @@ public void setConcurrency(String concurrency) {
212212
try {
213213
int separatorIndex = concurrency.indexOf('-');
214214
if (separatorIndex != -1) {
215-
setConcurrentConsumers(Integer.parseInt(concurrency.substring(0, separatorIndex)));
216-
setMaxConcurrentConsumers(
217-
Integer.parseInt(concurrency.substring(separatorIndex + 1, concurrency.length())));
215+
int concurrentConsumers = Integer.parseInt(concurrency.substring(0, separatorIndex));
216+
int maxConcurrentConsumers = Integer.parseInt(concurrency.substring(separatorIndex + 1));
217+
Assert.isTrue(maxConcurrentConsumers >= concurrentConsumers,
218+
"'maxConcurrentConsumers' value must be at least 'concurrentConsumers'");
219+
this.concurrentConsumers = 1;
220+
this.maxConcurrentConsumers = null;
221+
setConcurrentConsumers(concurrentConsumers);
222+
setMaxConcurrentConsumers(maxConcurrentConsumers);
218223
}
219224
else {
220225
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
@@ -477,6 +477,16 @@ public void testLongLivingConsumerStoppedProperlyAfterContextClose() throws Exce
477477
((DisposableBean) template.getConnectionFactory()).destroy();
478478
}
479479

480+
@Test
481+
public void testConcurrencyConfiguration() {
482+
SimpleMessageListenerContainer container = new SimpleMessageListenerContainer();
483+
container.setConcurrentConsumers(1);
484+
container.setMaxConcurrentConsumers(1);
485+
container.setConcurrency("2-5");
486+
487+
assertEquals(2, TestUtils.getPropertyValue(container, "concurrentConsumers"));
488+
assertEquals(5, TestUtils.getPropertyValue(container, "maxConcurrentConsumers"));
489+
}
480490

481491
@Configuration
482492
static class LongLiveConsumerConfig {

0 commit comments

Comments
 (0)