diff --git a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/mongodb/GridFsManager.java b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/mongodb/GridFsManager.java index 71d7d8b8..da4f8449 100644 --- a/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/mongodb/GridFsManager.java +++ b/powerjob-server/src/main/java/com/github/kfcfans/powerjob/server/persistence/mongodb/GridFsManager.java @@ -1,6 +1,7 @@ package com.github.kfcfans.powerjob.server.persistence.mongodb; import com.github.kfcfans.powerjob.server.common.PowerJobServerConfigKey; +import com.github.kfcfans.powerjob.server.service.lock.LockService; import com.google.common.base.Stopwatch; import com.google.common.collect.Maps; import com.mongodb.client.MongoDatabase; @@ -38,6 +39,8 @@ public class GridFsManager implements InitializingBean { @Resource private Environment environment; + @Resource + private LockService lockService; private MongoDatabase db; private boolean available; @@ -107,9 +110,22 @@ public class GridFsManager implements InitializingBean { * @param day 日期偏移量,单位 天 */ public void deleteBefore(String bucketName, int day) { + String deleteFsLock = "deleteFsLock"; + // 只要第一个server抢到锁其他server就会返回,所以锁10分钟应该足够了 + boolean lock = lockService.lock(deleteFsLock, 10 * 60 * 1000); + if (!lock) { + log.info("[GridFsManager] deleted task is running, it's ok to return."); + return; + } + try{ + deleteHistoryFile(bucketName, day); + }finally { + lockService.unlock(deleteFsLock); + } + } + private void deleteHistoryFile(String bucketName, int day) { Stopwatch sw = Stopwatch.createStarted(); - Date date = DateUtils.addDays(new Date(), -day); GridFSBucket bucket = getBucket(bucketName); Bson filter = Filters.lt("uploadDate", date);