Merge branch '2.1.x'

pull/16419/head
Andy Wilkinson 6 years ago
commit 8ebe5f9983

@ -19,11 +19,15 @@ package org.springframework.boot.autoconfigure.mongo;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import com.mongodb.MongoClientSettings; import com.mongodb.MongoClientSettings;
import com.mongodb.MongoClientSettings.Builder;
import com.mongodb.connection.netty.NettyStreamFactoryFactory; import com.mongodb.connection.netty.NettyStreamFactoryFactory;
import com.mongodb.reactivestreams.client.MongoClient; import com.mongodb.reactivestreams.client.MongoClient;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel; import io.netty.channel.socket.SocketChannel;
import reactor.core.publisher.Flux; import reactor.core.publisher.Flux;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.ObjectProvider; import org.springframework.beans.factory.ObjectProvider;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
@ -60,19 +64,45 @@ public class MongoReactiveAutoConfiguration {
} }
@Configuration(proxyBeanMethods = false) @Configuration(proxyBeanMethods = false)
@ConditionalOnClass(SocketChannel.class) @ConditionalOnClass({ SocketChannel.class, NioEventLoopGroup.class })
static class NettyDriverConfiguration { static class NettyDriverConfiguration {
@Bean @Bean
@Order(Ordered.HIGHEST_PRECEDENCE) @Order(Ordered.HIGHEST_PRECEDENCE)
public MongoClientSettingsBuilderCustomizer nettyDriverCustomizer( public NettyDriverMongoClientSettingsBuilderCustomizer nettyDriverCustomizer(
ObjectProvider<MongoClientSettings> settings) { ObjectProvider<MongoClientSettings> settings) {
return (builder) -> { return new NettyDriverMongoClientSettingsBuilderCustomizer(settings);
if (!isStreamFactoryFactoryDefined(settings.getIfAvailable())) { }
builder.streamFactoryFactory(
NettyStreamFactoryFactory.builder().build()); private static final class NettyDriverMongoClientSettingsBuilderCustomizer
implements MongoClientSettingsBuilderCustomizer, DisposableBean {
private final ObjectProvider<MongoClientSettings> settings;
private volatile EventLoopGroup eventLoopGroup;
private NettyDriverMongoClientSettingsBuilderCustomizer(
ObjectProvider<MongoClientSettings> settings) {
this.settings = settings;
}
@Override
public void customize(Builder builder) {
if (!isStreamFactoryFactoryDefined(this.settings.getIfAvailable())) {
NioEventLoopGroup eventLoopGroup = new NioEventLoopGroup();
this.eventLoopGroup = eventLoopGroup;
builder.streamFactoryFactory(NettyStreamFactoryFactory.builder()
.eventLoopGroup(eventLoopGroup).build());
}
}
@Override
public void destroy() {
EventLoopGroup eventLoopGroup = this.eventLoopGroup;
if (eventLoopGroup != null) {
eventLoopGroup.shutdownGracefully().awaitUninterruptibly();
this.eventLoopGroup = null;
} }
};
} }
private boolean isStreamFactoryFactoryDefined(MongoClientSettings settings) { private boolean isStreamFactoryFactoryDefined(MongoClientSettings settings) {
@ -82,3 +112,5 @@ public class MongoReactiveAutoConfiguration {
} }
} }
}

@ -17,6 +17,7 @@
package org.springframework.boot.autoconfigure.mongo; package org.springframework.boot.autoconfigure.mongo;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
import com.mongodb.MongoClientSettings; import com.mongodb.MongoClientSettings;
import com.mongodb.ReadPreference; import com.mongodb.ReadPreference;
@ -25,6 +26,7 @@ import com.mongodb.connection.StreamFactory;
import com.mongodb.connection.StreamFactoryFactory; import com.mongodb.connection.StreamFactoryFactory;
import com.mongodb.connection.netty.NettyStreamFactoryFactory; import com.mongodb.connection.netty.NettyStreamFactoryFactory;
import com.mongodb.reactivestreams.client.MongoClient; import com.mongodb.reactivestreams.client.MongoClient;
import io.netty.channel.EventLoopGroup;
import org.junit.Test; import org.junit.Test;
import org.springframework.boot.autoconfigure.AutoConfigurations; import org.springframework.boot.autoconfigure.AutoConfigurations;
@ -89,11 +91,17 @@ public class MongoReactiveAutoConfigurationTests {
@Test @Test
public void nettyStreamFactoryFactoryIsConfiguredAutomatically() { public void nettyStreamFactoryFactoryIsConfiguredAutomatically() {
AtomicReference<EventLoopGroup> eventLoopGroupReference = new AtomicReference<>();
this.contextRunner.run((context) -> { this.contextRunner.run((context) -> {
assertThat(context).hasSingleBean(MongoClient.class); assertThat(context).hasSingleBean(MongoClient.class);
assertThat(getSettings(context).getStreamFactoryFactory()) StreamFactoryFactory factory = getSettings(context).getStreamFactoryFactory();
.isInstanceOf(NettyStreamFactoryFactory.class); assertThat(factory).isInstanceOf(NettyStreamFactoryFactory.class);
EventLoopGroup eventLoopGroup = (EventLoopGroup) ReflectionTestUtils
.getField(factory, "eventLoopGroup");
assertThat(eventLoopGroup.isShutdown()).isFalse();
eventLoopGroupReference.set(eventLoopGroup);
}); });
assertThat(eventLoopGroupReference.get().isShutdown()).isTrue();
} }
@Test @Test

Loading…
Cancel
Save