Browse Source

删除redis延迟队列代码, 使用定时任务凌晨删除下载的pdf固化文件

jingyuanchao 1 năm trước cách đây
mục cha
commit
de71135335

+ 3 - 0
project_data/sql/0.0.4/quartz/quartz.sql

@@ -0,0 +1,3 @@
+
+-- 新增定时任务登记簿临时文件删除:凌晨删除下载的固化pdf
+INSERT INTO `sys_job`(`job_id`, `job_name`, `job_group`, `invoke_target`, `cron_expression`, `misfire_policy`, `concurrent`, `status`, `create_by`, `create_time`, `update_by`, `update_time`) VALUES (213, '登记簿临时文件删除', 'DEFAULT', 'RegisterBookPdfTask.deletedZipFile()', '59 59 23 * * ?', '1', '1', '0', null,now(), null, NULL);

+ 3 - 0
soc-api/soc-api-system/src/main/java/com/xunmei/system/api/RemoteFileService.java

@@ -80,4 +80,7 @@ public interface RemoteFileService {
 
     @PostMapping(value = "/file/cutFileCompress")
     void cutFileCompress(@RequestBody CoreRegisterBookPdfExportDto exportDto);
+
+    @GetMapping(value = "/file/deletedZipFile")
+    void deletedZipFile();
 }

+ 5 - 0
soc-api/soc-api-system/src/main/java/com/xunmei/system/api/factory/RemoteFileFallbackFactory.java

@@ -75,6 +75,11 @@ public class RemoteFileFallbackFactory implements FallbackFactory<RemoteFileServ
             public void cutFileCompress(CoreRegisterBookPdfExportDto exportDto) {
 
             }
+
+            @Override
+            public void deletedZipFile() {
+
+            }
         };
     }
 }

+ 0 - 80
soc-common/soc-common-redis/src/main/java/com/xunmei/common/redis/delay/RedisDelayedQueue.java

@@ -1,80 +0,0 @@
-package com.xunmei.common.redis.delay;
-
-
-import lombok.extern.slf4j.Slf4j;
-import org.redisson.api.RBlockingQueue;
-import org.redisson.api.RDelayedQueue;
-import org.redisson.api.RedissonClient;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Component;
-
-import java.util.concurrent.TimeUnit;
-
-/**
- * Redis 延时队列
- */
-@Component
-@Slf4j
-public class RedisDelayedQueue {
-
-    @Autowired
-    private RedissonClient redissonClient;
-
-    /**
-     * 添加对象进延时队列
-     * @param putInData 添加数据
-     * @param delay     延时时间
-     * @param timeUnit  时间单位
-     * @param queueName 队列名称
-     * @param <T>
-     */
-    private <T> void addQueue(T putInData, long delay, TimeUnit timeUnit, String queueName){
-        log.info("添加延迟队列,监听名称:{},时间:{},时间单位:{},内容:{}" , queueName, delay, timeUnit,putInData);
-        RBlockingQueue<T> blockingFairQueue = redissonClient.getBlockingQueue(queueName);
-        RDelayedQueue<T> delayedQueue = redissonClient.getDelayedQueue(blockingFairQueue);
-        delayedQueue.offer(putInData, delay, timeUnit);
-    }
-
-    /**
-     * 添加队列-秒
-     *
-     * @param t     DTO传输类
-     * @param delay 时间数量
-     * @param <T>   泛型
-     */
-    public <T> void addQueueSeconds(T t, long delay, Class<? extends RedisDelayedQueueListener> clazz) {
-        addQueue(t, delay, TimeUnit.SECONDS, clazz.getName());
-    }
-
-    /**
-     * 添加队列-分
-     *
-     * @param t     DTO传输类
-     * @param delay 时间数量
-     * @param <T>   泛型
-     */
-    public <T> void addQueueMinutes(T t, long delay, Class<? extends RedisDelayedQueueListener> clazz) {
-        addQueue(t, delay, TimeUnit.MINUTES, clazz.getName());
-    }
-
-    /**
-     * 添加队列-时
-     *
-     * @param t     DTO传输类
-     * @param delay 时间数量
-     * @param <T>   泛型
-     */
-    public <T> void addQueueHours(T t, long delay, Class<? extends RedisDelayedQueueListener> clazz) {
-        addQueue(t, delay, TimeUnit.HOURS, clazz.getName());
-    }
-    /**
-     * 添加队列-天
-     *
-     * @param t     DTO传输类
-     * @param delay 时间数量
-     * @param <T>   泛型
-     */
-    public <T> void addQueueDays(T t, long delay, Class<? extends RedisDelayedQueueListener> clazz) {
-        addQueue(t, delay, TimeUnit.DAYS, clazz.getName());
-    }
-}

+ 0 - 59
soc-common/soc-common-redis/src/main/java/com/xunmei/common/redis/delay/RedisDelayedQueueInit.java

@@ -1,59 +0,0 @@
-package com.xunmei.common.redis.delay;
-
-
-import com.alibaba.fastjson2.JSON;
-import lombok.extern.slf4j.Slf4j;
-import org.redisson.api.RBlockingQueue;
-import org.redisson.api.RedissonClient;
-import org.springframework.beans.BeansException;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.context.ApplicationContext;
-import org.springframework.context.ApplicationContextAware;
-import org.springframework.stereotype.Component;
-
-import java.util.Map;
-
-/**
- * redis 延时队列初始化
- */
-@Component
-@Slf4j
-public class RedisDelayedQueueInit implements ApplicationContextAware {
-    @Autowired
-    private RedissonClient redissonClient;
-
-    @Override
-    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
-        Map<String, RedisDelayedQueueListener> map = applicationContext.getBeansOfType(RedisDelayedQueueListener.class);
-        for (Map.Entry<String, RedisDelayedQueueListener> taskEventListenerEntry : map.entrySet()) {
-            String listenerName = taskEventListenerEntry.getValue().getClass().getName();
-
-            startThread(listenerName, taskEventListenerEntry.getValue());
-        }
-    }
-
-    /**
-     * 启动线程获取队列
-     *
-     * @param queueName                 队列名称
-     * @param redisDelayedQueueListener 任务回调监听
-     */
-    private <T> void startThread(String queueName, RedisDelayedQueueListener redisDelayedQueueListener) {
-        RBlockingQueue<T> blockingFairQueue = redissonClient.getBlockingQueue(queueName);
-        //由于此线程需要常驻,可以新建线程,不用交给线程池管理
-        Thread thread = new Thread(() -> {
-            log.info("启动监听队列线程" + queueName);
-            try {
-                while (true) {
-                    T t = blockingFairQueue.take();
-                    log.info("监听队列线程{},获取到值:{}", queueName, JSON.toJSONString(t));
-                    redisDelayedQueueListener.invoke(t);
-                }
-            } catch (Exception e) {
-                log.info("监听队列线程错误,", e);
-            }
-        });
-        thread.setName(queueName);
-        thread.start();
-    }
-}

+ 0 - 10
soc-common/soc-common-redis/src/main/java/com/xunmei/common/redis/delay/RedisDelayedQueueListener.java

@@ -1,10 +0,0 @@
-package com.xunmei.common.redis.delay;
-
-public interface RedisDelayedQueueListener<T> {
-
-    /**
-     * 执行方法
-     * @param t
-     */
-    void invoke(T t);
-}

+ 0 - 18
soc-common/soc-common-redis/src/main/java/com/xunmei/common/redis/delay/RegisterBookFileExpirationListener.java

@@ -1,18 +0,0 @@
-package com.xunmei.common.redis.delay;
-
-
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Component;
-
-import java.io.File;
-
-@Component
-@Slf4j
-public class RegisterBookFileExpirationListener implements RedisDelayedQueueListener<String> {
-    @Override
-    public void invoke(String filePath) {
-        File file = new File(filePath);
-        boolean delete = file.delete();
-        log.info(" 登记簿延迟删除文件:{},删除结果 : {} ", filePath, delete ? "成功" : "失败");
-    }
-}

+ 5 - 0
soc-modules/soc-modules-file/src/main/java/com/xunmei/file/controller/SysFileController.java

@@ -193,4 +193,9 @@ public class SysFileController {
     void cutFileCompress(@RequestBody CoreRegisterBookPdfExportDto exportDto){
         sysFileService.cutFileCompress(exportDto);
     }
+
+    @GetMapping(value = "/deletedZipFile")
+    void deletedZipFile(){
+        sysFileService.deletedZipFile();
+    }
 }

+ 1 - 0
soc-modules/soc-modules-file/src/main/java/com/xunmei/file/service/ISysFileService.java

@@ -73,4 +73,5 @@ public interface ISysFileService
 
     void cutFileCompress(CoreRegisterBookPdfExportDto exportDto);
 
+    void deletedZipFile();
 }

+ 23 - 11
soc-modules/soc-modules-file/src/main/java/com/xunmei/file/service/LocalSysFileServiceImpl.java

@@ -17,8 +17,6 @@ import com.xunmei.common.core.domain.registerbook.vo.PdfToZipTempVo;
 import com.xunmei.common.core.enums.RegisterBookType;
 import com.xunmei.common.core.utils.DateHelper;
 import com.xunmei.common.core.utils.uuid.UUID;
-import com.xunmei.common.redis.delay.RedisDelayedQueue;
-import com.xunmei.common.redis.delay.RegisterBookFileExpirationListener;
 import com.xunmei.common.redis.utils.RedisUtils;
 import com.xunmei.file.utils.FileDownUtils;
 import com.xunmei.file.utils.FileUploadUtils;
@@ -37,6 +35,9 @@ import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.context.annotation.Primary;
+import org.springframework.data.redis.core.BoundValueOperations;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.http.HttpHeaders;
 import org.springframework.http.MediaType;
 import org.springframework.stereotype.Service;
@@ -80,10 +81,8 @@ public class LocalSysFileServiceImpl implements ISysFileService {
 
     @Autowired
     private HttpServletRequest request;
-
     @Autowired
-    private RedisDelayedQueue delayedQueue;
-
+    private StringRedisTemplate redisTemplate;
 
     private static PdfFilePathVo getLocalFilePath(String localFilePath, String businessType, String fileName) {
         fileName = filterPath(fileName);
@@ -641,8 +640,8 @@ public class LocalSysFileServiceImpl implements ISysFileService {
             response.setContentType("application/octet-stream");
             response.setHeader("Content-Disposition", "attachment; filename=" + zipName);
             List<PdfToZipTempVo> pdfToZipTempVoList = registerBookPdfList.parallelStream().map(pdf -> {
-                return resolve(pdf, count);
-            }).filter(Objects::nonNull)
+                        return resolve(pdf, count);
+                    }).filter(Objects::nonNull)
                     .collect(Collectors.toList());
             count.await();
             pdfToZipTempVoList.removeIf(pdfToZipTempVo -> !FileUtil.exist(pdfToZipTempVo.getFile()));
@@ -775,8 +774,8 @@ public class LocalSysFileServiceImpl implements ISysFileService {
                 zipName = URLEncoder.encode(fileNameStr + ".zip", "UTF-8");
 
                 List<PdfToZipTempVo> pdfToZipTempVoList = list.parallelStream().map(pdf -> {
-                    return resolve(pdf, count);
-                }).filter(Objects::nonNull)
+                            return resolve(pdf, count);
+                        }).filter(Objects::nonNull)
                         .collect(Collectors.toList());
                 pdfToZipTempVoList.removeIf(pdfToZipTempVo -> !FileUtil.exist(pdfToZipTempVo.getFile()));
                 log.info("登记簿全部下载完成,开始压缩文件,数量:{}", pdfToZipTempVoList.size());
@@ -822,11 +821,12 @@ public class LocalSysFileServiceImpl implements ISysFileService {
         pdfLocalFileTempVo.setIsRegisterBookPage(pdfDto.getIsRegisterBookPage());
         pdfLocalFileTempVo.setCreateTime(new Date());
         //此处localFileName 为文件的绝对路径,存在redis延迟队列中,一个小时后删除文件
-        delayedQueue.addQueueHours(pdfLocalFileTempVo.getLocalFileName(), 1, RegisterBookFileExpirationListener.class);
         localFileName = localFileName.replace(this.localFilePath + File.separator, "");
         //此处localFileName 为文件名称,存入redis中,用于页面展示文件名称,下载
         //RedisUtils.setCacheObject(URLDecoder.decode(localFileName, "UTF-8"), JSON.toJSONString(pdfLocalFileTempVo),true);
-        RedisUtils.setCacheObject(URLDecoder.decode(localFileName, "UTF-8"), JSON.toJSONString(pdfLocalFileTempVo), Duration.ofMillis(3500 * 1000L));
+        final BoundValueOperations ops = redisTemplate.boundValueOps(URLDecoder.decode(localFileName, "UTF-8"));
+        ops.set(JSON.toJSONString(pdfLocalFileTempVo));
+        ops.expireAt(DateUtil.endOfDay(new Date()));
     }
 
     private List<List<CoreRegisterBookPdfPageVo>> checkSubList(CoreRegisterBookPdfExportDto pdfDto) {
@@ -888,4 +888,16 @@ public class LocalSysFileServiceImpl implements ISysFileService {
         return fileSizeMB.toString();
     }
 
+    @Override
+    public void deletedZipFile() {
+        final File dir = new File(this.localFilePath);
+        final File[] files = dir.listFiles();
+        if (ObjectUtil.isNull(files) || ObjectUtil.isEmpty(files)) {
+            return;
+        }
+        Arrays.stream(files)
+                .filter(file -> file.getName().startsWith(CacheConstants.REGISTER_PDF_FILE_KEY))
+                .filter(file->file.getName().endsWith(".zip"))
+                .forEach(FileUtil::del);
+    }
 }

+ 29 - 0
soc-modules/soc-modules-job/src/main/java/com/xunmei/job/task/RegisterBookPdfTask.java

@@ -0,0 +1,29 @@
+package com.xunmei.job.task;
+
+import cn.hutool.core.lang.UUID;
+import com.alibaba.fastjson2.JSON;
+import com.xunmei.common.core.web.domain.AjaxResult;
+import com.xunmei.system.api.RemoteDrillService;
+import com.xunmei.system.api.RemoteFileService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.Date;
+
+/**
+ * @author jingyuanchao
+ * @date 2023/11/29 14:30
+ */
+
+@Slf4j
+@Component("RegisterBookPdfTask")
+public class RegisterBookPdfTask {
+
+    @Autowired
+    RemoteFileService remoteFileService;
+
+    public void deletedZipFile() {
+        remoteFileService.deletedZipFile();
+    }
+}