Explorar o código

加入动态线程池

wangliang hai 9 meses
pai
achega
c7f42b446d
Modificáronse 15 ficheiros con 589 adicións e 430 borrados
  1. 253 241
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TBTaskPdf.java
  2. 44 23
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/TBTaskPdfMapper.java
  3. 58 41
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/TBTaskPdfService.java
  4. 31 4
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TBTaskPdfServiceImpl.java
  5. 1 6
      distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncCreatePdfTemplateService.java
  6. 8 0
      distributed-print-business/src/main/resources/mapper/TBTaskPdfMapper.xml
  7. 2 2
      distributed-print/src/main/java/com/qmth/distributed/print/DistributedPrintApplication.java
  8. 1 1
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/contant/SystemConstant.java
  9. 138 0
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/threadPool/DynamicMyThreadPool.java
  10. 0 79
      teachcloud-common/src/main/java/com/qmth/teachcloud/common/threadPool/MyThreadPool.java
  11. 1 1
      teachcloud-common/src/main/resources/mapper/TSAuthMapper.xml
  12. 2 2
      teachcloud-report/src/main/java/com/qmth/teachcloud/report/TeachcloudReportApplication.java
  13. 3 3
      teachcloud-task/src/main/java/com/qmth/teachcloud/task/config/RedisListenerConfig.java
  14. 3 16
      teachcloud-task/src/main/java/com/qmth/teachcloud/task/job/CreatePdfTaskJob.java
  15. 44 11
      teachcloud-task/src/main/java/com/qmth/teachcloud/task/job/service/impl/JobServiceImpl.java

+ 253 - 241
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TBTaskPdf.java

@@ -1,241 +1,253 @@
-package com.qmth.distributed.print.business.entity;
-
-import com.baomidou.mybatisplus.annotation.*;
-
-import java.io.Serializable;
-
-import com.qmth.teachcloud.common.enums.CreatePdfTypeEnum;
-import com.qmth.teachcloud.common.enums.TaskResultEnum;
-import com.qmth.teachcloud.common.enums.TaskStatusEnum;
-import io.swagger.annotations.ApiModel;
-import io.swagger.annotations.ApiModelProperty;
-
-/**
- * <p>
- * pdf生成日志表
- * </p>
- *
- * @author xf
- * @since 2024-02-06
- */
-@TableName("t_b_task_pdf")
-@ApiModel(value = "TBTaskPdf对象", description = "pdf生成日志表")
-public class TBTaskPdf implements Serializable {
-
-    private static final long serialVersionUID = 1L;
-
-    @ApiModelProperty(value = "主键(与exam_detail表id一致)")
-    @TableId(value = "id", type = IdType.INPUT)
-    private Long id;
-
-    @ApiModelProperty(value = "学校ID")
-    private Long schoolId;
-
-    @ApiModelProperty(value = "学期ID")
-    private Long semesterId;
-
-    @ApiModelProperty(value = "考试ID")
-    private Long examId;
-
-    @ApiModelProperty(value = "印刷计划ID")
-    private Long printPlanId;
-
-    @ApiModelProperty(value = "课程名称")
-    private String courseNameCode;
-
-    @ApiModelProperty(value = "试卷编号")
-    private String paperNumber;
-    @ApiModelProperty(value = "生成pdf类型")
-    private CreatePdfTypeEnum createType;
-
-    @ApiModelProperty(value = "任务状态,INIT:未开始,RUNNING:进行中,FINISH:已完成")
-    private TaskStatusEnum status;
-
-    @ApiModelProperty(value = "实时摘要信息")
-    private String summary;
-
-    @ApiModelProperty(value = "数据结果,SUCCESS:成功,ERROR:失败")
-    @TableField(updateStrategy = FieldStrategy.IGNORED)
-    private TaskResultEnum result;
-
-    @ApiModelProperty(value = "创建人")
-    private Long createId;
-
-    @ApiModelProperty(value = "创建时间")
-    private Long createTime;
-
-    @ApiModelProperty(value = "更新人")
-    private Long updateId;
-
-    @ApiModelProperty(value = "更新时间")
-    private Long updateTime;
-
-    @ApiModelProperty(value = "备注")
-    private String remark;
-
-    public TBTaskPdf() {
-    }
-
-    public TBTaskPdf(Long id, Long schoolId, Long semesterId, Long examId, Long printPlanId, String courseNameCode, String paperNumber, Long createId) {
-        this.id = id;
-        this.schoolId = schoolId;
-        this.semesterId = semesterId;
-        this.examId = examId;
-        this.printPlanId = printPlanId;
-        this.courseNameCode = courseNameCode;
-        this.paperNumber = paperNumber;
-        this.createId = createId;
-        this.createTime = System.currentTimeMillis();
-        this.status = TaskStatusEnum.INIT;
-        this.createType = CreatePdfTypeEnum.ALL;
-    }
-
-    public Long getId() {
-        return id;
-    }
-
-    public void setId(Long id) {
-        this.id = id;
-    }
-
-    public Long getSchoolId() {
-        return schoolId;
-    }
-
-    public void setSchoolId(Long schoolId) {
-        this.schoolId = schoolId;
-    }
-
-    public Long getSemesterId() {
-        return semesterId;
-    }
-
-    public void setSemesterId(Long semesterId) {
-        this.semesterId = semesterId;
-    }
-
-    public Long getExamId() {
-        return examId;
-    }
-
-    public void setExamId(Long examId) {
-        this.examId = examId;
-    }
-
-    public Long getPrintPlanId() {
-        return printPlanId;
-    }
-
-    public void setPrintPlanId(Long printPlanId) {
-        this.printPlanId = printPlanId;
-    }
-
-    public String getCourseNameCode() {
-        return courseNameCode;
-    }
-
-    public void setCourseNameCode(String courseNameCode) {
-        this.courseNameCode = courseNameCode;
-    }
-
-    public String getPaperNumber() {
-        return paperNumber;
-    }
-
-    public void setPaperNumber(String paperNumber) {
-        this.paperNumber = paperNumber;
-    }
-
-    public CreatePdfTypeEnum getCreateType() {
-        return createType;
-    }
-
-    public void setCreateType(CreatePdfTypeEnum createType) {
-        this.createType = createType;
-    }
-
-    public TaskStatusEnum getStatus() {
-        return status;
-    }
-
-    public void setStatus(TaskStatusEnum status) {
-        this.status = status;
-    }
-
-    public String getSummary() {
-        return summary;
-    }
-
-    public void setSummary(String summary) {
-        this.summary = summary;
-    }
-
-    public TaskResultEnum getResult() {
-        return result;
-    }
-
-    public void setResult(TaskResultEnum result) {
-        this.result = result;
-    }
-
-    public Long getCreateId() {
-        return createId;
-    }
-
-    public void setCreateId(Long createId) {
-        this.createId = createId;
-    }
-
-    public Long getCreateTime() {
-        return createTime;
-    }
-
-    public void setCreateTime(Long createTime) {
-        this.createTime = createTime;
-    }
-
-    public Long getUpdateId() {
-        return updateId;
-    }
-
-    public void setUpdateId(Long updateId) {
-        this.updateId = updateId;
-    }
-
-    public Long getUpdateTime() {
-        return updateTime;
-    }
-
-    public void setUpdateTime(Long updateTime) {
-        this.updateTime = updateTime;
-    }
-
-    public String getRemark() {
-        return remark;
-    }
-
-    public void setRemark(String remark) {
-        this.remark = remark;
-    }
-
-    @Override
-    public String toString() {
-        return "TBTaskPdf{" +
-                "id=" + id +
-                ", schoolId=" + schoolId +
-                ", semesterId=" + semesterId +
-                ", examId=" + examId +
-                ", printPlanId=" + printPlanId +
-                ", courseNameCode=" + courseNameCode +
-                ", paperNumber=" + paperNumber +
-                ", status=" + status +
-                ", summary=" + summary +
-                ", result=" + result +
-                ", createId=" + createId +
-                ", createTime=" + createTime +
-                ", updateId=" + updateId +
-                ", updateTime=" + updateTime +
-                ", remark=" + remark +
-                "}";
-    }
-}
+package com.qmth.distributed.print.business.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+
+import java.io.Serializable;
+
+import com.qmth.teachcloud.common.enums.CreatePdfTypeEnum;
+import com.qmth.teachcloud.common.enums.TaskResultEnum;
+import com.qmth.teachcloud.common.enums.TaskStatusEnum;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * <p>
+ * pdf生成日志表
+ * </p>
+ *
+ * @author xf
+ * @since 2024-02-06
+ */
+@TableName("t_b_task_pdf")
+@ApiModel(value = "TBTaskPdf对象", description = "pdf生成日志表")
+public class TBTaskPdf implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "主键(与exam_detail表id一致)")
+    @TableId(value = "id", type = IdType.INPUT)
+    private Long id;
+
+    @ApiModelProperty(value = "学校ID")
+    private Long schoolId;
+
+    @ApiModelProperty(value = "学期ID")
+    private Long semesterId;
+
+    @ApiModelProperty(value = "考试ID")
+    private Long examId;
+
+    @ApiModelProperty(value = "印刷计划ID")
+    private Long printPlanId;
+
+    @ApiModelProperty(value = "课程名称")
+    private String courseNameCode;
+
+    @ApiModelProperty(value = "试卷编号")
+    private String paperNumber;
+    @ApiModelProperty(value = "生成pdf类型")
+    private CreatePdfTypeEnum createType;
+
+    @ApiModelProperty(value = "任务状态,INIT:未开始,RUNNING:进行中,FINISH:已完成")
+    private TaskStatusEnum status;
+
+    @ApiModelProperty(value = "实时摘要信息")
+    private String summary;
+
+    @ApiModelProperty(value = "数据结果,SUCCESS:成功,ERROR:失败")
+    @TableField(updateStrategy = FieldStrategy.IGNORED)
+    private TaskResultEnum result;
+
+    @ApiModelProperty(value = "创建人")
+    private Long createId;
+
+    @ApiModelProperty(value = "创建时间")
+    private Long createTime;
+
+    @ApiModelProperty(value = "更新人")
+    private Long updateId;
+
+    @ApiModelProperty(value = "更新时间")
+    private Long updateTime;
+
+    @ApiModelProperty(value = "备注")
+    private String remark;
+
+    @ApiModelProperty(value = "时间差")
+    @TableField(exist = false)
+    private Integer diffTime;
+
+    public TBTaskPdf() {
+    }
+
+    public TBTaskPdf(Long id, Long schoolId, Long semesterId, Long examId, Long printPlanId, String courseNameCode, String paperNumber, Long createId) {
+        this.id = id;
+        this.schoolId = schoolId;
+        this.semesterId = semesterId;
+        this.examId = examId;
+        this.printPlanId = printPlanId;
+        this.courseNameCode = courseNameCode;
+        this.paperNumber = paperNumber;
+        this.createId = createId;
+        this.createTime = System.currentTimeMillis();
+        this.status = TaskStatusEnum.INIT;
+        this.createType = CreatePdfTypeEnum.ALL;
+    }
+
+    public Integer getDiffTime() {
+        return diffTime;
+    }
+
+    public void setDiffTime(Integer diffTime) {
+        this.diffTime = diffTime;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public Long getSchoolId() {
+        return schoolId;
+    }
+
+    public void setSchoolId(Long schoolId) {
+        this.schoolId = schoolId;
+    }
+
+    public Long getSemesterId() {
+        return semesterId;
+    }
+
+    public void setSemesterId(Long semesterId) {
+        this.semesterId = semesterId;
+    }
+
+    public Long getExamId() {
+        return examId;
+    }
+
+    public void setExamId(Long examId) {
+        this.examId = examId;
+    }
+
+    public Long getPrintPlanId() {
+        return printPlanId;
+    }
+
+    public void setPrintPlanId(Long printPlanId) {
+        this.printPlanId = printPlanId;
+    }
+
+    public String getCourseNameCode() {
+        return courseNameCode;
+    }
+
+    public void setCourseNameCode(String courseNameCode) {
+        this.courseNameCode = courseNameCode;
+    }
+
+    public String getPaperNumber() {
+        return paperNumber;
+    }
+
+    public void setPaperNumber(String paperNumber) {
+        this.paperNumber = paperNumber;
+    }
+
+    public CreatePdfTypeEnum getCreateType() {
+        return createType;
+    }
+
+    public void setCreateType(CreatePdfTypeEnum createType) {
+        this.createType = createType;
+    }
+
+    public TaskStatusEnum getStatus() {
+        return status;
+    }
+
+    public void setStatus(TaskStatusEnum status) {
+        this.status = status;
+    }
+
+    public String getSummary() {
+        return summary;
+    }
+
+    public void setSummary(String summary) {
+        this.summary = summary;
+    }
+
+    public TaskResultEnum getResult() {
+        return result;
+    }
+
+    public void setResult(TaskResultEnum result) {
+        this.result = result;
+    }
+
+    public Long getCreateId() {
+        return createId;
+    }
+
+    public void setCreateId(Long createId) {
+        this.createId = createId;
+    }
+
+    public Long getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(Long createTime) {
+        this.createTime = createTime;
+    }
+
+    public Long getUpdateId() {
+        return updateId;
+    }
+
+    public void setUpdateId(Long updateId) {
+        this.updateId = updateId;
+    }
+
+    public Long getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(Long updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    @Override
+    public String toString() {
+        return "TBTaskPdf{" +
+                "id=" + id +
+                ", schoolId=" + schoolId +
+                ", semesterId=" + semesterId +
+                ", examId=" + examId +
+                ", printPlanId=" + printPlanId +
+                ", courseNameCode=" + courseNameCode +
+                ", paperNumber=" + paperNumber +
+                ", status=" + status +
+                ", summary=" + summary +
+                ", result=" + result +
+                ", createId=" + createId +
+                ", createTime=" + createTime +
+                ", updateId=" + updateId +
+                ", updateTime=" + updateTime +
+                ", remark=" + remark +
+                "}";
+    }
+}

+ 44 - 23
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/TBTaskPdfMapper.java

@@ -1,23 +1,44 @@
-package com.qmth.distributed.print.business.mapper;
-
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.qmth.distributed.print.business.entity.TBTaskPdf;
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.qmth.teachcloud.common.bean.result.TaskPdfResult;
-import com.qmth.teachcloud.common.enums.TaskResultEnum;
-import com.qmth.teachcloud.common.enums.TaskStatusEnum;
-import org.apache.ibatis.annotations.Param;
-
-/**
- * <p>
- * 导入导出任务表 Mapper 接口
- * </p>
- *
- * @author xf
- * @since 2024-02-06
- */
-public interface TBTaskPdfMapper extends BaseMapper<TBTaskPdf> {
-
-    IPage<TaskPdfResult> pageData(@Param("page") Page<TaskPdfResult> page, @Param("examId") Long examId, @Param("printPlanId") String printPlanId, @Param("courseId") Long courseId, @Param("paperNumber") String paperNumber, @Param("status") TaskStatusEnum status, @Param("result") TaskResultEnum result, @Param("examPlace") String examPlace, @Param("examRoom") String examRoom, @Param("examStartTime") Long examStartTime, @Param("examEndTime") Long examEndTime);
-}
+package com.qmth.distributed.print.business.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.qmth.distributed.print.business.entity.TBTaskPdf;
+import com.qmth.teachcloud.common.bean.result.TaskPdfResult;
+import com.qmth.teachcloud.common.enums.TaskResultEnum;
+import com.qmth.teachcloud.common.enums.TaskStatusEnum;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 导入导出任务表 Mapper 接口
+ * </p>
+ *
+ * @author xf
+ * @since 2024-02-06
+ */
+public interface TBTaskPdfMapper extends BaseMapper<TBTaskPdf> {
+
+    IPage<TaskPdfResult> pageData(@Param("page") Page<TaskPdfResult> page, @Param("examId") Long examId, @Param("printPlanId") String printPlanId, @Param("courseId") Long courseId, @Param("paperNumber") String paperNumber, @Param("status") TaskStatusEnum status, @Param("result") TaskResultEnum result, @Param("examPlace") String examPlace, @Param("examRoom") String examRoom, @Param("examStartTime") Long examStartTime, @Param("examEndTime") Long examEndTime);
+
+    /**
+     * 根据状态和id更新
+     *
+     * @param newStatus
+     * @param oldStatus
+     * @param id
+     * @return
+     */
+    int updateStatus(@Param("newStatus") String newStatus, @Param("oldStatus") String oldStatus, @Param("id") Long id);
+
+    /**
+     * 查询运行中超时的任务
+     *
+     * @param status
+     * @param limit
+     * @return
+     */
+    List<TBTaskPdf> listRunningTimeOutTask(@Param("status") String status, @Param("limit") String limit);
+}

+ 58 - 41
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/TBTaskPdfService.java

@@ -1,41 +1,58 @@
-package com.qmth.distributed.print.business.service;
-
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.qmth.distributed.print.business.entity.TBTaskPdf;
-import com.baomidou.mybatisplus.extension.service.IService;
-import com.qmth.teachcloud.common.bean.result.TaskPdfResult;
-import com.qmth.teachcloud.common.bean.result.TbTaskDetailResult;
-import com.qmth.teachcloud.common.entity.SysUser;
-import com.qmth.teachcloud.common.enums.CreatePdfTypeEnum;
-import com.qmth.teachcloud.common.enums.TaskResultEnum;
-import com.qmth.teachcloud.common.enums.TaskStatusEnum;
-import com.qmth.teachcloud.common.enums.TaskTypeEnum;
-
-import java.util.List;
-import java.util.Map;
-
-/**
- * <p>
- * 导入导出任务表 服务类
- * </p>
- *
- * @author xf
- * @since 2024-02-06
- */
-public interface TBTaskPdfService extends IService<TBTaskPdf> {
-
-    boolean updateStatusById(TaskStatusEnum status, TaskResultEnum result, String summary, Long id);
-
-    TBTaskPdf saveTask(TbTaskDetailResult tbTaskDetailResult, Long printPlanId, SysUser user, Long id);
-
-    void resetRunningCreatePdf(Long id, CreatePdfTypeEnum type);
-
-    int countRunningByExamDetailIds(List<Long> examDetailIds);
-
-    IPage<TaskPdfResult> pageData(Page<TaskPdfResult> page, Long examId, String printPlanId, Long courseId, String paperNumber, TaskStatusEnum status, TaskResultEnum result, String examPlace, String examRoom, Long examStartTime, Long examEndTime);
-
-    List<TBTaskPdf> listWaitingTask();
-
-    boolean countByPrintPlanIdAndEntityId(Long schoolId, Long printPlanId);
-}
+package com.qmth.distributed.print.business.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.qmth.distributed.print.business.entity.TBTaskPdf;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qmth.teachcloud.common.bean.result.TaskPdfResult;
+import com.qmth.teachcloud.common.bean.result.TbTaskDetailResult;
+import com.qmth.teachcloud.common.entity.SysUser;
+import com.qmth.teachcloud.common.enums.CreatePdfTypeEnum;
+import com.qmth.teachcloud.common.enums.TaskResultEnum;
+import com.qmth.teachcloud.common.enums.TaskStatusEnum;
+import com.qmth.teachcloud.common.enums.TaskTypeEnum;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 导入导出任务表 服务类
+ * </p>
+ *
+ * @author xf
+ * @since 2024-02-06
+ */
+public interface TBTaskPdfService extends IService<TBTaskPdf> {
+
+    boolean updateStatusById(TaskStatusEnum status, TaskResultEnum result, String summary, Long id);
+
+    /**
+     * 根据状态和id更新
+     *
+     * @param newStatus
+     * @param oldStatus
+     * @param id
+     */
+    int updateStatus(TaskStatusEnum newStatus, TaskStatusEnum oldStatus, Long id);
+
+    TBTaskPdf saveTask(TbTaskDetailResult tbTaskDetailResult, Long printPlanId, SysUser user, Long id);
+
+    void resetRunningCreatePdf(Long id, CreatePdfTypeEnum type);
+
+    int countRunningByExamDetailIds(List<Long> examDetailIds);
+
+    IPage<TaskPdfResult> pageData(Page<TaskPdfResult> page, Long examId, String printPlanId, Long courseId, String paperNumber, TaskStatusEnum status, TaskResultEnum result, String examPlace, String examRoom, Long examStartTime, Long examEndTime);
+
+    List<TBTaskPdf> listWaitingTask();
+
+    /**
+     * 查询运行中超时的任务
+     *
+     * @param status
+     * @return
+     */
+    List<TBTaskPdf> listRunningTimeOutTask(TaskStatusEnum status);
+
+    boolean countByPrintPlanIdAndEntityId(Long schoolId, Long printPlanId);
+}

+ 31 - 4
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TBTaskPdfServiceImpl.java

@@ -1,7 +1,6 @@
 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;
@@ -17,8 +16,10 @@ 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.enums.CreatePdfTypeEnum;
+import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.common.enums.TaskResultEnum;
+import com.qmth.teachcloud.common.enums.TaskStatusEnum;
 import com.qmth.teachcloud.common.service.CommonCacheService;
 import com.qmth.teachcloud.common.util.ResultUtil;
 import org.apache.commons.lang3.StringUtils;
@@ -26,7 +27,9 @@ import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
 import java.text.MessageFormat;
-import java.util.*;
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
 
 /**
  * <p>
@@ -55,6 +58,18 @@ public class TBTaskPdfServiceImpl extends ServiceImpl<TBTaskPdfMapper, TBTaskPdf
         return this.update(updateWrapper);
     }
 
+    /**
+     * 根据状态和id更新
+     *
+     * @param newStatus
+     * @param oldStatus
+     * @param id
+     */
+    @Override
+    public int updateStatus(TaskStatusEnum newStatus, TaskStatusEnum oldStatus, Long id) {
+        return this.baseMapper.updateStatus(Objects.nonNull(newStatus) ? newStatus.name() : null, Objects.nonNull(oldStatus) ? oldStatus.name() : null, id);
+    }
+
     @Override
     public TBTaskPdf saveTask(TbTaskDetailResult tbTaskDetailResult, Long printPlanId, SysUser user, Long examDetailId) {
         try {
@@ -125,6 +140,18 @@ public class TBTaskPdfServiceImpl extends ServiceImpl<TBTaskPdfMapper, TBTaskPdf
         return this.list(queryWrapper);
     }
 
+    /**
+     * 查询运行中超时的任务
+     *
+     * @param status
+     * @return
+     */
+    @Override
+    public List<TBTaskPdf> listRunningTimeOutTask(TaskStatusEnum status) {
+        SysConfig sysConfig = commonCacheService.addSysConfigCache(SystemConstant.CREATE_PDF_JOB_DB_LIMIT);
+        return this.baseMapper.listRunningTimeOutTask(Objects.nonNull(status) ? status.name() : null, sysConfig.getConfigValue());
+    }
+
     @Override
     public boolean countByPrintPlanIdAndEntityId(Long schoolId, Long printPlanId) {
         QueryWrapper<TBTaskPdf> queryWrapper = new QueryWrapper<>();

+ 1 - 6
distributed-print-business/src/main/java/com/qmth/distributed/print/business/templete/execute/AsyncCreatePdfTemplateService.java

@@ -52,12 +52,7 @@ public class AsyncCreatePdfTemplateService extends AsyncCreateTaskTemplete {
         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);
+        tbTaskPdfService.updateStatus(TaskStatusEnum.RUNNING, TaskStatusEnum.INIT, tbTaskPdf.getId());
         List<ExamDetailCourse> examDetailCourseList = null;
         try {
             PdfTaskLogicService pdfTaskLogicService = SpringContextHolder.getBean(PdfTaskLogicService.class);

+ 8 - 0
distributed-print-business/src/main/resources/mapper/TBTaskPdfMapper.xml

@@ -77,4 +77,12 @@
         order by tp.id desc
     </select>
 
+    <update id="updateStatus">
+        update t_b_task_pdf t set t.status = #{newStatus},t.update_time = UNIX_TIMESTAMP(now()) * 1000 where t.id = #{id} and t.status = #{oldStatus}
+    </update>
+
+    <select id="listRunningTimeOutTask" resultType="com.qmth.distributed.print.business.entity.TBTaskPdf">
+        select temp.* from(SELECT t.*,TIMESTAMPDIFF(HOUR, now(), FROM_UNIXTIME(t.update_time / 1000,'%Y-%m-%d %H:%i:%s')) AS diffTime FROM t_b_task_pdf t) temp
+        where (temp.diffTime <![CDATA[ <= ]]> -2 or temp.diffTime is null) and temp.status = #{status} order by temp.school_id asc ${limit}
+    </select>
 </mapper>

+ 2 - 2
distributed-print/src/main/java/com/qmth/distributed/print/DistributedPrintApplication.java

@@ -4,7 +4,7 @@ import com.github.jeffreyning.mybatisplus.conf.EnableMPP;
 import com.qmth.boot.core.security.service.CustomizeAuthorizationService;
 import com.qmth.distributed.print.auth.DistributedPrintAuthenticationService;
 import com.qmth.distributed.print.listener.MyJobListener;
-import com.qmth.teachcloud.common.threadPool.MyThreadPool;
+import com.qmth.teachcloud.common.threadPool.DynamicMyThreadPool;
 import org.activiti.spring.boot.SecurityAutoConfiguration;
 import org.mybatis.spring.annotation.MapperScan;
 import org.quartz.Scheduler;
@@ -48,7 +48,7 @@ public class DistributedPrintApplication {
     @Primary
     @Bean
     public TaskExecutor primaryTaskExecutor() {
-        return new MyThreadPool();
+        return new DynamicMyThreadPool();
     }
 
 //    @Bean

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

@@ -491,7 +491,7 @@ public class SystemConstant {
     //    public static final int THREAD_POOL_CORE_POOL_SIZE = 5;
 //    public static final int THREAD_POOL_MAX_POOL_SIZE = 100;
     public static final int THREAD_POOL_KEEP_ALIVE_SECONDS = 10;
-    public static final int THREAD_POOL_QUEUE_CAPACITY = 500;
+    public static final int THREAD_POOL_QUEUE_CAPACITY = 100;
 
     /**
      * mq消息

+ 138 - 0
teachcloud-common/src/main/java/com/qmth/teachcloud/common/threadPool/DynamicMyThreadPool.java

@@ -0,0 +1,138 @@
+package com.qmth.teachcloud.common.threadPool;//package com.qmth.themis.business.threadPool;
+
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import com.qmth.teachcloud.common.entity.SysConfig;
+import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
+import com.qmth.teachcloud.common.service.CommonCacheService;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Primary;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+
+import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.Objects;
+import java.util.Optional;
+import java.util.concurrent.Executor;
+import java.util.concurrent.ThreadPoolExecutor;
+
+/**
+ * @Description: 线程池应用配置
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2019/3/21
+ */
+@Configuration
+public class DynamicMyThreadPool extends ThreadPoolTaskExecutor {
+    private final static Logger log = LoggerFactory.getLogger(DynamicMyThreadPool.class);
+    private DynamicMyThreadPool dynamicThreadPoolTaskExecutor = null;
+    private static Object poolSizeMonitor = new Object();
+    private static final int cpuNum = Runtime.getRuntime().availableProcessors();
+    private static final int initCoreSize = 1;
+
+    /**
+     * 线程池初始化
+     * 主要做了两件事 1 初始化线程池 2 初始化监控线程
+     */
+    @Bean
+    @Primary
+    public Executor taskThreadPool() {
+        synchronized (this.poolSizeMonitor) {
+            return this.createThreadPool();
+        }
+    }
+
+    /**
+     * 刷新线程池状态
+     */
+    public void refresh(int corePoolSize) {
+        synchronized (this.poolSizeMonitor) {
+            log.info(">>>>>>>>>>>> 开始刷新线程池参数 >>>>>>>>>>>");
+            if (!this.dynamicThreadPoolTaskExecutor.getThreadPoolExecutor().isShutdown() && !this.dynamicThreadPoolTaskExecutor.getThreadPoolExecutor().isTerminated()) {
+                this.dynamicThreadPoolTaskExecutor.setCorePoolSize(corePoolSize);
+                this.dynamicThreadPoolTaskExecutor.setMaxPoolSize(this.dynamicThreadPoolTaskExecutor.getCorePoolSize() * 2);
+                log.info(">>>>>>>>>>>> 线程池参数刷新完毕 >>>>>>>>>>>");
+            } else {
+                log.error(">>>>>>>>>>>> 线程池状态异常,不可刷新 >>>>>>>>>>>>");
+//                throw new RuntimeException("线程池状态异常,不可刷新");
+            }
+        }
+    }
+
+    public void shutDown() {
+        synchronized (this.poolSizeMonitor) {
+            DynamicMyThreadPool executor = this.getExecutor();
+            executor.shutdown();
+            if (executor.getThreadPoolExecutor().isShutdown()) {
+                executor = null;
+                log.warn(">>>>>>>>>>>> 线程池已停止 >>>>>>>>>>>>");
+            }
+        }
+    }
+
+    public DynamicMyThreadPool getExecutor() {
+        return this.dynamicThreadPoolTaskExecutor;
+    }
+
+    @Override
+    public String toString() {
+        int rate = this.dynamicThreadPoolTaskExecutor.getThreadPoolExecutor().getQueue().size() + this.dynamicThreadPoolTaskExecutor.getThreadPoolExecutor().getActiveCount();
+        BigDecimal total = SystemConstant.PERCENT.add(new BigDecimal(this.dynamicThreadPoolTaskExecutor.getThreadPoolExecutor().getActiveCount()));
+        BigDecimal percent = new BigDecimal(rate).divide(total, 2, BigDecimal.ROUND_HALF_UP).multiply(SystemConstant.PERCENT).setScale(2, BigDecimal.ROUND_HALF_UP);
+        return "当前线程池使用率:" + percent + "%" +
+                ", 核心线程数:" + this.dynamicThreadPoolTaskExecutor.getThreadPoolExecutor().getCorePoolSize() +
+                ", 最大线程数:" + this.dynamicThreadPoolTaskExecutor.getThreadPoolExecutor().getMaximumPoolSize() +
+                ", 线程数量:" + this.dynamicThreadPoolTaskExecutor.getThreadPoolExecutor().getPoolSize() +
+                ", 队列数量:" + this.dynamicThreadPoolTaskExecutor.getThreadPoolExecutor().getQueue().size() +
+                ", 活跃数量:" + this.dynamicThreadPoolTaskExecutor.getThreadPoolExecutor().getActiveCount() +
+                ", 已完成数量:" + this.dynamicThreadPoolTaskExecutor.getThreadPoolExecutor().getCompletedTaskCount() +
+                ", 总共数量:" + this.dynamicThreadPoolTaskExecutor.getThreadPoolExecutor().getTaskCount();
+    }
+
+    public boolean getStatus() {
+        return !this.dynamicThreadPoolTaskExecutor.getThreadPoolExecutor().isShutdown() && !this.dynamicThreadPoolTaskExecutor.getThreadPoolExecutor().isTerminated();
+    }
+
+    public Executor reLoad() {
+        synchronized (this.poolSizeMonitor) {
+            this.dynamicThreadPoolTaskExecutor = null;
+            log.info(">>>>>>>>>>>> 准备重新创建线程池 >>>>>>>>>>>>", this.getThreadNamePrefix());
+            return this.createThreadPool();
+        }
+    }
+
+    protected Executor createThreadPool() {
+        if (Objects.isNull(dynamicThreadPoolTaskExecutor)) {
+            log.info(">>>>>>>>>>>> thread-pool【{}】start init >>>>>>>>>>>>", this.getThreadNamePrefix());
+            this.dynamicThreadPoolTaskExecutor = new DynamicMyThreadPool();
+            this.dynamicThreadPoolTaskExecutor.setCorePoolSize(initCoreSize);//核心线程数
+            this.dynamicThreadPoolTaskExecutor.setMaxPoolSize(this.dynamicThreadPoolTaskExecutor.getCorePoolSize() * 2);//最大线程数
+            this.dynamicThreadPoolTaskExecutor.setKeepAliveSeconds(SystemConstant.THREAD_POOL_KEEP_ALIVE_SECONDS);//线程空闲时间
+            this.dynamicThreadPoolTaskExecutor.setQueueCapacity(SystemConstant.THREAD_POOL_QUEUE_CAPACITY);//队列容量
+            this.dynamicThreadPoolTaskExecutor.setThreadNamePrefix(SystemConstant.THREAD_POOL_NAME);
+            this.dynamicThreadPoolTaskExecutor.setAllowCoreThreadTimeOut(true);//设置是否允许核心线程超时。若允许,核心线程超时后,会被销毁。默认为不允许(fasle)
+            this.dynamicThreadPoolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true);//设置shutdown时是否等到所有任务完成再真正关闭
+            this.dynamicThreadPoolTaskExecutor.setAwaitTerminationSeconds(60);//当setWaitForTasksToCompleteOnShutdown(true)时,setAwaitTerminationSeconds 设置在 shutdown 之后最多等待多长时间后再真正关闭线程池
+            // rejection-policy:当pool已经达到max size的时候,如何处理新任务
+            // CALLER_RUNS:不在新线程中执行任务,而是由调用者所在的线程来执行
+            this.dynamicThreadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
+            this.dynamicThreadPoolTaskExecutor.initialize();
+        }
+        return dynamicThreadPoolTaskExecutor;
+    }
+
+    public DynamicMyThreadPool getDynamicThreadPoolTaskExecutor() {
+        return dynamicThreadPoolTaskExecutor;
+    }
+
+    public int getCoreThreadSize() {
+        return dynamicThreadPoolTaskExecutor.getThreadPoolExecutor().getCorePoolSize();
+    }
+
+    public int getCpuNum() {
+        return cpuNum;
+    }
+}

+ 0 - 79
teachcloud-common/src/main/java/com/qmth/teachcloud/common/threadPool/MyThreadPool.java

@@ -1,79 +0,0 @@
-package com.qmth.teachcloud.common.threadPool;//package com.qmth.themis.business.threadPool;
-
-import com.qmth.teachcloud.common.contant.SystemConstant;
-import com.qmth.teachcloud.common.entity.SysConfig;
-import com.qmth.teachcloud.common.enums.ExceptionResultEnum;
-import com.qmth.teachcloud.common.service.CommonCacheService;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.context.annotation.Primary;
-import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
-
-import javax.annotation.Resource;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.concurrent.Executor;
-import java.util.concurrent.ThreadPoolExecutor;
-
-/**
- * @Description: 线程池应用配置
- * @Param:
- * @return:
- * @Author: wangliang
- * @Date: 2019/3/21
- */
-@Configuration
-public class MyThreadPool extends ThreadPoolTaskExecutor {
-    private final static Logger log = LoggerFactory.getLogger(MyThreadPool.class);
-    private MyThreadPool threadPoolTaskExecutor = null;
-    static final int cpuNum = Runtime.getRuntime().availableProcessors();
-
-    @Resource
-    CommonCacheService commonCacheService;
-
-    /**
-     * 线程池
-     *
-     * @return
-     */
-    @Bean
-    @Primary
-    public Executor taskThreadPool() {
-        SysConfig sysConfigCustomThreadPoolCoreSize = commonCacheService.addSysConfigCache(SystemConstant.CUSTOM_THREAD_POOL_CORE_SIZE);
-        Optional.ofNullable(sysConfigCustomThreadPoolCoreSize).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("未配置是否自定义线程池大小"));
-        boolean customThreadPoolCoreSize = Boolean.valueOf(sysConfigCustomThreadPoolCoreSize.getConfigValue());
-
-        SysConfig sysConfigThreadPoolCoreSize = commonCacheService.addSysConfigCache(SystemConstant.THREAD_POOL_CORE_SIZE);
-        Optional.ofNullable(sysConfigThreadPoolCoreSize).orElseThrow(() -> ExceptionResultEnum.ERROR.exception("未配置自定义线程池大小"));
-        Integer threadPoolCoreSize = Integer.valueOf(sysConfigThreadPoolCoreSize.getConfigValue());
-
-        if (Objects.isNull(threadPoolTaskExecutor)) {
-            log.info("cpuNum:{}", cpuNum);
-            threadPoolTaskExecutor = new MyThreadPool();
-            if (!customThreadPoolCoreSize && cpuNum > 0) {
-                threadPoolTaskExecutor.setCorePoolSize(cpuNum);//核心线程数
-                threadPoolTaskExecutor.setMaxPoolSize(threadPoolTaskExecutor.getCorePoolSize() * 2);//最大线程数
-            } else {
-                threadPoolTaskExecutor.setCorePoolSize(threadPoolCoreSize);//核心线程数
-                threadPoolTaskExecutor.setMaxPoolSize(threadPoolCoreSize * 2);//最大线程数
-            }
-            threadPoolTaskExecutor.setKeepAliveSeconds(SystemConstant.THREAD_POOL_KEEP_ALIVE_SECONDS);//线程空闲时间
-            threadPoolTaskExecutor.setQueueCapacity(SystemConstant.THREAD_POOL_QUEUE_CAPACITY);//队列容量
-            threadPoolTaskExecutor.setThreadNamePrefix(SystemConstant.THREAD_POOL_NAME);
-            threadPoolTaskExecutor.setAllowCoreThreadTimeOut(true);//设置是否允许核心线程超时。若允许,核心线程超时后,会被销毁。默认为不允许(fasle)
-            threadPoolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true);//设置shutdown时是否等到所有任务完成再真正关闭
-            threadPoolTaskExecutor.setAwaitTerminationSeconds(60 * 60);//当setWaitForTasksToCompleteOnShutdown(true)时,setAwaitTerminationSeconds 设置在 shutdown 之后最多等待多长时间后再真正关闭线程池
-            // rejection-policy:当pool已经达到max size的时候,如何处理新任务
-            // CALLER_RUNS:不在新线程中执行任务,而是由调用者所在的线程来执行
-            threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
-            threadPoolTaskExecutor.initialize();
-        }
-        return threadPoolTaskExecutor;
-    }
-
-    public MyThreadPool getThreadPoolTaskExecutor() {
-        return threadPoolTaskExecutor;
-    }
-}

+ 1 - 1
teachcloud-common/src/main/resources/mapper/TSAuthMapper.xml

@@ -9,6 +9,6 @@
                 and t.type = #{authEnum}
             </if>
         </where>
-        limit 1;
+        limit 1
     </select>
 </mapper>

+ 2 - 2
teachcloud-report/src/main/java/com/qmth/teachcloud/report/TeachcloudReportApplication.java

@@ -3,7 +3,7 @@ package com.qmth.teachcloud.report;
 
 import com.qmth.boot.core.security.service.CustomizeAuthorizationService;
 import com.qmth.teachcloud.common.base.CustomizedSqlInjector;
-import com.qmth.teachcloud.common.threadPool.MyThreadPool;
+import com.qmth.teachcloud.common.threadPool.DynamicMyThreadPool;
 import com.qmth.teachcloud.report.auth.TeachcloudReportAuthenticationService;
 import org.mybatis.spring.annotation.MapperScan;
 import org.springframework.boot.SpringApplication;
@@ -46,7 +46,7 @@ public class TeachcloudReportApplication {
     @Primary
     @Bean
     public TaskExecutor primaryTaskExecutor() {
-        return new MyThreadPool();
+        return new DynamicMyThreadPool();
     }
 
     @Bean

+ 3 - 3
teachcloud-task/src/main/java/com/qmth/teachcloud/task/config/RedisListenerConfig.java

@@ -1,7 +1,7 @@
 package com.qmth.teachcloud.task.config;
 
 import com.qmth.teachcloud.common.enums.MqTagEnum;
-import com.qmth.teachcloud.common.threadPool.MyThreadPool;
+import com.qmth.teachcloud.common.threadPool.DynamicMyThreadPool;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.data.redis.connection.RedisConnectionFactory;
@@ -29,7 +29,7 @@ public class RedisListenerConfig {
     private RedisMessageListener messageListener;
 
     @Resource
-    MyThreadPool myThreadPool;
+    DynamicMyThreadPool dynamicMyThreadPool;
 
     @Bean
     public RedisMessageListenerContainer initRedisContainer() {
@@ -37,7 +37,7 @@ public class RedisListenerConfig {
         //redis连接工厂
         container.setConnectionFactory(redisConnectionFactory);
         //设置运行任务池
-        container.setTaskExecutor(myThreadPool);
+        container.setTaskExecutor(dynamicMyThreadPool);
         //定义监听渠道名称为
         Topic topicPdf = new ChannelTopic(MqTagEnum.PDF.getCode());
         Topic topicFlowMqWork = new ChannelTopic(MqTagEnum.FLOW_MQ_WORK.getCode());

+ 3 - 16
teachcloud-task/src/main/java/com/qmth/teachcloud/task/job/CreatePdfTaskJob.java

@@ -1,7 +1,7 @@
 package com.qmth.teachcloud.task.job;
 
 import com.qmth.teachcloud.common.contant.SystemConstant;
-import com.qmth.teachcloud.common.threadPool.MyThreadPool;
+import com.qmth.teachcloud.common.threadPool.DynamicMyThreadPool;
 import com.qmth.teachcloud.mark.enums.LockType;
 import com.qmth.teachcloud.mark.lock.LockService;
 import com.qmth.teachcloud.task.job.service.JobService;
@@ -11,8 +11,6 @@ import org.slf4j.LoggerFactory;
 import org.springframework.scheduling.quartz.QuartzJobBean;
 
 import javax.annotation.Resource;
-import java.math.BigDecimal;
-import java.util.StringJoiner;
 
 /**
  * pdf自动生成任务
@@ -27,25 +25,14 @@ public class CreatePdfTaskJob extends QuartzJobBean {
     LockService lockService;
 
     @Resource
-    MyThreadPool myThreadPool;
+    DynamicMyThreadPool dynamicMyThreadPool;
 
     @Override
     protected void executeInternal(JobExecutionContext jobExecutionContext) {
         if (lockService.trylock(LockType.CREATE_PDF, LockType.CREATE_PDF.name())) {
             try {
                 jobService.createPdfTask();
-                int rate = myThreadPool.getThreadPoolTaskExecutor().getThreadPoolExecutor().getQueue().size() + myThreadPool.getThreadPoolTaskExecutor().getThreadPoolExecutor().getActiveCount();
-                BigDecimal percent = new BigDecimal(rate).divide(new BigDecimal(myThreadPool.getThreadPoolTaskExecutor().getThreadPoolExecutor().getMaximumPoolSize()), 2, BigDecimal.ROUND_HALF_UP).multiply(SystemConstant.PERCENT).setScale(2, BigDecimal.ROUND_HALF_UP);
-                StringJoiner stringJoinerThreadPool = new StringJoiner(",");
-                stringJoinerThreadPool.add("当前线程使用率:" + percent + "%");
-                stringJoinerThreadPool.add("核心线程数:" + myThreadPool.getThreadPoolTaskExecutor().getThreadPoolExecutor().getCorePoolSize())
-                        .add("最大线程数:" + myThreadPool.getThreadPoolTaskExecutor().getThreadPoolExecutor().getMaximumPoolSize())
-                        .add("线程数量:" + myThreadPool.getThreadPoolTaskExecutor().getThreadPoolExecutor().getPoolSize())
-                        .add("队列数量:" + myThreadPool.getThreadPoolTaskExecutor().getThreadPoolExecutor().getQueue().size())
-                        .add("活跃数量:" + myThreadPool.getThreadPoolTaskExecutor().getThreadPoolExecutor().getActiveCount())
-                        .add("已完成数量:" + myThreadPool.getThreadPoolTaskExecutor().getThreadPoolExecutor().getCompletedTaskCount())
-                        .add("总共数量:" + myThreadPool.getThreadPoolTaskExecutor().getThreadPoolExecutor().getTaskCount());
-                jobExecutionContext.setResult(stringJoinerThreadPool.toString());
+                jobExecutionContext.setResult(dynamicMyThreadPool.toString());
             } catch (Exception e) {
                 log.error(SystemConstant.LOG_ERROR, e);
             } finally {

+ 44 - 11
teachcloud-task/src/main/java/com/qmth/teachcloud/task/job/service/impl/JobServiceImpl.java

@@ -1,5 +1,6 @@
 package com.qmth.teachcloud.task.job.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.qmth.boot.redis.uid.RedisMachineService;
 import com.qmth.distributed.print.business.bean.dto.initMarkData.ExamDetailCourseInitMarkDto;
 import com.qmth.distributed.print.business.entity.ExamTaskDetail;
@@ -12,12 +13,15 @@ import com.qmth.teachcloud.common.bean.dto.MqDto;
 import com.qmth.teachcloud.common.bean.vo.PaperInfoVo;
 import com.qmth.teachcloud.common.contant.SystemConstant;
 import com.qmth.teachcloud.common.entity.BasicCourse;
+import com.qmth.teachcloud.common.entity.TSAuth;
+import com.qmth.teachcloud.common.enums.AuthEnum;
 import com.qmth.teachcloud.common.enums.PushTypeEnum;
 import com.qmth.teachcloud.common.enums.TaskResultEnum;
 import com.qmth.teachcloud.common.enums.TaskStatusEnum;
 import com.qmth.teachcloud.common.enums.mark.MarkPaperStatus;
 import com.qmth.teachcloud.common.service.BasicCourseService;
-import com.qmth.teachcloud.common.threadPool.MyThreadPool;
+import com.qmth.teachcloud.common.service.TSAuthService;
+import com.qmth.teachcloud.common.threadPool.DynamicMyThreadPool;
 import com.qmth.teachcloud.common.util.DateDisposeUtils;
 import com.qmth.teachcloud.common.util.ExamTaskUtil;
 import com.qmth.teachcloud.common.util.RedisUtil;
@@ -33,16 +37,18 @@ import com.qmth.teachcloud.mark.service.MarkUserGroupService;
 import com.qmth.teachcloud.mark.utils.TaskLockUtil;
 import com.qmth.teachcloud.task.job.service.JobService;
 import com.qmth.teachcloud.task.service.PrintFinishService;
+import org.apache.commons.collections4.CollectionUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
-import java.math.BigDecimal;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
+import java.util.Set;
 import java.util.concurrent.TimeUnit;
+import java.util.stream.Collectors;
 
 /**
  * @Description: job service impl
@@ -89,7 +95,10 @@ public class JobServiceImpl implements JobService {
     LockService lockService;
 
     @Resource
-    MyThreadPool myThreadPool;
+    DynamicMyThreadPool dynamicMyThreadPool;
+
+    @Resource
+    TSAuthService tsAuthService;
 
     @Override
     public void sendSmsExpireTask() {
@@ -209,12 +218,37 @@ public class JobServiceImpl implements JobService {
     public void createPdfTask() {
         if (this.getMyThreadPoolPercent()) {
             List<TBTaskPdf> tbTaskPdfList = tbTaskPdfService.listWaitingTask();
-            for (TBTaskPdf tbTaskPdf : tbTaskPdfList) {
-                if (this.getMyThreadPoolPercent()) {
-                    asyncCreatePdfTemplateService.createPdf(tbTaskPdf, null);
-                } else {
-                    break;
+            if (CollectionUtils.isNotEmpty(tbTaskPdfList)) {
+                Set<Long> setSchoolId = tbTaskPdfList.stream().map(s -> s.getSchoolId()).collect(Collectors.toSet());
+                List<TSAuth> tsAuthList = tsAuthService.list(new QueryWrapper<TSAuth>().lambda().in(TSAuth::getSchoolId, setSchoolId));
+                if (CollectionUtils.isNotEmpty(tsAuthList)) {
+                    List<TSAuth> tsAuths = tsAuthList.stream().filter(s -> s.getType() == AuthEnum.ON_LINE).collect(Collectors.toList());
+                    if (CollectionUtils.isNotEmpty(tsAuths) && dynamicMyThreadPool.getCpuNum() != dynamicMyThreadPool.getCoreThreadSize()) {
+                        dynamicMyThreadPool.refresh(dynamicMyThreadPool.getCpuNum());
+                    } else {
+                        int coreSize = Math.abs(dynamicMyThreadPool.getCpuNum() / 2);
+                        if (coreSize != dynamicMyThreadPool.getCoreThreadSize()) {
+                            dynamicMyThreadPool.refresh(coreSize);
+                        }
+                    }
                 }
+                for (TBTaskPdf tbTaskPdf : tbTaskPdfList) {
+                    if (this.getMyThreadPoolPercent()) {
+                        int count = tbTaskPdfService.updateStatus(TaskStatusEnum.RUNNING, TaskStatusEnum.INIT, tbTaskPdf.getId());
+                        if (count == 1) {
+                            asyncCreatePdfTemplateService.createPdf(tbTaskPdf, null);
+                        }
+                    } else {
+                        break;
+                    }
+                }
+            }
+        }
+        //补救running状态
+        List<TBTaskPdf> tbTaskPdfRunningList = tbTaskPdfService.listRunningTimeOutTask(TaskStatusEnum.RUNNING);
+        if (CollectionUtils.isNotEmpty(tbTaskPdfRunningList)) {
+            for (TBTaskPdf tbTaskPdf : tbTaskPdfRunningList) {
+                tbTaskPdfService.updateStatus(TaskStatusEnum.INIT, TaskStatusEnum.RUNNING, tbTaskPdf.getId());
             }
         }
     }
@@ -225,9 +259,8 @@ public class JobServiceImpl implements JobService {
      * @return
      */
     protected Boolean getMyThreadPoolPercent() {
-        int rate = myThreadPool.getThreadPoolTaskExecutor().getThreadPoolExecutor().getQueue().size() + myThreadPool.getThreadPoolTaskExecutor().getThreadPoolExecutor().getActiveCount();
-        BigDecimal percent = new BigDecimal(rate).divide(new BigDecimal(myThreadPool.getThreadPoolTaskExecutor().getThreadPoolExecutor().getMaximumPoolSize()), 2, BigDecimal.ROUND_HALF_UP).multiply(SystemConstant.PERCENT).setScale(2, BigDecimal.ROUND_HALF_UP);
-        return percent.compareTo(SystemConstant.PERCENT) == -1 ? true : false;
+        int queue = dynamicMyThreadPool.getDynamicThreadPoolTaskExecutor().getThreadPoolExecutor().getQueue().size();
+        return queue < SystemConstant.THREAD_POOL_QUEUE_CAPACITY ? true : false;
     }
 
     /**