Skip to content

Commit c6429b3

Browse files
author
Ryan Baxter
authored
Close Fabric8 Client When Context Is Stopped (#1780)
1 parent 3c8a9a2 commit c6429b3

File tree

3 files changed

+25
-2
lines changed

3 files changed

+25
-2
lines changed

spring-cloud-kubernetes-commons/src/main/java/org/springframework/cloud/kubernetes/commons/config/ConfigUtils.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636

3737
import org.springframework.boot.BootstrapRegistry;
3838
import org.springframework.boot.ConfigurableBootstrapContext;
39+
import org.springframework.context.ApplicationListener;
3940
import org.springframework.core.env.Environment;
4041
import org.springframework.core.style.ToStringCreator;
4142
import org.springframework.util.CollectionUtils;
@@ -60,6 +61,8 @@ public final class ConfigUtils {
6061
|| sourceName.endsWith("-" + activeProfile + ".yaml")
6162
|| sourceName.endsWith("-" + activeProfile + ".properties");
6263

64+
private static final ApplicationListener<?> NO_OP = (e) -> { };
65+
6366
private ConfigUtils() {
6467
}
6568

@@ -329,17 +332,23 @@ private static Map<String, String> decodeData(Map<String, String> data) {
329332
}
330333

331334
public static <T> void registerSingle(ConfigurableBootstrapContext bootstrapContext, Class<T> cls, T instance,
332-
String name) {
335+
String name, ApplicationListener<?> listener) {
333336
bootstrapContext.registerIfAbsent(cls, BootstrapRegistry.InstanceSupplier.of(instance));
334337
bootstrapContext.addCloseListener(event -> {
335338
if (event.getApplicationContext().getBeanFactory().getSingleton(name) == null) {
336339
event.getApplicationContext()
337340
.getBeanFactory()
338341
.registerSingleton(name, event.getBootstrapContext().get(cls));
342+
event.getApplicationContext().addApplicationListener(listener);
339343
}
340344
});
341345
}
342346

347+
public static <T> void registerSingle(ConfigurableBootstrapContext bootstrapContext, Class<T> cls, T instance,
348+
String name) {
349+
registerSingle(bootstrapContext, cls, instance, name, NO_OP);
350+
}
351+
343352
/**
344353
* append prefix to the keys and return a new Map with the new values.
345354
*/

spring-cloud-kubernetes-fabric8-autoconfig/src/main/java/org/springframework/cloud/kubernetes/fabric8/Fabric8AutoConfiguration.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,13 @@
1818

1919
import java.time.Duration;
2020

21+
import io.fabric8.kubernetes.client.Client;
2122
import io.fabric8.kubernetes.client.Config;
2223
import io.fabric8.kubernetes.client.ConfigBuilder;
2324
import io.fabric8.kubernetes.client.KubernetesClient;
2425
import io.fabric8.kubernetes.client.KubernetesClientBuilder;
2526

27+
import org.springframework.beans.factory.BeanFactoryUtils;
2628
import org.springframework.boot.autoconfigure.AutoConfigureAfter;
2729
import org.springframework.boot.autoconfigure.condition.ConditionalOnCloudPlatform;
2830
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
@@ -31,6 +33,8 @@
3133
import org.springframework.cloud.kubernetes.commons.KubernetesCommonsAutoConfiguration;
3234
import org.springframework.context.annotation.Bean;
3335
import org.springframework.context.annotation.Configuration;
36+
import org.springframework.context.event.ContextClosedEvent;
37+
import org.springframework.context.event.EventListener;
3438

3539
/**
3640
* Auto configuration for Kubernetes.
@@ -117,4 +121,11 @@ public Fabric8PodUtils kubernetesPodUtils(KubernetesClient client) {
117121
return new Fabric8PodUtils(client);
118122
}
119123

124+
@EventListener
125+
void onContextClosed(ContextClosedEvent event) {
126+
// Clean up any open connections from the KubernetesClient when the context is closed
127+
BeanFactoryUtils.beansOfTypeIncludingAncestors(event.getApplicationContext(), KubernetesClient.class).values()
128+
.forEach(Client::close);
129+
}
130+
120131
}

spring-cloud-kubernetes-fabric8-config/src/main/java/org/springframework/cloud/kubernetes/fabric8/config/Fabric8ConfigDataLocationResolver.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
import org.springframework.cloud.kubernetes.commons.config.SecretsConfigProperties;
3535
import org.springframework.cloud.kubernetes.commons.config.SecretsPropertySourceLocator;
3636
import org.springframework.cloud.kubernetes.fabric8.Fabric8AutoConfiguration;
37+
import org.springframework.context.ApplicationListener;
38+
import org.springframework.context.event.ContextClosedEvent;
3739
import org.springframework.core.env.Environment;
3840

3941
import static org.springframework.cloud.kubernetes.commons.config.ConfigUtils.registerSingle;
@@ -90,7 +92,8 @@ private KubernetesClient registerConfigAndClient(ConfigurableBootstrapContext bo
9092
registerSingle(bootstrapContext, Config.class, config, "fabric8Config");
9193

9294
KubernetesClient kubernetesClient = new Fabric8AutoConfiguration().kubernetesClient(config);
93-
registerSingle(bootstrapContext, KubernetesClient.class, kubernetesClient, "configKubernetesClient");
95+
registerSingle(bootstrapContext, KubernetesClient.class, kubernetesClient, "configKubernetesClient",
96+
(ApplicationListener<ContextClosedEvent>) event -> kubernetesClient.close());
9497
return kubernetesClient;
9598
}
9699

0 commit comments

Comments
 (0)