Spring Boot项目中如何判断Mongock是否已完成所有changelog执行
Mongock迁移执行状态判断及查询方法
mongockLock集合的判断逻辑说明
你提到的mongockLock是Mongock实现分布式锁的核心集合,迁移任务启动时会写入锁记录,无论迁移最终执行成功还是失败,任务结束后都会释放锁并删除对应记录,所以查询到该集合无文档只能说明当前没有正在运行的Mongock迁移任务,不能直接判定所有changelog都执行成功:如果迁移过程中出现异常中断,锁同样会被释放,此时集合为空但迁移并未完成全部流程。
要完全确认所有changelog/changeset都执行完成,需要同时满足两个条件:
- mongockLock集合无任何文档,无正在运行的迁移任务
- mongockChangeLog(Mongock用于记录迁移历史的集合)中所有待执行的changelog记录的状态均为
SUCCESS,且记录的版本、数量和你项目中定义的迁移脚本完全匹配
集合查询方法
1. Mongo Shell 直接查询
查询mongockLock集合,确认是否有正在运行的任务:
db.mongockLock.find({}) // 如果你使用的是Mongock 5+默认配置,集合名是下划线格式: // db.mongock_lock.find({})
查询mongockChangeLog集合,验证迁移执行结果:
// 查询所有执行成功的迁移记录 db.mongockChangeLog.find({status: "SUCCESS"}).sort({executedAt: -1}) // 统计成功执行的changeset总数 db.mongockChangeLog.countDocuments({status: "SUCCESS"}) // Mongock 5+版本使用的集合名: // db.mongock_change_log.find({status: "SUCCESS"})
2. Spring Boot 项目中代码查询
通过注入MongoTemplate实现集合查询:
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.mongodb.core.MongoTemplate; import org.springframework.data.mongodb.core.query.Criteria; import org.springframework.data.mongodb.core.query.Query; import org.bson.Document; import java.util.List; public class MongockStatusService { @Autowired private MongoTemplate mongoTemplate; // 判断是否存在正在运行的迁移任务 public boolean isMigrating() { return !mongoTemplate.findAll(Document.class, "mongockLock").isEmpty(); } // 查询所有执行成功的迁移记录 public List<Document> getSuccessMigrationRecords() { Query query = Query.query(Criteria.where("status").is("SUCCESS")); return mongoTemplate.find(query, Document.class, "mongockChangeLog"); } }
注意:如果你自定义过Mongock的集合命名,需要把上述代码和查询语句中的集合名替换为你自定义的名称。
内容的提问来源于stack exchange,提问作者1Z10
相关产品推荐
相关产品推荐

