瀏覽代碼

线程池访问更新

wangliang 9 月之前
父節點
當前提交
36b36a46d4

+ 119 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/entity/TSJobLog.java

@@ -0,0 +1,119 @@
+package com.qmth.distributed.print.business.entity;
+
+import java.io.Serializable;
+
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 任务日志表
+ * </p>
+ *
+ * @author wangliang
+ * @since 2024-08-30
+ */
+@ApiModel(value = "TSJobLog对象", description = "任务日志表")
+public class TSJobLog implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @ApiModelProperty(value = "主键")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long id;
+
+    @ApiModelProperty(value = "类型,CREATE_PDF_JOB:创建pdf")
+    private String type;
+
+    @ApiModelProperty(value = "实体id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long objId;
+
+    @ApiModelProperty(value = "实体名称")
+    private String objName;
+
+    @ApiModelProperty(value = "执行时间")
+    private String jobExecTime;
+
+    @ApiModelProperty(value = "创建人id")
+    @JsonSerialize(using = ToStringSerializer.class)
+    private Long createId;
+
+    @ApiModelProperty(value = "创建时间")
+    private Long createTime;
+
+    public TSJobLog() {
+
+    }
+
+    public TSJobLog(String type, String objName, String jobExecTime) {
+        this.id = SystemConstant.getDbUuid();
+        this.type = type;
+        this.objName = objName;
+        this.jobExecTime = jobExecTime;
+        this.createId = -1L;
+        this.createTime = System.currentTimeMillis();
+    }
+
+    public String getJobExecTime() {
+        return jobExecTime;
+    }
+
+    public void setJobExecTime(String jobExecTime) {
+        this.jobExecTime = jobExecTime;
+    }
+
+    public Long getId() {
+        return id;
+    }
+
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    public String getType() {
+        return type;
+    }
+
+    public void setType(String type) {
+        this.type = type;
+    }
+
+    public Long getObjId() {
+        return objId;
+    }
+
+    public void setObjId(Long objId) {
+        this.objId = objId;
+    }
+
+    public String getObjName() {
+        return objName;
+    }
+
+    public void setObjName(String objName) {
+        this.objName = objName;
+    }
+
+    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;
+    }
+}

+ 16 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/mapper/TSJobLogMapper.java

@@ -0,0 +1,16 @@
+package com.qmth.distributed.print.business.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qmth.distributed.print.business.entity.TSJobLog;
+
+/**
+ * <p>
+ * 任务日志表 Mapper 接口
+ * </p>
+ *
+ * @author wangliang
+ * @since 2024-08-30
+ */
+public interface TSJobLogMapper extends BaseMapper<TSJobLog> {
+
+}

+ 16 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/TSJobLogService.java

@@ -0,0 +1,16 @@
+package com.qmth.distributed.print.business.service;
+
+import com.qmth.distributed.print.business.entity.TSJobLog;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 任务日志表 服务类
+ * </p>
+ *
+ * @author wangliang
+ * @since 2024-08-30
+ */
+public interface TSJobLogService extends IService<TSJobLog> {
+
+}

+ 20 - 0
distributed-print-business/src/main/java/com/qmth/distributed/print/business/service/impl/TSJobLogServiceImpl.java

@@ -0,0 +1,20 @@
+package com.qmth.distributed.print.business.service.impl;
+
+import com.qmth.distributed.print.business.entity.TSJobLog;
+import com.qmth.distributed.print.business.mapper.TSJobLogMapper;
+import com.qmth.distributed.print.business.service.TSJobLogService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 任务日志表 服务实现类
+ * </p>
+ *
+ * @author wangliang
+ * @since 2024-08-30
+ */
+@Service
+public class TSJobLogServiceImpl extends ServiceImpl<TSJobLogMapper, TSJobLog> implements TSJobLogService {
+
+}

+ 5 - 0
distributed-print-business/src/main/resources/mapper/TSJobLogMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.qmth.distributed.print.business.mapper.TSJobLogMapper">
+
+</mapper>

+ 13 - 0
distributed-print/install/mysql/upgrade/3.4.1.sql

@@ -80,3 +80,16 @@ UPDATE sys_privilege SET name='查看详情', url='View', `type`='LINK', parent_
 INSERT INTO sys_privilege (id, name, url, `type`, parent_id, `sequence`, property, related, enable, default_auth, front_display) VALUES(2110, '导出平时成绩报告', '/api/admin/course/degree/report/usual_score/export', 'URL', 2025, 1, 'AUTH', NULL, 1, 1, 1);
 ALTER TABLE t_r_basic_info DROP COLUMN finish_points;
 ALTER TABLE t_r_basic_info DROP COLUMN requirement_points;
+
+-- 2024-08-30
+DROP TABLE IF EXISTS `t_s_job_log`;
+CREATE TABLE `t_s_job_log` (
+                               `id` bigint NOT NULL COMMENT '主键',
+                               `type` varchar(100) NOT NULL COMMENT '类型,CREATE_PDF_JOB:创建pdf',
+                               `obj_id` bigint DEFAULT NULL COMMENT '实体id',
+                               `obj_name` varchar(1000) DEFAULT NULL COMMENT '实体名称',
+                               `job_exec_time` varchar(200) DEFAULT NULL COMMENT '执行时间',
+                               `create_id` bigint NOT NULL COMMENT '创建人id',
+                               `create_time` bigint NOT NULL COMMENT '创建时间',
+                               PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='任务日志表';

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

@@ -3,9 +3,11 @@ package com.qmth.distributed.print;
 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 org.activiti.spring.boot.SecurityAutoConfiguration;
 import org.mybatis.spring.annotation.MapperScan;
+import org.quartz.Scheduler;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.domain.EntityScan;
@@ -53,4 +55,11 @@ public class DistributedPrintApplication {
 //    public CustomizedSqlInjector customizedSqlInjector() {
 //        return new CustomizedSqlInjector();
 //    }
+
+    @Bean
+    public Scheduler scheduler(Scheduler scheduler) throws Exception {
+        // 添加Scheduler 监听器
+        scheduler.getListenerManager().addJobListener(new MyJobListener());
+        return scheduler;
+    }
 }

+ 67 - 0
distributed-print/src/main/java/com/qmth/distributed/print/listener/MyJobListener.java

@@ -0,0 +1,67 @@
+package com.qmth.distributed.print.listener;
+
+import cn.hutool.core.date.DateUtil;
+import com.qmth.distributed.print.business.entity.TSJobLog;
+import com.qmth.distributed.print.business.service.TSJobLogService;
+import com.qmth.teachcloud.common.contant.SpringContextHolder;
+import com.qmth.teachcloud.common.contant.SystemConstant;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.quartz.JobListener;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.Objects;
+import java.util.StringJoiner;
+
+/**
+ * @Description: job监听
+ * @Param:
+ * @return:
+ * @Author: wangliang
+ * @Date: 2022/9/22
+ */
+public class MyJobListener implements JobListener {
+
+    private final static Logger log = LoggerFactory.getLogger(MyJobListener.class);
+
+    @Override
+    public String getName() {
+        return "myJobListener";
+    }
+
+    @Override
+    public void jobToBeExecuted(JobExecutionContext context) {
+        log.info("定时任务:{}-开始执行", context.getTrigger().getJobKey());
+    }
+
+    @Override
+    public void jobExecutionVetoed(JobExecutionContext context) {
+
+    }
+
+    @Override
+    @Transactional
+    public void jobWasExecuted(JobExecutionContext context, JobExecutionException jobException) {
+        String jobEnum = context.getTrigger().getJobKey().getGroup();
+        switch (jobEnum) {
+            case "CREATE_PDF_JOB_GROUP":
+                StringJoiner stringJoiner = new StringJoiner(",");
+                stringJoiner.add("当前执行时间:" + DateUtil.format(context.getFireTime(), SystemConstant.DEFAULT_DATE_PATTERN));
+                if (Objects.nonNull(context.getPreviousFireTime())) {
+                    stringJoiner.add("上次执行时间:" + DateUtil.format(context.getPreviousFireTime(), SystemConstant.DEFAULT_DATE_PATTERN));
+                }
+                if (Objects.nonNull(context.getNextFireTime())) {
+                    stringJoiner.add("下次执行时间:" + DateUtil.format(context.getNextFireTime(), SystemConstant.DEFAULT_DATE_PATTERN));
+                }
+                TSJobLogService tsJobLogService = SpringContextHolder.getBean(TSJobLogService.class);
+                TSJobLog tsJobLog = new TSJobLog(jobEnum, context.getResult().toString(), stringJoiner.toString());
+                tsJobLogService.save(tsJobLog);
+                break;
+            default:
+                break;
+        }
+        log.info("定时任务:{}-执行结束", context.getTrigger().getJobKey());
+    }
+}

+ 1 - 2
teachcloud-obe/src/main/java/com/qmth/teachcloud/obe/service/impl/TRBasicInfoServiceImpl.java

@@ -1056,13 +1056,12 @@ public class TRBasicInfoServiceImpl extends ServiceImpl<TRBasicInfoMapper, TRBas
 //        Objects.requireNonNull(obeCourseWeightResult.getDimensionSign(), "知识点变化id为空");
         List<CourseWeightDto> courseWeightDtoList = obeCourseWeightResult.getSubmitForm();
         if (CollectionUtils.isEmpty(courseWeightDtoList)) {
-            throw ExceptionResultEnum.ERROR.exception("未设置考核方式,报告生成失败,请在课程考核设置菜单设置考核方式及权重");
+            throw ExceptionResultEnum.ERROR.exception("未设置课程目标,报告生成失败,请在课程大纲管理菜单设置课程目标");
         }
         ObeCourseOutline obeCourseOutline = obeCourseOutlineService.getById(obeCourseOutlineId);
         TCPaperStruct tcPaperStruct = tcPaperStructService.queryPaperStruct(obeCourseOutline.getCultureProgramId(), obeCourseOutline.getCourseId(), null);
         if (Objects.nonNull(tcPaperStruct) && Objects.nonNull(tcPaperStruct.getPaperStructDimension())) {
             List<PaperStructDimensionResult> paperStructDimensionResultList = GsonUtil.fromJson(tcPaperStruct.getPaperStructDimension(), new TypeToken<List<PaperStructDimensionResult>>() {
-
             }.getType());
             for (CourseWeightDto c : obeCourseWeightResult.getSubmitForm()) {
                 Double score = paperStructDimensionResultList.stream().filter(s -> Objects.equals(s.getCourseTargetName(), c.getCourseTargetName()))

+ 18 - 2
teachcloud-task/src/main/java/com/qmth/teachcloud/task/job/CreatePdfTaskJob.java

@@ -1,6 +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.mark.enums.LockType;
 import com.qmth.teachcloud.mark.lock.LockService;
 import com.qmth.teachcloud.task.job.service.JobService;
@@ -10,6 +11,8 @@ import org.slf4j.LoggerFactory;
 import org.springframework.scheduling.quartz.QuartzJobBean;
 
 import javax.annotation.Resource;
+import java.math.BigDecimal;
+import java.util.StringJoiner;
 
 /**
  * pdf自动生成任务
@@ -23,17 +26,30 @@ public class CreatePdfTaskJob extends QuartzJobBean {
     @Resource
     LockService lockService;
 
+    @Resource
+    MyThreadPool myThreadPool;
+
     @Override
     protected void executeInternal(JobExecutionContext jobExecutionContext) {
         if (lockService.trylock(LockType.CREATE_PDF, LockType.CREATE_PDF.name())) {
-            log.info("ThreadPoolTaskExecutor create_pdf锁已获取");
             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());
             } catch (Exception e) {
                 log.error(SystemConstant.LOG_ERROR, e);
             } finally {
                 lockService.unlock(LockType.CREATE_PDF, LockType.CREATE_PDF.name());
-                log.info("ThreadPoolTaskExecutor create_pdf锁已释放");
             }
         }
     }

+ 0 - 10
teachcloud-task/src/main/java/com/qmth/teachcloud/task/job/service/impl/JobServiceImpl.java

@@ -211,10 +211,8 @@ public class JobServiceImpl implements JobService {
             List<TBTaskPdf> tbTaskPdfList = tbTaskPdfService.listWaitingTask();
             for (TBTaskPdf tbTaskPdf : tbTaskPdfList) {
                 if (this.getMyThreadPoolPercent()) {
-                    log.info("ThreadPoolTaskExecutor 执行线程");
                     asyncCreatePdfTemplateService.createPdf(tbTaskPdf, null);
                 } else {
-                    log.info("ThreadPoolTaskExecutor 不执行线程");
                     break;
                 }
             }
@@ -229,14 +227,6 @@ public class JobServiceImpl implements JobService {
     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);
-        log.info("ThreadPoolTaskExecutor percent:{},corePoolSize:{},maximumPoolSize:{},poolSize:{},queueSize:{},activeCount:{},completedTaskCount:{},taskCount:{}", percent,
-                myThreadPool.getThreadPoolTaskExecutor().getThreadPoolExecutor().getCorePoolSize(),
-                myThreadPool.getThreadPoolTaskExecutor().getThreadPoolExecutor().getMaximumPoolSize(),
-                myThreadPool.getThreadPoolTaskExecutor().getThreadPoolExecutor().getPoolSize(),
-                myThreadPool.getThreadPoolTaskExecutor().getThreadPoolExecutor().getQueue().size(),
-                myThreadPool.getThreadPoolTaskExecutor().getThreadPoolExecutor().getActiveCount(),
-                myThreadPool.getThreadPoolTaskExecutor().getThreadPoolExecutor().getCompletedTaskCount(),
-                myThreadPool.getThreadPoolTaskExecutor().getThreadPoolExecutor().getTaskCount());
         return percent.compareTo(SystemConstant.PERCENT) == -1 ? true : false;
     }