From 6019328cc73cc61ed94dbab578442bd4c9e698cf Mon Sep 17 00:00:00 2001 From: dileep Kumar Somajohassula Date: Sat, 13 Jun 2026 09:59:07 -0500 Subject: [PATCH] Replace HashMap with ConcurrentHashMap for producer and consumer binding registries, and use CopyOnWriteArrayList for consumer binding lists to prevent concurrent modification issues during bind, unbind operations and concurrent iteration. --- .../cloud/stream/binding/BindingService.java | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/core/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binding/BindingService.java b/core/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binding/BindingService.java index fac41c321d..512d2255a0 100644 --- a/core/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binding/BindingService.java +++ b/core/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binding/BindingService.java @@ -20,10 +20,11 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; -import java.util.HashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.locks.ReentrantLock; import java.util.stream.Stream; @@ -76,9 +77,9 @@ public class BindingService { private final BindingServiceProperties bindingServiceProperties; - private final Map> producerBindings = new HashMap<>(); + private final Map> producerBindings = new ConcurrentHashMap<>(); - private final Map>> consumerBindings = new HashMap<>(); + private final Map>> consumerBindings = new ConcurrentHashMap<>(); private final TaskScheduler taskScheduler; @@ -170,7 +171,7 @@ public Collection> bindConsumer(T input, String inputName) { } } bindings = Collections.unmodifiableCollection(bindings); - this.consumerBindings.put(inputName, new ArrayList<>(bindings)); + this.consumerBindings.put(inputName, new CopyOnWriteArrayList<>(bindings)); return bindings; } @@ -194,7 +195,7 @@ public Binding doBindConsumer(T input, String inputName, e.getCause() == null ? e.toString() : e.getCause().getMessage(), consumerProperties, true, this.objectMapper); rescheduleConsumerBinding(input, inputName, binder, consumerProperties, target, late, e); - this.consumerBindings.put(inputName, Collections.singletonList(late)); + this.consumerBindings.put(inputName, new CopyOnWriteArrayList<>(Collections.singletonList(late))); return late; } }