Как включить журнал во встроенном MongoDB из теста Spring Boot - PullRequest
3 голосов
/ 06 апреля 2019

Я пытаюсь написать тест Spring Boot, который использует встроенный MondoDB 4.0.2;код для тестирования требует Mongo ChangeStreams, который требует запуска MongoDB в качестве набора реплик.MongoDB как реплика, установленная в MongoDB v4, требует ведения журнала.Я не смог найти способ начать с включенным ведением журнала, поэтому разместил это здесь в поисках ответов.Впоследствии я узнал, как это сделать - ниже.

У меня есть подпружиненная загрузка 2.1.3.RELEASE.Spring-data-mongodb 2.1.5.RELEASE

Это то, что я пытался:

@RunWith(SpringRunner.class)
@DataMongoTest(properties= {
    "spring.mongodb.embedded.version= 4.0.2",
    "spring.mongodb.embedded.storage.repl-set-name = r_0",
    "spring.mongodb.embedded.storage.journal.enabled=true"
    })
public class MyStreamWatcherTest {

@SpringBootApplication
@ComponentScan(basePackages = {"my.package.with.dao.classes"})
@EnableMongoRepositories( { "my.package.with.dao.repository" })
static public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

@Before
public void startup() {
    MongoDatabase adminDb = mongoClient.getDatabase("admin");
    Document config = new Document("_id", "rs0");
    BasicDBList members = new BasicDBList();
    members.add(new Document("_id", 0).append("host", 
           mongoClient.getConnectPoint()));
    config.put("members", members);
    adminDb.runCommand(new Document("replSetInitiate", config));

Однако при запуске теста параметры, используемые для запуска mongo, не включали включениеjournal.

Исправлено добавление этого класса:

@Configuration
public class MyEmbeddedMongoConfiguration {

  private int localPort = 0;

  public int getLocalPort() {
    return localPort;
  }

  @Bean
  public IMongodConfig mongodConfig(EmbeddedMongoProperties embeddedProperties) throws IOException {
    MongodConfigBuilder builder = new MongodConfigBuilder()
             .version(Version.V4_0_2)
             .cmdOptions(new MongoCmdOptionsBuilder().useNoJournal(false).build());
    // Save the local port so the replica set initializer can come get it.
    this.localPort = Network.getFreeServerPort();
    builder.net(new Net("127.0.0.1", this.getLocalPort(), Network.localhostIsIPv6()));
    EmbeddedMongoProperties.Storage storage = embeddedProperties.getStorage();
    if (storage != null) {
        String databaseDir = storage.getDatabaseDir();
        String replSetName = "rs0";   // Should be able to:  storage.getReplSetName();
        int oplogSize = (storage.getOplogSize() != null)
                ? (int) storage.getOplogSize().toMegabytes() : 0;
        builder.replication(new Storage(databaseDir, replSetName, oplogSize));
    }
    return builder.build();
}

Этот журнал включен, и mongod запущен с включенным набором реплик.Затем я добавил еще один класс для инициализации набора реплик:

@Configuration
public class EmbeddedMongoReplicaSetInitializer {

@Autowired
MyEmbeddedMongoConfiguration myEmbeddedMongoConfiguration;

MongoClient mongoClient;

// We don't use this MongoClient as it will try to wait for the replica set to stabilize
// before address-fetching methods will return. It is specified here to order this class's
// creation after MongoClient, so we can be sure mongod is running.
EmbeddedMongoReplicaSetInitializer(MongoClient mongoClient) {
    this.mongoClient = mongoClient;
}

@PostConstruct
public void initReplicaSet() {

    //List<ServerAddress> serverAddresses = mongoClient.getServerAddressList();
    MongoClient mongo = new MongoClient(new ServerAddress("127.0.0.1", myEmbeddedMongoConfiguration.getLocalPort()));

    MongoDatabase adminDb = mongo.getDatabase("admin");
    Document config = new Document("_id", "rs0");
    BasicDBList members = new BasicDBList();
    members.add(new Document("_id", 0).append("host", String.format("127.0.0.1:%d", myEmbeddedMongoConfiguration.getLocalPort())));
    config.put("members", members);
    adminDb.runCommand(new Document("replSetInitiate", config));
    mongo.close();
}

}

Это завершает работу.Если у кого-то есть советы, как сделать это проще, пожалуйста, напишите здесь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...