diff --git a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binder/DefaultBinderFactory.java b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binder/DefaultBinderFactory.java index 8c5038f90..07809f103 100644 --- a/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binder/DefaultBinderFactory.java +++ b/spring-cloud-stream/src/main/java/org/springframework/cloud/stream/binder/DefaultBinderFactory.java @@ -16,13 +16,14 @@ package org.springframework.cloud.stream.binder; +import java.util.AbstractMap.SimpleImmutableEntry; import java.util.ArrayList; -import java.util.Arrays; import java.util.Collection; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import org.springframework.beans.factory.DisposableBean; @@ -51,11 +52,11 @@ public class DefaultBinderFactory implements BinderFactory, DisposableBean, Appl private final Map binderConfigurations; - private final Map binderInstanceCache = new HashMap<>(); + private final Map, ConfigurableApplicationContext>> binderInstanceCache = new HashMap<>(); private volatile ConfigurableApplicationContext context; - private Map defaultBinderForBindingTargetType = new HashMap<>(); + private final Map defaultBinderForBindingTargetType = new HashMap<>(); private Collection listeners; @@ -85,10 +86,7 @@ public class DefaultBinderFactory implements BinderFactory, DisposableBean, Appl @Override public void destroy() throws Exception { - for (Map.Entry entry : this.binderInstanceCache.entrySet()) { - BinderInstanceHolder binderInstanceHolder = entry.getValue(); - binderInstanceHolder.getBinderContext().close(); - } + this.binderInstanceCache.values().stream().map(e -> e.getValue()).forEach(ctx -> ctx.close()); this.defaultBinderForBindingTargetType.clear(); } @@ -163,10 +161,8 @@ public class DefaultBinderFactory implements BinderFactory, DisposableBean, Appl String defaultDomain = environment != null ? environment.getProperty("spring.jmx.default-domain.") : ""; args.add("--spring.jmx.default-domain=" + defaultDomain + "binder." + configurationName); args.add("--spring.main.applicationContextClass=" + AnnotationConfigApplicationContext.class.getName()); - List> configurationClasses = new ArrayList>( - Arrays.asList(binderType.getConfigurationClasses())); SpringApplicationBuilder springApplicationBuilder = new SpringApplicationBuilder() - .sources(configurationClasses.toArray(new Class[] {})) + .sources(binderType.getConfigurationClasses()) .bannerMode(Mode.OFF) .logStartupInfo(false) .web(WebApplicationType.NONE); @@ -194,9 +190,9 @@ public class DefaultBinderFactory implements BinderFactory, DisposableBean, Appl binderFactoryListener.afterBinderContextInitialized(configurationName, binderProducingContext); } } - this.binderInstanceCache.put(configurationName, new BinderInstanceHolder(binder, binderProducingContext)); + this.binderInstanceCache.put(configurationName, new SimpleImmutableEntry<>(binder, binderProducingContext)); } - return (Binder) this.binderInstanceCache.get(configurationName).getBinderInstance(); + return (Binder) this.binderInstanceCache.get(configurationName).getKey(); } /** @@ -217,28 +213,4 @@ public class DefaultBinderFactory implements BinderFactory, DisposableBean, Appl void afterBinderContextInitialized(String configurationName, ConfigurableApplicationContext binderContext); } - - /** - * Utility class for storing {@link Binder} instances, along with their associated - * contexts. - */ - private static final class BinderInstanceHolder { - - private final Binder binderInstance; - - private final ConfigurableApplicationContext binderContext; - - private BinderInstanceHolder(Binder binderInstance, ConfigurableApplicationContext binderContext) { - this.binderInstance = binderInstance; - this.binderContext = binderContext; - } - - public Binder getBinderInstance() { - return this.binderInstance; - } - - public ConfigurableApplicationContext getBinderContext() { - return this.binderContext; - } - } }