Как заставить `org.mongodb.driver.cluster` использовать встроенный mongodb в весенней загрузке? - PullRequest
0 голосов
/ 20 марта 2020

Попытка использовать встроенный mongodb для моего весеннего профиля local. Вот конфигурация для MongoTemplate

@Configuration
@Profile("local")
public class LocalMongoConfig {
    private static final String MONGO_DB_URL = "localhost";
    private static final String MONGO_DB_NAME = "embeded_db";
    @Bean
    @Primary
    public MongoTemplate mongoTemplate() throws IOException {
        EmbeddedMongoFactoryBean mongo = new EmbeddedMongoFactoryBean();
        mongo.setBindIp(MONGO_DB_URL);
        MongoClient mongoClient = mongo.getObject();
        MongoTemplate mongoTemplate = new MongoTemplate(mongoClient, MONGO_DB_NAME);
        return mongoTemplate;
    }
}

И это application-local.yml

spring:
  data:
    mongodb:
      uri: mongodb://127.0.0.1:27017/embeded_db

Но при запуске приложения из журналов я вижу, что встроенный mongodb запускается через произвольные порты.

13:53:49.849 [Thread-7] INFO  org.springframework.boot.autoconfigure.mongo.embedded.EmbeddedMongo - 2020-03-20T13:53:49.849+0800 I NETWORK  [thread1] waiting for connections on port 51564

Затем я получаю следующее сообщение об ошибке: connection refused, что правильно, поскольку он пытается подключиться к другому порту (27017)

 13:53:50.953 [restartedMain] INFO  org.mongodb.driver.cluster - Cluster description not yet available. Waiting for 30000 ms before timing out
13:53:51.639 [cluster-ClusterId{value='5e745a6e973cbd4bd45d073e', description='null'}-127.0.0.1:27017] INFO  org.mongodb.driver.cluster - Exception in monitor thread while connecting to server 127.0.0.1:27017
com.mongodb.MongoSocketOpenException: Exception opening socket
    at com.mongodb.internal.connection.SocketStream.open(SocketStream.java:67)
    at com.mongodb.internal.connection.InternalStreamConnection.open(InternalStreamConnection.java:126)
    at com.mongodb.internal.connection.DefaultServerMonitor$ServerMonitorRunnable.run(DefaultServerMonitor.java:117)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.net.ConnectException: Connection refused: connect

Как я могу убедиться, что mongodb.driver использует встроенный mongodb?

1 Ответ

0 голосов
/ 20 марта 2020

Существует метод на EmbeddedMongoFactoryBean, использующий его для установки желаемого порта.

/**
 * The port MongoDB should run on. When no port is provided, then some free
 * server port is automatically assigned. The value must be between 0 and 65535.
 */
public void setPort(int port) {
    builder.port(port);
}

Попробуйте это:

@Bean
@Primary
public MongoTemplate mongoTemplate() throws IOException {
    EmbeddedMongoFactoryBean mongo = new EmbeddedMongoFactoryBean();
    mongo.setPort(27017); //here
    mongo.setBindIp(MONGO_DB_URL);
    MongoClient mongoClient = mongo.getObject();
    MongoTemplate mongoTemplate = new MongoTemplate(mongoClient, MONGO_DB_NAME);
    return mongoTemplate;
}

Но в соответствии с документами вы должны сделать это:

@Bean(destroyMethod = "close")
@Profile("local")
MongoClient mongo(){
    return new EmbeddedMongoBuilder().port().bindIp().build();
}
...