diff --git a/driver-core/src/main/com/mongodb/connection/NettyTransportSettings.java b/driver-core/src/main/com/mongodb/connection/NettyTransportSettings.java index d1e5beb940d..ef9d68b32b4 100644 --- a/driver-core/src/main/com/mongodb/connection/NettyTransportSettings.java +++ b/driver-core/src/main/com/mongodb/connection/NettyTransportSettings.java @@ -87,8 +87,7 @@ public Builder socketChannelClass(final Class extends SocketChannel> socketCha /** * Sets the event loop group. * - *
It is highly recommended to supply your own event loop group and manage its shutdown. Otherwise, the event - * loop group created by default will not be shutdown properly.
+ *The application is responsible for shutting down the provided {@code eventLoopGroup}
* * @param eventLoopGroup the event loop group that all channels created by this factory will be a part of * @return this diff --git a/driver-core/src/main/com/mongodb/internal/connection/AsynchronousSocketChannelStreamFactoryFactory.java b/driver-core/src/main/com/mongodb/internal/connection/AsynchronousSocketChannelStreamFactoryFactory.java index 8810272b90d..db9166eda64 100644 --- a/driver-core/src/main/com/mongodb/internal/connection/AsynchronousSocketChannelStreamFactoryFactory.java +++ b/driver-core/src/main/com/mongodb/internal/connection/AsynchronousSocketChannelStreamFactoryFactory.java @@ -36,4 +36,8 @@ public AsynchronousSocketChannelStreamFactoryFactory(final InetAddressResolver i public StreamFactory create(final SocketSettings socketSettings, final SslSettings sslSettings) { return new AsynchronousSocketChannelStreamFactory(inetAddressResolver, socketSettings, sslSettings); } + + @Override + public void close() { + } } diff --git a/driver-core/src/main/com/mongodb/internal/connection/StreamFactoryFactory.java b/driver-core/src/main/com/mongodb/internal/connection/StreamFactoryFactory.java index 96df4c29348..6cbe620fd43 100644 --- a/driver-core/src/main/com/mongodb/internal/connection/StreamFactoryFactory.java +++ b/driver-core/src/main/com/mongodb/internal/connection/StreamFactoryFactory.java @@ -22,7 +22,7 @@ /** * A factory of {@code StreamFactory} instances. */ -public interface StreamFactoryFactory { +public interface StreamFactoryFactory extends AutoCloseable { /** * Create a {@code StreamFactory} with the given settings. @@ -32,4 +32,7 @@ public interface StreamFactoryFactory { * @return a stream factory that will apply the given settins */ StreamFactory create(SocketSettings socketSettings, SslSettings sslSettings); + + @Override + void close(); } diff --git a/driver-core/src/main/com/mongodb/internal/connection/TlsChannelStreamFactoryFactory.java b/driver-core/src/main/com/mongodb/internal/connection/TlsChannelStreamFactoryFactory.java index 4f6bacef191..b54e7679d2d 100644 --- a/driver-core/src/main/com/mongodb/internal/connection/TlsChannelStreamFactoryFactory.java +++ b/driver-core/src/main/com/mongodb/internal/connection/TlsChannelStreamFactoryFactory.java @@ -59,7 +59,7 @@ /** * A {@code StreamFactoryFactory} that supports TLS/SSL. The implementation supports asynchronous usage. */ -public class TlsChannelStreamFactoryFactory implements StreamFactoryFactory, Closeable { +public class TlsChannelStreamFactoryFactory implements StreamFactoryFactory { private static final Logger LOGGER = Loggers.getLogger("connection.tls"); diff --git a/driver-core/src/main/com/mongodb/internal/connection/netty/NettyStreamFactoryFactory.java b/driver-core/src/main/com/mongodb/internal/connection/netty/NettyStreamFactoryFactory.java index d1f6e52f356..7fe54defaa2 100644 --- a/driver-core/src/main/com/mongodb/internal/connection/netty/NettyStreamFactoryFactory.java +++ b/driver-core/src/main/com/mongodb/internal/connection/netty/NettyStreamFactoryFactory.java @@ -47,6 +47,7 @@ public final class NettyStreamFactoryFactory implements StreamFactoryFactory { private final EventLoopGroup eventLoopGroup; + private final boolean ownsEventLoopGroup; private final Class extends SocketChannel> socketChannelClass; private final ByteBufAllocator allocator; @Nullable @@ -202,6 +203,15 @@ public StreamFactory create(final SocketSettings socketSettings, final SslSettin sslContext); } + @Override + public void close() { + if (ownsEventLoopGroup) { + // ignore the returned Future. This is in line with MongoClient behavior to not block waiting for connections to be returned + // to the pool + eventLoopGroup.shutdownGracefully(); + } + } + @Override public boolean equals(final Object o) { if (this == o) { @@ -225,6 +235,7 @@ private NettyStreamFactoryFactory(final Builder builder) { allocator = builder.allocator == null ? ByteBufAllocator.DEFAULT : builder.allocator; socketChannelClass = builder.socketChannelClass == null ? NioSocketChannel.class : builder.socketChannelClass; eventLoopGroup = builder.eventLoopGroup == null ? new NioEventLoopGroup() : builder.eventLoopGroup; + ownsEventLoopGroup = builder.eventLoopGroup == null; sslContext = builder.sslContext; inetAddressResolver = builder.inetAddressResolver; } diff --git a/driver-reactive-streams/src/main/com/mongodb/reactivestreams/client/MongoClients.java b/driver-reactive-streams/src/main/com/mongodb/reactivestreams/client/MongoClients.java index d4ad39bdec9..28bcc068805 100644 --- a/driver-reactive-streams/src/main/com/mongodb/reactivestreams/client/MongoClients.java +++ b/driver-reactive-streams/src/main/com/mongodb/reactivestreams/client/MongoClients.java @@ -127,10 +127,9 @@ public static MongoClient create(final MongoClientSettings settings, @Nullable f } StreamFactory streamFactory = getStreamFactory(streamFactoryFactory, settings, false); StreamFactory heartbeatStreamFactory = getStreamFactory(streamFactoryFactory, settings, true); - AutoCloseable externalResourceCloser = streamFactoryFactory instanceof AutoCloseable ? (AutoCloseable) streamFactoryFactory : null; MongoDriverInformation wrappedMongoDriverInformation = wrapMongoDriverInformation(mongoDriverInformation); Cluster cluster = createCluster(settings, wrappedMongoDriverInformation, streamFactory, heartbeatStreamFactory); - return new MongoClientImpl(settings, wrappedMongoDriverInformation, cluster, externalResourceCloser); + return new MongoClientImpl(settings, wrappedMongoDriverInformation, cluster, streamFactoryFactory); } /**