【问题标题】:Spring-Boot: how to check if Mongock has completed?Spring-Boot:如何检查 Mongock 是否已完成?
【发布时间】:2021-06-18 15:24:41
【问题描述】:

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

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

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

检查上述集合中是否缺少任何文档就足以得出 Mongock 已完成更改日志的结论吗?

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

【问题讨论】:

    标签: mongodb spring-boot mongock


    【解决方案1】:

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

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

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

    【讨论】:

    • 我想 Mongock 事件是唯一的选择,因为我想用它来对通过变更集插入的数据运行其他任务。我需要在应用程序启动并且更改日志完成后通过@Scheduled() 运行任务,然后每小时运行一次。
    • 如果它是一个springboot应用程序,你可以在没有事件的情况下做到这一点。通过设置runnerType(通过mongock.runner-type配置,或builder通过buildInitializingBeanRunner),如果mongock失败,应用程序将无法启动。
    • 我应该如何设置 mongock.runner-type? InitializingBean 还是 ApplicationRunner?在不配置的情况下,@Scheduled(fixedDelay = 1000L) 方法在控制台登录“Mongock 已完成”之前第一次执行。
    【解决方案2】:

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

    1. 通过属性,使用@EnableMongock

      mongock:
        runner-type: InitializingBean
      
      
      
    2. 使用 builder 方法

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

    }

    • 如果运行器类型为 InitializingBean,则调度作业不应在 Mongock 之前发生。但是,如果它是 ApplicationRunner,它可能会发生

    【讨论】:

    • 好的,现在很清楚了。我正在使用@EnableMongock 方法。我用@EventListener 和@Scheduled 注释了该方法,以便在迁移成功后立即执行,并且每小时执行一次。
    猜你喜欢
    • 2017-11-13
    • 2014-07-22
    • 1970-01-01
    • 2015-08-14
    • 2014-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-28
    相关资源
    最近更新 更多