diff --git a/core/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binder/DefaultBinderFactory.java b/core/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binder/DefaultBinderFactory.java index 99d82a376..0eae62ed9 100644 --- a/core/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binder/DefaultBinderFactory.java +++ b/core/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binder/DefaultBinderFactory.java @@ -30,6 +30,7 @@ import java.util.Map.Entry; import java.util.Properties; import java.util.Set; +import java.util.concurrent.locks.ReentrantLock; import java.util.stream.Stream; import org.apache.commons.logging.Log; @@ -98,6 +99,8 @@ public class DefaultBinderFactory implements BinderFactory, DisposableBean, Appl private volatile String defaultBinder; + private static final ReentrantLock lock = new ReentrantLock(); + public DefaultBinderFactory(Map binderConfigurations, BinderTypeRegistry binderTypeRegistry, BinderCustomizer binderCustomizer) { this.binderConfigurations = new HashMap<>(binderConfigurations); @@ -142,34 +145,39 @@ public void destroy() { @SuppressWarnings({ "unchecked", "rawtypes" }) @Override + public Binder getBinder(String name, Class bindingTargetType) { + lock.lock(); + try { + String binderName = StringUtils.hasText(name) ? name : this.defaultBinder; - public synchronized Binder getBinder(String name, Class bindingTargetType) { - String binderName = StringUtils.hasText(name) ? name : this.defaultBinder; - - Map binders = this.context == null ? Collections.emptyMap() : this.context.getBeansOfType(Binder.class); - Binder binder; - if (StringUtils.hasText(binderName) && binders.containsKey(binderName)) { - binder = (Binder) this.context.getBean(binderName); - } - else if (binders.size() == 1) { - binder = binders.values().iterator().next(); - } - else if (binders.size() > 1) { - throw new IllegalStateException( + Map binders = this.context == null ? Collections.emptyMap() : this.context.getBeansOfType(Binder.class); + Binder binder; + if (StringUtils.hasText(binderName) && binders.containsKey(binderName)) { + binder = (Binder) this.context.getBean(binderName); + } + else if (binders.size() == 1) { + binder = binders.values().iterator().next(); + } + else if (binders.size() > 1) { + throw new IllegalStateException( "Multiple binders are available, however neither default nor " - + "per-destination binder name is provided. Available binders are " - + binders.keySet()); - } - else { - /* - * This is the fallback to the old bootstrap that relies on spring.binders. - */ - binder = this.doGetBinder(binderName, bindingTargetType); + + "per-destination binder name is provided. Available binders are " + + binders.keySet()); + } + else { + /* + * This is the fallback to the old bootstrap that relies on spring.binders. + */ + binder = this.doGetBinder(binderName, bindingTargetType); + } + if (this.binderCustomizer != null) { + this.binderCustomizer.customize(binder, binderName); + } + return binder; } - if (this.binderCustomizer != null) { - this.binderCustomizer.customize(binder, binderName); + finally { + lock.unlock(); } - return binder; } private Binder doGetBinder(String name, Class bindingTargetType) {