소스 검색

加入线程池配置和pdf锁

wangliang 11 달 전
부모
커밋
a96ecc80a4

+ 140 - 133
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TBTaskPdfServiceImpl.java

@@ -1,133 +1,140 @@
-package com.qmth.distributed.print.business.service.impl;
-
-import cn.hutool.core.date.DateUtil;
-import cn.hutool.cron.TaskTable;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
-import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.qmth.boot.api.exception.ApiException;
-import com.qmth.distributed.print.business.entity.TBTaskPdf;
-import com.qmth.distributed.print.business.mapper.TBTaskPdfMapper;
-import com.qmth.distributed.print.business.service.TBTaskPdfService;
-import com.qmth.teachcloud.common.bean.result.TaskPdfResult;
-import com.qmth.teachcloud.common.bean.result.TbTaskDetailResult;
-import com.qmth.teachcloud.common.contant.SystemConstant;
-import com.qmth.teachcloud.common.entity.SysUser;
-import com.qmth.teachcloud.common.entity.TBTask;
-import com.qmth.teachcloud.common.enums.*;
-import com.qmth.teachcloud.common.util.ResultUtil;
-import org.apache.commons.lang3.StringUtils;
-import org.springframework.stereotype.Service;
-
-import java.text.MessageFormat;
-import java.util.Date;
-import java.util.List;
-import java.util.Objects;
-import java.util.StringJoiner;
-
-/**
- * <p>
- * 导入导出任务表 服务实现类
- * </p>
- *
- * @author xf
- * @since 2024-02-06
- */
-@Service
-public class TBTaskPdfServiceImpl extends ServiceImpl<TBTaskPdfMapper, TBTaskPdf> implements TBTaskPdfService {
-
-    @Override
-    public boolean updateStatusById(TaskStatusEnum status, TaskResultEnum result, String summary, Long id) {
-        UpdateWrapper<TBTaskPdf> updateWrapper = new UpdateWrapper<>();
-        LambdaUpdateWrapper<TBTaskPdf> lambda = updateWrapper.lambda();
-        lambda.set(TBTaskPdf::getStatus, status)
-                .set(TBTaskPdf::getResult, result);
-        if (StringUtils.isNotBlank(summary)) {
-            lambda.set(TBTaskPdf::getSummary, status);
-        }
-        lambda.eq(TBTaskPdf::getId, id);
-        return this.update(updateWrapper);
-    }
-
-    @Override
-    public TBTaskPdf saveTask(TbTaskDetailResult tbTaskDetailResult, Long printPlanId, SysUser user, Long examDetailId) {
-        try {
-            TBTaskPdf tbTaskPdf = this.getById(examDetailId);
-            if (tbTaskPdf == null) {
-                tbTaskPdf = new TBTaskPdf(examDetailId, user.getSchoolId(), tbTaskDetailResult.getSemesterId(), tbTaskDetailResult.getExamId(), printPlanId, tbTaskDetailResult.getCourseNameCode(), tbTaskDetailResult.getPaperNumber(), user.getId());
-                this.save(tbTaskPdf);
-            } else {
-                if (!TaskStatusEnum.RUNNING.equals(tbTaskPdf.getStatus())) {
-                    tbTaskPdf.setStatus(TaskStatusEnum.INIT);
-                    tbTaskPdf.setResult(null);
-                    tbTaskPdf.setSummary(MessageFormat.format("{0}{1}{2}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), "->", "PDF待生成"));
-                    this.updateById(tbTaskPdf);
-                }
-            }
-            return tbTaskPdf;
-        } catch (Exception e) {
-            log.error(SystemConstant.LOG_ERROR, e);
-            if (e instanceof ApiException) {
-                ResultUtil.error((ApiException) e, ((ApiException) e).getCode(), e.getMessage());
-            } else {
-                ResultUtil.error(e.getMessage());
-            }
-        }
-        return null;
-    }
-
-    @Override
-    public void resetRunningCreatePdf(Long id, CreatePdfTypeEnum type) {
-        TBTaskPdf tbTaskPdf = this.getById(id);
-        if (TaskStatusEnum.RUNNING.equals(tbTaskPdf.getStatus())) {
-            throw ExceptionResultEnum.ERROR.exception("任务正在生成中,请稍后再试");
-        }
-        tbTaskPdf.setStatus(TaskStatusEnum.INIT);
-        tbTaskPdf.setCreateType(type);
-        tbTaskPdf.setResult(null);
-        tbTaskPdf.setUpdateTime(null);
-        tbTaskPdf.setSummary(MessageFormat.format("{0}{1}{2}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), "->", "重置成功,PDF待生成"));
-        this.updateById(tbTaskPdf);
-    }
-
-    @Override
-    public int countRunningByExamDetailIds(List<Long> examDetailIds) {
-        QueryWrapper<TBTaskPdf> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().in(TBTaskPdf::getId, examDetailIds)
-                .eq(TBTaskPdf::getStatus, TaskStatusEnum.RUNNING);
-        return this.count(queryWrapper);
-    }
-
-    @Override
-    public IPage<TaskPdfResult> pageData(Page<TaskPdfResult> page, Long examId, String printPlanId, String courseCode, String paperNumber, TaskStatusEnum status, TaskResultEnum result, String examPlace, String examRoom, Long examStartTime, Long examEndTime) {
-        if (examId == null) {
-            throw ExceptionResultEnum.ERROR.exception("请选择考试");
-        }
-        return this.baseMapper.pageData(page, examId, printPlanId, courseCode, paperNumber, status, result, examPlace, examRoom, examStartTime, examEndTime);
-    }
-
-    @Override
-    public List<TBTaskPdf> listWaitingTask() {
-        QueryWrapper<TBTaskPdf> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().eq(TBTaskPdf::getStatus, TaskStatusEnum.INIT)
-                .orderByAsc(TBTaskPdf::getSchoolId)
-                .orderByAsc(TBTaskPdf::getId);
-        return this.list(queryWrapper);
-    }
-
-    @Override
-    public boolean countByPrintPlanIdAndEntityId(Long schoolId, Long printPlanId) {
-        QueryWrapper<TBTaskPdf> queryWrapper = new QueryWrapper<>();
-        queryWrapper.lambda().ne(TBTaskPdf::getStatus, TaskStatusEnum.FINISH);
-        if (Objects.nonNull(schoolId)) {
-            queryWrapper.lambda().eq(TBTaskPdf::getSchoolId, schoolId);
-        }
-        if (Objects.nonNull(printPlanId)) {
-            queryWrapper.lambda().eq(TBTaskPdf::getPrintPlanId, printPlanId);
-        }
-        return this.count(queryWrapper) == 0;
-    }
-}
+package com.qmth.distributed.print.business.service.impl;
+
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.cron.TaskTable;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qmth.boot.api.exception.ApiException;
+import com.qmth.distributed.print.business.entity.TBTaskPdf;
+import com.qmth.distributed.print.business.mapper.TBTaskPdfMapper;
+import com.qmth.distributed.print.business.service.TBTaskPdfService;
+import com.qmth.teachcloud.common.bean.result.TaskPdfResult;
+import com.qmth.teachcloud.common.bean.result.TbTaskDetailResult;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.SysConfig;
+import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.entity.TBTask;
+import com.qmth.teachcloud.common.enums.*;
+import com.qmth.teachcloud.common.service.CommonCacheService;
+import com.qmth.teachcloud.common.util.ResultUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.Resource;
+import java.text.MessageFormat;
+import java.util.*;
+
+/**
+ * <p>
+ * 导入导出任务表 服务实现类
+ * </p>
+ *
+ * @author xf
+ * @since 2024-02-06
+ */
+@Service
+public class TBTaskPdfServiceImpl extends ServiceImpl<TBTaskPdfMapper, TBTaskPdf> implements TBTaskPdfService {
+
+    @Resource
+    CommonCacheService commonCacheService;
+
+    @Override
+    public boolean updateStatusById(TaskStatusEnum status, TaskResultEnum result, String summary, Long id) {
+        UpdateWrapper<TBTaskPdf> updateWrapper = new UpdateWrapper<>();
+        LambdaUpdateWrapper<TBTaskPdf> lambda = updateWrapper.lambda();
+        lambda.set(TBTaskPdf::getStatus, status)
+                .set(TBTaskPdf::getResult, result);
+        if (StringUtils.isNotBlank(summary)) {
+            lambda.set(TBTaskPdf::getSummary, status);
+        }
+        lambda.eq(TBTaskPdf::getId, id);
+        return this.update(updateWrapper);
+    }
+
+    @Override
+    public TBTaskPdf saveTask(TbTaskDetailResult tbTaskDetailResult, Long printPlanId, SysUser user, Long examDetailId) {
+        try {
+            TBTaskPdf tbTaskPdf = this.getById(examDetailId);
+            if (tbTaskPdf == null) {
+                tbTaskPdf = new TBTaskPdf(examDetailId, user.getSchoolId(), tbTaskDetailResult.getSemesterId(), tbTaskDetailResult.getExamId(), printPlanId, tbTaskDetailResult.getCourseNameCode(), tbTaskDetailResult.getPaperNumber(), user.getId());
+                this.save(tbTaskPdf);
+            } else {
+                if (!TaskStatusEnum.RUNNING.equals(tbTaskPdf.getStatus())) {
+                    tbTaskPdf.setStatus(TaskStatusEnum.INIT);
+                    tbTaskPdf.setResult(null);
+                    tbTaskPdf.setSummary(MessageFormat.format("{0}{1}{2}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), "->", "PDF待生成"));
+                    this.updateById(tbTaskPdf);
+                }
+            }
+            return tbTaskPdf;
+        } catch (Exception e) {
+            log.error(SystemConstant.LOG_ERROR, e);
+            if (e instanceof ApiException) {
+                ResultUtil.error((ApiException) e, ((ApiException) e).getCode(), e.getMessage());
+            } else {
+                ResultUtil.error(e.getMessage());
+            }
+        }
+        return null;
+    }
+
+    @Override
+    public void resetRunningCreatePdf(Long id, CreatePdfTypeEnum type) {
+        TBTaskPdf tbTaskPdf = this.getById(id);
+        if (TaskStatusEnum.RUNNING.equals(tbTaskPdf.getStatus())) {
+            throw ExceptionResultEnum.ERROR.exception("任务正在生成中,请稍后再试");
+        }
+        tbTaskPdf.setStatus(TaskStatusEnum.INIT);
+        tbTaskPdf.setCreateType(type);
+        tbTaskPdf.setResult(null);
+        tbTaskPdf.setUpdateTime(null);
+        tbTaskPdf.setSummary(MessageFormat.format("{0}{1}{2}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), "->", "重置成功,PDF待生成"));
+        this.updateById(tbTaskPdf);
+    }
+
+    @Override
+    public int countRunningByExamDetailIds(List<Long> examDetailIds) {
+        QueryWrapper<TBTaskPdf> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().in(TBTaskPdf::getId, examDetailIds)
+                .eq(TBTaskPdf::getStatus, TaskStatusEnum.RUNNING);
+        return this.count(queryWrapper);
+    }
+
+    @Override
+    public IPage<TaskPdfResult> pageData(Page<TaskPdfResult> page, Long examId, String printPlanId, String courseCode, String paperNumber, TaskStatusEnum status, TaskResultEnum result, String examPlace, String examRoom, Long examStartTime, Long examEndTime) {
+        if (examId == null) {
+            throw ExceptionResultEnum.ERROR.exception("请选择考试");
+        }
+        return this.baseMapper.pageData(page, examId, printPlanId, courseCode, paperNumber, status, result, examPlace, examRoom, examStartTime, examEndTime);
+    }
+
+    @Override
+    public List<TBTaskPdf> listWaitingTask() {
+        SysConfig sysConfig = commonCacheService.addSysConfigCache(SystemConstant.CREATE_PDF_JOB_DB_LIMIT);
+        QueryWrapper<TBTaskPdf> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().eq(TBTaskPdf::getStatus, TaskStatusEnum.INIT)
+                .orderByAsc(TBTaskPdf::getSchoolId)
+                .orderByAsc(TBTaskPdf::getId);
+        if (Objects.nonNull(sysConfig)) {
+            queryWrapper.last(" " + sysConfig.getConfigValue() + " ");
+        }
+        return this.list(queryWrapper);
+    }
+
+    @Override
+    public boolean countByPrintPlanIdAndEntityId(Long schoolId, Long printPlanId) {
+        QueryWrapper<TBTaskPdf> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda().ne(TBTaskPdf::getStatus, TaskStatusEnum.FINISH);
+        if (Objects.nonNull(schoolId)) {
+            queryWrapper.lambda().eq(TBTaskPdf::getSchoolId, schoolId);
+        }
+        if (Objects.nonNull(printPlanId)) {
+            queryWrapper.lambda().eq(TBTaskPdf::getPrintPlanId, printPlanId);
+        }
+        return this.count(queryWrapper) == 0;
+    }
+}

+ 27 - 36
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncCreatePdfTemplateService.java

@@ -14,8 +14,6 @@ import com.qmth.teachcloud.common.enums.TaskResultEnum;
 import com.qmth.teachcloud.common.enums.TaskStatusEnum;
 import com.qmth.teachcloud.common.util.Result;
 import com.qmth.teachcloud.common.util.ResultUtil;
-import com.qmth.teachcloud.mark.enums.LockType;
-import com.qmth.teachcloud.mark.lock.LockService;
 import org.apache.commons.collections4.CollectionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -51,42 +49,35 @@ public class AsyncCreatePdfTemplateService extends AsyncCreateTaskTemplete {
      */
     @Override
     public Result createPdf(TBTaskPdf tbTaskPdf, CallbackCreatePdf callbackCreatePdf) {
-        LockService lockService = SpringContextHolder.getBean(LockService.class);
-        if (lockService.trylock(LockType.CREATE_PDF, tbTaskPdf.getId())) {
-            try {
-                StringJoiner stringJoinerSummary = new StringJoiner("\n").add(MessageFormat.format("{0}{1}{2}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), BEGIN_TITLE, OBJ_TITLE));
-                SystemConstant.addSummary(stringJoinerSummary, "开始处理PDF文件生成数据");
-                TBTaskPdfService tbTaskPdfService = SpringContextHolder.getBean(TBTaskPdfService.class);
-                // 任务状态为进行中,直接结束
-                if (TaskStatusEnum.RUNNING.equals(tbTaskPdf.getStatus())) {
-                    return ResultUtil.ok();
-                }
-                tbTaskPdf.setStatus(TaskStatusEnum.RUNNING);
-                tbTaskPdfService.updateById(tbTaskPdf);
-                List<ExamDetailCourse> examDetailCourseList = null;
-                try {
-                    PdfTaskLogicService pdfTaskLogicService = SpringContextHolder.getBean(PdfTaskLogicService.class);
-                    examDetailCourseList = pdfTaskLogicService.executeCreatePdfLogic(tbTaskPdf, stringJoinerSummary);
-                    tbTaskPdf.setResult(TaskResultEnum.SUCCESS);
-                } catch (Exception e) {
-                    SystemConstant.addSummary(stringJoinerSummary, "数据处理完成且发生异常。异常信息为[" + e.getMessage() + "]");
-                    tbTaskPdf.setResult(TaskResultEnum.ERROR);
-                } finally {
-                    tbTaskPdf.setStatus(TaskStatusEnum.FINISH);
-                    tbTaskPdf.setSummary(stringJoinerSummary.toString());
-                    tbTaskPdf.setUpdateTime(System.currentTimeMillis());
-                    tbTaskPdfService.updateById(tbTaskPdf);
+        StringJoiner stringJoinerSummary = new StringJoiner("\n").add(MessageFormat.format("{0}{1}{2}", DateUtil.format(new Date(), SystemConstant.DEFAULT_DATE_PATTERN), BEGIN_TITLE, OBJ_TITLE));
+        SystemConstant.addSummary(stringJoinerSummary, "开始处理PDF文件生成数据");
+        TBTaskPdfService tbTaskPdfService = SpringContextHolder.getBean(TBTaskPdfService.class);
+        // 任务状态为进行中,直接结束
+        if (TaskStatusEnum.RUNNING.equals(tbTaskPdf.getStatus())) {
+            return ResultUtil.ok();
+        }
+        tbTaskPdf.setStatus(TaskStatusEnum.RUNNING);
+        tbTaskPdfService.updateById(tbTaskPdf);
+        List<ExamDetailCourse> examDetailCourseList = null;
+        try {
+            PdfTaskLogicService pdfTaskLogicService = SpringContextHolder.getBean(PdfTaskLogicService.class);
+            examDetailCourseList = pdfTaskLogicService.executeCreatePdfLogic(tbTaskPdf, stringJoinerSummary);
+            tbTaskPdf.setResult(TaskResultEnum.SUCCESS);
+        } catch (Exception e) {
+            SystemConstant.addSummary(stringJoinerSummary, "数据处理完成且发生异常。异常信息为[" + e.getMessage() + "]");
+            tbTaskPdf.setResult(TaskResultEnum.ERROR);
+        } finally {
+            tbTaskPdf.setStatus(TaskStatusEnum.FINISH);
+            tbTaskPdf.setSummary(stringJoinerSummary.toString());
+            tbTaskPdf.setUpdateTime(System.currentTimeMillis());
+            tbTaskPdfService.updateById(tbTaskPdf);
 
-                    if (TaskResultEnum.SUCCESS.equals(tbTaskPdf.getResult()) && CollectionUtils.isNotEmpty(examDetailCourseList)) {
-                        ExamTaskWholeService examTaskWholeService = SpringContextHolder.getBean(ExamTaskWholeService.class);
-                        for (ExamDetailCourse examDetailCourse : examDetailCourseList) {
-                            // 生成合并文件
-                            examTaskWholeService.checkAndCreateTask(tbTaskPdf.getExamId(), examDetailCourse.getCourseId(), examDetailCourse.getPaperNumber());
-                        }
-                    }
+            if (TaskResultEnum.SUCCESS.equals(tbTaskPdf.getResult()) && CollectionUtils.isNotEmpty(examDetailCourseList)) {
+                ExamTaskWholeService examTaskWholeService = SpringContextHolder.getBean(ExamTaskWholeService.class);
+                for (ExamDetailCourse examDetailCourse : examDetailCourseList) {
+                    // 生成合并文件
+                    examTaskWholeService.checkAndCreateTask(tbTaskPdf.getExamId(), examDetailCourse.getCourseId(), examDetailCourse.getPaperNumber());
                 }
-            } finally {
-                lockService.unlock(LockType.CREATE_PDF, tbTaskPdf.getId());
             }
         }
         return ResultUtil.ok(tbTaskPdf);

+ 3 - 0
distributed-print/install/mysql/upgrade/3.4.0.sql

@@ -236,4 +236,7 @@ UPDATE sys_privilege
 SET name='查看详情', url='Detail', `type`='LINK', parent_id=946, `sequence`=4, property='AUTH', related='953,954,955,956,957,958,959,960,969,1139,2105', enable=1, default_auth=0, front_display=1
 WHERE id=950;
 
+INSERT INTO sys_config
+(id, school_id, org_id, config_key, config_name, config_value, remark, enable, sort, create_id, create_time, update_id, update_time)
+VALUES(42, NULL, NULL, 'create.pdf.job.db.limit', '创建pdf查询条数', 'limit 0,100', NULL, 1, 18, 1, NULL, NULL, NULL);
 

+ 1 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java

@@ -173,6 +173,7 @@ public class SystemConstant {
     public static final String ATTACHMENT_TYPE = "attachment.type";
     public static final String ATTACHMENT_LENGTH = "attachment.length";
     public static final String ATTACHMENT_SIZE = "attachment.size";
+    public static final String CREATE_PDF_JOB_DB_LIMIT = "create.pdf.job.db.limit";
 //    public static final String AUTO_CREATE_PDF_RESET_MAX_COUNT = "auto.create.pdf.reset.max.count";
     public static final String THREAD_POOL_CORE_SIZE = "thread.pool.core.size";
     public static final String CUSTOM_THREAD_POOL_CORE_SIZE = "custom.thread.pool.core.size";

+ 13 - 4
teachcloud-task/src/main/java/com/qmth/teachcloud/task/job/CreatePdfTaskJob.java

@@ -1,6 +1,8 @@
 package com.qmth.teachcloud.task.job;
 
 import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.mark.enums.LockType;
+import com.qmth.teachcloud.mark.lock.LockService;
 import com.qmth.teachcloud.task.job.service.JobService;
 import org.quartz.JobExecutionContext;
 import org.slf4j.Logger;
@@ -18,12 +20,19 @@ public class CreatePdfTaskJob extends QuartzJobBean {
     @Resource
     JobService jobService;
 
+    @Resource
+    LockService lockService;
+
     @Override
     protected void executeInternal(JobExecutionContext jobExecutionContext) {
-        try {
-            jobService.createPdfTask();
-        } catch (Exception e) {
-            log.error(SystemConstant.LOG_ERROR, e);
+        if (lockService.trylock(LockType.CREATE_PDF, LockType.CREATE_PDF.name())) {
+            try {
+                jobService.createPdfTask();
+            } catch (Exception e) {
+                log.error(SystemConstant.LOG_ERROR, e);
+            } finally {
+                lockService.unlock(LockType.CREATE_PDF, LockType.CREATE_PDF.name());
+            }
         }
     }
 }