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:
@@ -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));
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user