Spring-Boot:如何检查 Mongock 是否已完成?

问题描述

我正在使用 Mongock 通过 Spring-Boot 迁移和初始化我的 MongoDB 数据库。 我需要的是一种检查何时应用所有变更日志的方法

如何检查 Mongock 是否已完成所有变更日志/变更集?

我发现 Mongock 创建了一个集合 mongockLock,其中在迁移运行时有一个条目。

是否足以检查上述集合中没有任何文档来得出 Mongock 已完成变更日志的结论?

如何查询此集合中的文档?

解决方法

首先,mongockLock 集合只是分布式悲观锁的集合。这是 Mongock 用来确保 changeLog 一次仅由一个实例运行的机制。如果成功,只需一次(除非标志 runAlways 为真,在这种情况下显然每次都会运行)。 所以 mongockLock 不是您要找的

有 3 种方法可以检查迁移是否成功运行。

  1. 什么都不做。如果您不更改任何 ChangeSet 中 failFast 的默认值,则 Mongock runner 将在任何更改日志失败时抛出异常
  2. 订阅 Mongock 活动。您可以查看this example project
  3. 检查集合 mongockChangeLog
,

Spring Boot 有两种使用 Mongock 的方法,如 Mongock's documentation 所示:

  1. 通过属性,使用@EnableMongock

    mongock:
      runner-type: InitializingBean
    
    
    
  2. 使用构建器方法

    @Bean
    public MongockInitializingBeanRunner mongockInitializingBeanRunner(
                                           ApplicationContext springContext,MongoTemplate mongoTemplate){
    return MongockSpring5.builder()
        .setDriver(SpringDataMongo3Driver.withDefaultLock(mongoTemplate))
        .addChangeLogsScanPackage("your_changeLog_package_path")
        .setSpringContext(springContext)
        .buildInitializingBeanRunner();
    

}

  • 调度作业不应在 Mongock 之前发生,如果 runner-type 是 InitializingBean。但是如果它是 ApplicationRunner 可能会发生

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...