From 3e3a4089e9f8a83b9ec5eff3b36fdb76a563f3e8 Mon Sep 17 00:00:00 2001 From: Baqirrizvidev <114152937+Baqirrizvidev@users.noreply.github.com> Date: Thu, 28 May 2026 23:54:21 +0530 Subject: [PATCH 1/2] style: modernize stream collection in ConfigurationChangeDetector - Replace obsolete .collect(Collectors.toList()) with standard Java 16+ .toList() - Remove unused java.util.stream.Collectors import --- .../config/reload/ConfigurationChangeDetector.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/config/reload/ConfigurationChangeDetector.java b/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/config/reload/ConfigurationChangeDetector.java index 52c1f12f74..bc151051c4 100644 --- a/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/config/reload/ConfigurationChangeDetector.java +++ b/spring-cloud-aws-autoconfigure/src/main/java/io/awspring/cloud/autoconfigure/config/reload/ConfigurationChangeDetector.java @@ -19,7 +19,6 @@ import java.util.Arrays; import java.util.List; import java.util.Objects; -import java.util.stream.Collectors; import org.apache.commons.logging.LogFactory; import org.springframework.core.env.ConfigurableEnvironment; import org.springframework.core.env.EnumerablePropertySource; @@ -94,7 +93,7 @@ protected List locateMapPropertySources(ConfigurableEnvironment environment) return environment.getPropertySources().stream() .filter(it -> (it.getClass().isAssignableFrom(propertySourceClass))).map(it -> (T) it) - .collect(Collectors.toList()); + .toList(); } public Class getPropertySourceClass() { From 533226eecb700fac5ccfa0bcdcbf42e7804b1802 Mon Sep 17 00:00:00 2001 From: Baqirrizvidev <114152937+Baqirrizvidev@users.noreply.github.com> Date: Fri, 29 May 2026 10:20:13 +0530 Subject: [PATCH 2/2] fix(sqs): prevent ConcurrentModificationException on container stop When an SQS message listener container is stopped, AbstractPollingMessageSource.stop() iterates over this.pollingFutures to cancel active polls. Each future has a whenComplete callback registered in managePollingFuture that synchronously/concurrently removes itself from the pollingFutures collection. Iterating over the collection while elements are being removed throws a ConcurrentModificationException. This commit prevents the exception by taking a shallow snapshot copy of the pollingFutures collection before iterating and cancelling the futures. Fixes #1594 --- .../cloud/sqs/listener/source/AbstractPollingMessageSource.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/spring-cloud-aws-sqs/src/main/java/io/awspring/cloud/sqs/listener/source/AbstractPollingMessageSource.java b/spring-cloud-aws-sqs/src/main/java/io/awspring/cloud/sqs/listener/source/AbstractPollingMessageSource.java index 91b7141207..4801ab3f74 100644 --- a/spring-cloud-aws-sqs/src/main/java/io/awspring/cloud/sqs/listener/source/AbstractPollingMessageSource.java +++ b/spring-cloud-aws-sqs/src/main/java/io/awspring/cloud/sqs/listener/source/AbstractPollingMessageSource.java @@ -342,7 +342,7 @@ public void stop() { if (!waitExistingTasksToFinish()) { logger.warn("Tasks did not finish in {} seconds for queue {}, proceeding with shutdown", this.shutdownTimeout.getSeconds(), this.pollingEndpointName); - this.pollingFutures.forEach(pollingFuture -> pollingFuture.cancel(true)); + new ArrayList<>(this.pollingFutures).forEach(pollingFuture -> pollingFuture.cancel(true)); } doStop(); this.acknowledgmentProcessor.stop();