From 4d948d180f891334d193b6f5d6355a4e951b4579 Mon Sep 17 00:00:00 2001 From: Dave Syer Date: Mon, 9 Sep 2024 11:06:14 +0100 Subject: [PATCH] Store channels as map so they can be cached --- .../grpc/client/DefaultGrpcChannelFactory.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/spring-grpc-core/src/main/java/org/springframework/grpc/client/DefaultGrpcChannelFactory.java b/spring-grpc-core/src/main/java/org/springframework/grpc/client/DefaultGrpcChannelFactory.java index a0cc2a2..11df931 100644 --- a/spring-grpc-core/src/main/java/org/springframework/grpc/client/DefaultGrpcChannelFactory.java +++ b/spring-grpc-core/src/main/java/org/springframework/grpc/client/DefaultGrpcChannelFactory.java @@ -16,7 +16,8 @@ package org.springframework.grpc.client; import java.util.ArrayList; -import java.util.Collection; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; import org.springframework.beans.factory.DisposableBean; @@ -28,17 +29,17 @@ import io.grpc.ManagedChannelBuilder; public class DefaultGrpcChannelFactory implements GrpcChannelFactory, DisposableBean { - private Collection channels = new ArrayList<>(); + private Map channels = new ConcurrentHashMap<>(); @Override public ManagedChannelBuilder createChannel(String authority) { ManagedChannelBuilder target = Grpc.newChannelBuilder(authority, InsecureChannelCredentials.create()); - return new DisposableChannelBuilder(target); + return new DisposableChannelBuilder(authority, target); } @Override public void destroy() throws Exception { - for (ManagedChannel channel : channels) { + for (ManagedChannel channel : channels.values()) { channel.shutdown(); } } @@ -47,7 +48,10 @@ public class DefaultGrpcChannelFactory implements GrpcChannelFactory, Disposable private final ManagedChannelBuilder delegate; - public DisposableChannelBuilder(ManagedChannelBuilder delegate) { + private final String authority; + + public DisposableChannelBuilder(String authority, ManagedChannelBuilder delegate) { + this.authority = authority; this.delegate = delegate; } @@ -58,8 +62,7 @@ public class DefaultGrpcChannelFactory implements GrpcChannelFactory, Disposable @Override public ManagedChannel build() { - ManagedChannel channel = super.build(); - channels.add(channel); + ManagedChannel channel = channels.computeIfAbsent(authority, name -> super.build()); return channel; }