Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何通过Spring引导测试在嵌入式MongoDB中启用日志_Java_Spring_Mongodb_Spring Boot - Fatal编程技术网

Java 如何通过Spring引导测试在嵌入式MongoDB中启用日志

Java 如何通过Spring引导测试在嵌入式MongoDB中启用日志,java,spring,mongodb,spring-boot,Java,Spring,Mongodb,Spring Boot,我正在尝试编写一个使用嵌入式MondoDB4.0.2的Spring启动测试;要测试的代码需要Mongo ChangeStreams,它需要MongoDB启动作为副本集。MongoDB作为MongoDB v4上的副本集需要启用日志记录。我找不到一个方法来开始启用日志,所以在这里发布了这个来寻找答案。我随后发现了如何做到这一点-如下 我有spring boot 2.1.3.0版本。Spring data mongodb 2.1.5.1发布版 这就是我一直在尝试的: @RunWith(SpringRu

我正在尝试编写一个使用嵌入式MondoDB4.0.2的Spring启动测试;要测试的代码需要Mongo ChangeStreams,它需要MongoDB启动作为副本集。MongoDB作为MongoDB v4上的副本集需要启用日志记录。我找不到一个方法来开始启用日志,所以在这里发布了这个来寻找答案。我随后发现了如何做到这一点-如下

我有spring boot 2.1.3.0版本。Spring data mongodb 2.1.5.1发布版

这就是我一直在尝试的:

@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的选项不包括启用日志

修复方法是添加此类:

@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();
}

}
@配置
公共类EmbeddedMongoReplicateSetInitializer{
@自动连线
MyEmbeddedMongoConfiguration MyEmbeddedMongoConfiguration;
MongoClient MongoClient;
//我们不使用此MongoClient,因为它将尝试等待副本集稳定下来
//在地址提取方法返回之前。此处指定它是为了对此类的
//在MongoClient之后创建,因此我们可以确保mongod正在运行。
嵌入式MongoReplicateSetInitializer(MongoClient MongoClient){
this.mongoClient=mongoClient;
}
@施工后
公共void initreplicset(){
//List serverAddresses=mongoClient.getServerAddressList();
MongoClient mongo=新的MongoClient(新的服务器地址(“127.0.0.1”,myEmbeddedMongoConfiguration.getLocalPort());
MongoDatabase adminDb=mongo.getDatabase(“admin”);
文档配置=新文档(“_id”,“rs0”);
BasicDBList成员=新的BasicDBList();
add(新文档(“_id”,0).append(“主机”,String.format(“127.0.0.1:%d”,myEmbeddedMongoConfiguration.getLocalPort()));
config.put(“成员”,成员);
adminDb.runCommand(新文档(“replSetInitiate”,config));
mongo.close();
}
}

这就完成了任务。如果有人有让这更简单的建议,请在这里发布。

可能有用,谢谢!我看到了。。。并尝试了其中的一些建议。但它与弹簧靴无关。作者明确否认对Spring有任何了解或支持。