diff --git a/shenyu-protocol/shenyu-protocol-tcp/src/main/java/org/apache/shenyu/protocol/tcp/TcpBootstrapServer.java b/shenyu-protocol/shenyu-protocol-tcp/src/main/java/org/apache/shenyu/protocol/tcp/TcpBootstrapServer.java index df5861933480..843e823c7460 100644 --- a/shenyu-protocol/shenyu-protocol-tcp/src/main/java/org/apache/shenyu/protocol/tcp/TcpBootstrapServer.java +++ b/shenyu-protocol/shenyu-protocol-tcp/src/main/java/org/apache/shenyu/protocol/tcp/TcpBootstrapServer.java @@ -84,6 +84,11 @@ public void start(final TcpServerConfiguration tcpServerConfiguration) { .runOn(loopResources); server = tcpServer.bindNow(); } catch (RuntimeException startFailure) { + try { + connectionContext.dispose(); + } catch (RuntimeException cleanupFailure) { + startFailure.addSuppressed(cleanupFailure); + } try { loopResources.dispose(); } catch (RuntimeException cleanupFailure) { @@ -148,6 +153,17 @@ public synchronized void shutdown() { } catch (RuntimeException ex) { failure = ex; } + try { + if (Objects.nonNull(connectionContext)) { + connectionContext.dispose(); + } + } catch (RuntimeException ex) { + if (Objects.isNull(failure)) { + failure = ex; + } else { + failure.addSuppressed(ex); + } + } try { if (Objects.nonNull(loopResources)) { loopResources.dispose(); diff --git a/shenyu-protocol/shenyu-protocol-tcp/src/main/java/org/apache/shenyu/protocol/tcp/connection/ConnectionContext.java b/shenyu-protocol/shenyu-protocol-tcp/src/main/java/org/apache/shenyu/protocol/tcp/connection/ConnectionContext.java index f9cb56c1e71a..0c194c128f5a 100644 --- a/shenyu-protocol/shenyu-protocol-tcp/src/main/java/org/apache/shenyu/protocol/tcp/connection/ConnectionContext.java +++ b/shenyu-protocol/shenyu-protocol-tcp/src/main/java/org/apache/shenyu/protocol/tcp/connection/ConnectionContext.java @@ -23,6 +23,7 @@ import reactor.netty.tcp.TcpClient; import java.time.Duration; +import java.util.Objects; import java.util.Properties; /** @@ -77,4 +78,13 @@ public Mono getTcpClientConnection(final String ip, final ActivityCo ); } + /** + * Dispose the connection pool. + */ + public void dispose() { + if (Objects.nonNull(connectionProvider)) { + connectionProvider.dispose(); + } + } + } diff --git a/shenyu-protocol/shenyu-protocol-tcp/src/test/java/org/apache/shenyu/protocol/tcp/TcpBootstrapServerTest.java b/shenyu-protocol/shenyu-protocol-tcp/src/test/java/org/apache/shenyu/protocol/tcp/TcpBootstrapServerTest.java index 76f393a5d433..3c2dec161e32 100644 --- a/shenyu-protocol/shenyu-protocol-tcp/src/test/java/org/apache/shenyu/protocol/tcp/TcpBootstrapServerTest.java +++ b/shenyu-protocol/shenyu-protocol-tcp/src/test/java/org/apache/shenyu/protocol/tcp/TcpBootstrapServerTest.java @@ -229,6 +229,7 @@ void shouldShutdownOnlyOnce() throws Exception { server.shutdown(); verify(disposableServer).disposeNow(); + verify(connectionContext).dispose(); verify(loopResources).dispose(); } @@ -248,6 +249,7 @@ void shouldDisposeLoopResourcesWhenServerDisposalFails() throws Exception { assertSame(serverFailure, actual); assertEquals(1, actual.getSuppressed().length); assertSame(loopFailure, actual.getSuppressed()[0]); + verify(connectionContext).dispose(); verify(loopResources).dispose(); assertDoesNotThrow(server::shutdown); }