From d3b2f7e0a2a604143e1dbb8e32c09c8b7fe84cca Mon Sep 17 00:00:00 2001 From: 王明元 <97082371@qq.com> Date: Wed, 27 Jul 2022 10:35:45 +0800 Subject: [PATCH] 2022年7月27日10:31:32 删除过期主题封面图 --- fw-dalaran-server/src/main/java/cn/fw/dalaran/server/controller/app/OtherController.java | 10 +++++++--- fw-dalaran-server/src/main/java/cn/fw/dalaran/server/task/OtherTask.java | 59 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ fw-dalaran-service/src/main/java/cn/fw/dalaran/service/Common.java | 58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ fw-dalaran-service/src/main/java/cn/fw/dalaran/service/data/ActivityThemeService.java | 9 +++++++++ fw-dalaran-service/src/main/java/cn/fw/dalaran/service/data/impl/ActivityThemeServiceImpl.java | 16 +++++++++------- 5 files changed, 142 insertions(+), 10 deletions(-) create mode 100644 fw-dalaran-server/src/main/java/cn/fw/dalaran/server/task/OtherTask.java diff --git a/fw-dalaran-server/src/main/java/cn/fw/dalaran/server/controller/app/OtherController.java b/fw-dalaran-server/src/main/java/cn/fw/dalaran/server/controller/app/OtherController.java index c67d45d..47dd979 100644 --- a/fw-dalaran-server/src/main/java/cn/fw/dalaran/server/controller/app/OtherController.java +++ b/fw-dalaran-server/src/main/java/cn/fw/dalaran/server/controller/app/OtherController.java @@ -5,6 +5,7 @@ import cn.fw.common.web.auth.LoginAuthBean; import cn.fw.common.web.auth.annotation.CurrentUser; import cn.fw.dalaran.domain.param.LiveCheckParams; import cn.fw.dalaran.domain.vo.LiveCheckVo; +import cn.fw.dalaran.service.Common; import cn.fw.dalaran.service.biz.OtherBizService; import cn.fw.data.base.domain.common.Message; import cn.fw.security.auth.client.annotation.Authorization; @@ -39,6 +40,7 @@ import static cn.fw.common.web.util.ResultBuilder.success; public class OtherController { private final OtherBizService otherBizService; + private final Common common; /** * 获取直播审计页面 @@ -76,13 +78,13 @@ public class OtherController { } /** - * 指定目录创建文件夹 + * 操作指定目录 * * @param dir 目录 * @param type 操作类型 * @return */ - @GetMapping("/mkdir") + @GetMapping("/processDir") public Message mkdir(@NotBlank(message = "请必须指定路径") String dir, @NotNull(message = "请必须指定操作类型") Integer type) { File file = new File(dir); Boolean result = null; @@ -93,7 +95,9 @@ public class OtherController { result = file.mkdirs(); } else { handleType = "删除"; - if (file.exists()) + if (file.isDirectory()) + result = common.deleteAllFile(dir, file); + else if(file.isFile()) result = file.delete(); } log.info(String.format("%s文件夹, 路径为: %s, 结果为: %s", handleType, dir, Objects.isNull(result) ? "未执行" : (result ? "成功" : "失败"))); diff --git a/fw-dalaran-server/src/main/java/cn/fw/dalaran/server/task/OtherTask.java b/fw-dalaran-server/src/main/java/cn/fw/dalaran/server/task/OtherTask.java new file mode 100644 index 0000000..2769dc5 --- /dev/null +++ b/fw-dalaran-server/src/main/java/cn/fw/dalaran/server/task/OtherTask.java @@ -0,0 +1,59 @@ +package cn.fw.dalaran.server.task; + +import cn.fw.dalaran.domain.db.ActivityTheme; +import cn.fw.dalaran.service.Common; +import cn.fw.dalaran.service.data.ActivityThemeService; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Component; +import org.springframework.util.CollectionUtils; + +import java.io.File; +import java.util.List; +import java.util.stream.Collectors; + +/** + * @author wmy3969 + * @version 1.0 + * @date 2022/7/27 09:04 + * @Description 系统其他定时任务 + */ +@Slf4j +@Component +@ConditionalOnProperty(prefix = "task", name = "switch", havingValue = "on") +@RequiredArgsConstructor +public class OtherTask { + + private final ActivityThemeService activityThemeService;// 活动主题业务 + private final Common common; + + /** + * 每天都找已经停止抓数据7天及其更久的主题, 删除缓存封面图 + */ + @Scheduled(fixedRate = 15 * 60 * 1000, initialDelay = 5 * 1000) + public void deleteCoverFiles() { + final List themeList = activityThemeService.lambdaQuery() + .list() + .stream() + .filter(item -> activityThemeService.themeHaveStopCatchData(item.getEndTime(), 7)) + .collect(Collectors.toList());// 找到需要审计的主题 + if (CollectionUtils.isEmpty(themeList)) + return; + String tempDir = common.getActivityThemeCoverDir(); + StringBuilder sb = new StringBuilder(); + themeList.forEach(item -> { + sb.append(tempDir); + sb.append("activityTheme"); + sb.append(File.separator); + sb.append(item.getTheme()); + String dirPath = sb.toString(); + File file = new File(dirPath); + if (file.isDirectory()) + common.deleteAllFile(dirPath, file); + sb.setLength(0); + }); + } + +} diff --git a/fw-dalaran-service/src/main/java/cn/fw/dalaran/service/Common.java b/fw-dalaran-service/src/main/java/cn/fw/dalaran/service/Common.java index 460089b..75e0625 100644 --- a/fw-dalaran-service/src/main/java/cn/fw/dalaran/service/Common.java +++ b/fw-dalaran-service/src/main/java/cn/fw/dalaran/service/Common.java @@ -4,6 +4,9 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; +import java.io.File; +import java.util.Objects; + /** * @author wmy3969 * @version 1.0 @@ -28,4 +31,59 @@ public class Common { else return "/web/logs/testserver.dalaran.feewee.cn/"; } + + /** + * 删除文件 + * + * @param filePath 文件路径 + * @return 操作结果 + */ + public boolean deleteFile(String filePath) { + File file = new File(filePath); + if (file.exists() && file.isFile()) {// 如果文件路径只有单个文件 + boolean result = file.delete(); + if (result) + log.info(String.format("删除文件[%s]成功", filePath)); + else + log.info(String.format("删除文件[%s]失败", filePath)); + return result; + } else { + log.error(String.format("文件[%s]不存在", filePath)); + return false; + } + } + + /** + * 删除文件夹 + * + * @param dirPath 文件夹路径 + * @param appointedFile 指定开始递归的文件(可不传) + * @return 操作结果 + */ + public boolean deleteAllFile(String dirPath, File... appointedFile) { + File dirFile = Objects.equals(0, appointedFile.length) ? new File(dirPath) : appointedFile[0]; + if (!dirFile.isDirectory()) {// 如果dir对应的文件不存在, 或者不是一个目录, 则退出 + log.error(String.format("删除文件夹失败:[%s]不是文件夹或不存在", dirPath)); + return false; + } + // 递归删除文件夹中的所有文件包括子文件夹 + boolean flag = true; + File[] files = dirFile.listFiles(); + Objects.requireNonNull(files); + for (File file : files) { + if (file.isFile()) + flag = this.deleteFile(file.getAbsolutePath());// 删除子文件 + else if (file.isDirectory()) + flag = this.deleteAllFile(file.getAbsolutePath());// 递归 + if (!flag) { + log.error("删除文件夹失败"); + return false; + } + } + boolean result = dirFile.delete();// 删除当前文件夹 + if (result) + log.info(String.format("删除文件夹[%s]成功", dirPath)); + return result; + } + } diff --git a/fw-dalaran-service/src/main/java/cn/fw/dalaran/service/data/ActivityThemeService.java b/fw-dalaran-service/src/main/java/cn/fw/dalaran/service/data/ActivityThemeService.java index 0271e23..c733c84 100644 --- a/fw-dalaran-service/src/main/java/cn/fw/dalaran/service/data/ActivityThemeService.java +++ b/fw-dalaran-service/src/main/java/cn/fw/dalaran/service/data/ActivityThemeService.java @@ -102,4 +102,13 @@ public interface ActivityThemeService extends IService { * @param configGroupId 配置组id */ String getValidConfigJson(Long configGroupId); + + /** + * 验证主题是否结束数据抓取 + * + * @param themeEndTime 主题结束时间 + * @param delayDays 延期天数 + * @return 主题是否结束数据抓取 + */ + boolean themeHaveStopCatchData(Date themeEndTime, int delayDays); } diff --git a/fw-dalaran-service/src/main/java/cn/fw/dalaran/service/data/impl/ActivityThemeServiceImpl.java b/fw-dalaran-service/src/main/java/cn/fw/dalaran/service/data/impl/ActivityThemeServiceImpl.java index cb13901..4b2517a 100644 --- a/fw-dalaran-service/src/main/java/cn/fw/dalaran/service/data/impl/ActivityThemeServiceImpl.java +++ b/fw-dalaran-service/src/main/java/cn/fw/dalaran/service/data/impl/ActivityThemeServiceImpl.java @@ -173,7 +173,7 @@ public class ActivityThemeServiceImpl extends ServiceImpl oldTopic = Arrays.asList(theme.getTopic().split(",").clone()); ArrayList result = new ArrayList<>(newTopic); result.retainAll(oldTopic); - if (this.themeHaveStopCatchData(theme.getEndTime())) + if (this.themeHaveStopCatchData(theme.getEndTime(), 0)) throw new BusinessException("活动已经结束数据抓取, 不能再增加话题"); if (result.size() < oldTopic.size()) throw new BusinessException("不允许删除原有话题"); @@ -198,7 +198,7 @@ public class ActivityThemeServiceImpl extends ServiceImpl item.setType(FileTypeEnum.THEME_COVER.getValue())) .collect(Collectors.toList()); ActivityTheme theme = this.getById(themeId); - if (this.themeHaveStopCatchData(theme.getEndTime())) + if (this.themeHaveStopCatchData(theme.getEndTime(), 0)) throw new BusinessException("活动已经结束数据抓取, 不能再增加封面"); this.saveFiles(themeId, fileList); this.downloadAndConvertCover(theme, fileList); @@ -403,14 +403,16 @@ public class ActivityThemeServiceImpl extends ServiceImpl 24 * 3600 * 1000 + 1000; + return timeSub > (1 + delayDays) * 24 * 3600 * 1000L + 1000; } /** @@ -419,7 +421,7 @@ public class ActivityThemeServiceImpl extends ServiceImpl