Настроить реактивный кластер mongodb вместе с обычным монго - PullRequest
0 голосов
/ 04 марта 2019

У меня есть приложение Spring WebFlux, использующее MongoDB.даже если это звучит странно, я должен настроить обычный репозиторий Mongo вместе с репозиторием ReactiveMongo.

Способ, которым наш Mongo был определен в предыдущем приложении весны, был:

@EnableMongoRepositories
@SpringBootApplication(exclude = {MongoAutoConfiguration.class})
@EnableEurekaClient
public class MyMsApplication {
    public static void main(String[] args) throws Exception {
        SpringApplication.run(MyMsApplication.class, args);
    }
}

@Configuration
public class MongoConfigurations {

    @Value("${spring.data.mongodb.database}")
    private String defaultDatabase;

    @Value("${mongodb.cluster}")
    private String mongoCluster;

    @Value("${mongodb.port}")
    private int mongoPort;

    @Value("${mongodb.connectTimeoutMS}")
    private int mongoTimeout;

    @Value("${mongodb.auth.database}")
    private String mongoAuthDB;

    @Value("${mongodb.auth.username}")
    private String mongoUser;

    @Value("${mongodb.auth.password}")
    private String mongoPass;

    private MongoClientOptions.Builder optionsBuilder;
    private MongoClientOptions options;
    private List<ServerAddress> seeds;
    private MongoCredential cred;
    private ConnectionString connectionString;
    private MongoClient mongoClient;

    @PostConstruct
    public void init() {
        optionsBuilder = MongoClientOptions.builder();
        optionsBuilder.connectTimeout(mongoTimeout);
        options = optionsBuilder.build();
        cred = MongoCredential.createCredential(mongoUser, mongoAuthDB, mongoPass.toCharArray());
        seeds = new ArrayList<ServerAddress>();
        for (String ip : mongoCluster.split(",")) {
            seeds.add(new ServerAddress(ip, mongoPort));
        }
    }

    @Bean
    public MongoDbFactory mongoDbFactory() throws UnknownHostException {
        return new SimpleMongoDbFactory(getMongoClient(),defaultDatabase);
    }

    @Bean
    public MongoClient getMongoClient() throws UnknownHostException {
        this.mongoClient = new MongoClient(seeds, cred, options);
        return this.mongoClient;
    }

    @Primary
    @Bean
    public MongoTemplate mongoTemplate() throws UnknownHostException {
        return new MongoTemplate(mongoDbFactory());
    }

    @PreDestroy
    public void close() {
        if (this.mongoClient != null) {
            this.mongoClient.close();
        }
    }
}
  1. Но я не нашел никакого рабочего способа настроить кластер реактивныйMongo
  2. Я беспокоюсь об установке свойства
    spring.main.allow-bean-definition-overriding=true

Я нашел здесь некоторые решения, но все они вызывают у меня исключения (я постараюсь воспроизвести их и добавить сообщения об ошибках

Одно из предложенных мной решений:

@EnableMongoRepositories
@SpringBootApplication(exclude = {MongoAutoConfiguration.class, MongoReactiveAutoConfiguration.class})
@EnableEurekaClient
public class MyMsApplication {
    public static void main(String[] args) throws Exception {
        SpringApplication.run(MyMsApplication.class, args);
    }
}

@Configuration
public class MongoConfigurations {

    @Value("${spring.data.mongodb.database}")
    private String defaultDatabase;

    @Value("${mongodb.cluster}")
    private String mongoCluster;

    @Value("${mongodb.port}")
    private int mongoPort;

    @Value("${mongodb.connectTimeoutMS}")
    private int mongoTimeout;

    @Value("${mongodb.auth.database}")
    private String mongoAuthDB;

    @Value("${mongodb.auth.username}")
    private String mongoUser;

    @Value("${mongodb.auth.password}")
    private String mongoPass;

    MongoClientOptions.Builder optionsBuilder;
    MongoClientOptions options;
    List<ServerAddress> seeds;
    MongoCredential cred;
    ConnectionString connectionString;

    @PostConstruct
    public void init() {
        optionsBuilder = MongoClientOptions.builder();
        optionsBuilder.connectTimeout(mongoTimeout);
        options = optionsBuilder.build();
        cred = MongoCredential.createCredential(mongoUser, mongoAuthDB, mongoPass.toCharArray());
        seeds = new ArrayList<ServerAddress>();
        for (String ip : mongoCluster.split(",")) {
            seeds.add(new ServerAddress(ip, mongoPort));
        }
    }

    @Configuration
    private class ReactiveMongoConfiguration extends AbstractReactiveMongoConfiguration {

        private com.mongodb.reactivestreams.client.MongoClient mongo;

        public ReactiveMongoConfiguration() {
        }

        @PreDestroy
        public void close() {
            if (this.mongo != null) {
                this.mongo.close();
            }
        }

        @Bean
        @Override
        public com.mongodb.reactivestreams.client.MongoClient reactiveMongoClient() {
            this.mongo = MongoClients.create(mongoClientSettings());
            return this.mongo;
        }

        private MongoClientSettings mongoClientSettings() {
            return MongoClientSettings.builder()
                    .applyToClusterSettings(clusterSettingsBuilder())
                    .applyToSslSettings(sslSettingsBuilder())
                    .credential(cred)
                    .build()
        }

        private Block<ClusterSettings.Builder> clusterSettingsBuilder() {
            return (cluster) -> cluster.hosts(seeds).build();
        }

        private Block<SslSettings.Builder> sslSettingsBuilder() {
            return (ssl) -> ssl.enabled(false).build();
        }

        @Override
        protected String getDatabaseName() {
            return defaultDatabase;
        }
    }

    @Configuration
    private class ImperativeMongoConfiguration {

        private MongoClient mongoClient;

        public ImperativeMongoConfiguration() {
        }

        @Bean
        public MongoDbFactory mongoDbFactory() throws UnknownHostException {
            return new SimpleMongoDbFactory(getMongoClient(),defaultDatabase);
        }

        @Bean
        public MongoClient getMongoClient() throws UnknownHostException {
            this.mongoClient = new MongoClient(seeds, cred, options);
            return this.mongoClient;
        }

        @Primary
        @Bean
        public MongoTemplate mongoTemplate() throws UnknownHostException {
            return new MongoTemplate(mongoDbFactory());
        }

        @PreDestroy
        public void close() {
            if (this.mongoClient != null) {
                this.mongoClient.close();
            }
        }
    }
}

, но возникло исключение:

com.mongodb.MongoSocketOpenException: Exception opening socket
    at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:67) ~[mongodb-driver-core-3.8.2.jar:?]
    at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:126) ~[mongodb-driver-core-3.8.2.jar:?]
    at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:117) [mongodb-driver-core-3.8.2.jar:?]
    at java.lang.Thread.run(Thread.java:834) [?:?]
Caused by: java.net.SocketTimeoutException: connect timed out
    at java.net.PlainSocketImpl.waitForConnect(Native Method) ~[?:?]
    at java.net.PlainSocketImpl.socketConnect(PlainSocketImpl.java:107) ~[?:?]
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399) ~[?:?]
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242) ~[?:?]
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224) ~[?:?]
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:403) ~[?:?]
    at java.net.Socket.connect(Socket.java:591) ~[?:?]
    at com.mongodb.internal.connection.SocketStreamHelper.initialize(SocketStreamHelper.java:64) ~[mongodb-driver-core-3.8.2.jar:?]
    at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:62) ~[mongodb-driver-core-3.8.2.jar:?]
    ... 3 more

Спасибо

...