Ver código fonte

add(backend) [定时任务]

wangxiao 4 anos atrás
pai
commit
d93be43d8d

+ 20 - 1
operation-backend/src/main/java/com/idiot/operationbackend/config/AsyncPoolConfig.java

@@ -1,9 +1,12 @@
 package com.idiot.operationbackend.config;
 
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.scheduling.annotation.EnableAsync;
 import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
 
 import java.util.concurrent.Executor;
 import java.util.concurrent.ThreadPoolExecutor;
@@ -18,11 +21,13 @@ import java.util.concurrent.ThreadPoolExecutor;
 @Configuration
 public class AsyncPoolConfig {
 
+    private final Logger logger = LoggerFactory.getLogger(AsyncPoolConfig.class);
 
     @Bean(name = "asyncExecutor")
     public Executor  asyncExecutor () {
+        logger.warn("创建异步任务调度线程池-----------------> start");
         ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
-        executor.setCorePoolSize(5);
+        executor.setCorePoolSize(3);
         executor.setMaxPoolSize(10);
         executor.setQueueCapacity(500);
         executor.setKeepAliveSeconds(60);
@@ -31,6 +36,20 @@ public class AsyncPoolConfig {
         executor.setWaitForTasksToCompleteOnShutdown(true);
         executor.setAwaitTerminationSeconds(60);
         executor.initialize();
+        logger.warn("创建异步任务调度线程池-----------------> end");
         return executor;
     }
+
+    @Bean(name = "taskScheduler")
+    public ThreadPoolTaskScheduler threadPoolTaskScheduler(){
+        logger.warn("创建定时任务调度线程池-----------------> start");
+        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
+        scheduler.setPoolSize(10);
+        scheduler.setThreadNamePrefix("taskExecutor--");
+        scheduler.setWaitForTasksToCompleteOnShutdown(true);
+        scheduler.setAwaitTerminationSeconds(60);
+        scheduler.setRemoveOnCancelPolicy(true);
+        logger.warn("创建定时任务调度线程池----------------->  end");
+        return scheduler;
+    }
 }

+ 81 - 0
operation-backend/src/main/java/com/idiot/operationbackend/controller/JobTaskController.java

@@ -0,0 +1,81 @@
+package com.idiot.operationbackend.controller;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.idiot.operationbackend.entity.Account;
+import com.idiot.operationbackend.entity.JobTask;
+import com.idiot.operationbackend.handler.JobScheduleHandler;
+import com.idiot.operationbackend.service.facade.AccountService;
+import com.idiot.operationbackend.service.facade.JobTaskService;
+import com.idiot.operationbackend.support.Constants;
+import com.idiot.operationbackend.support.CustomException;
+import com.idiot.operationbackend.support.JsonResult;
+import com.idiot.operationbackend.util.JwtTokenUtil;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.stream.Collectors;
+
+/**
+ * 定时任务
+ * @author wang xiao
+ * @date Created in 16:47 2020/9/23
+ */
+@RestController
+@RequestMapping("/job")
+@Api(value = "JobTaskController", tags ="定时任务")
+public class JobTaskController {
+
+
+
+    private final Logger logger = LoggerFactory.getLogger(JobTaskController.class);
+
+    @Autowired
+    private AccountService accountService;
+
+    @Autowired
+    private JobTaskService jobTaskService;
+
+    @Autowired
+    private JobScheduleHandler scheduleHandler;
+
+
+    @GetMapping
+    @ApiOperation(value = "定时任务分页列表")
+    public ResponseEntity<JsonResult<Page<JobTask>>> pageJobTask (@RequestHeader String token,
+                                                      @RequestParam int page,
+                                                      @RequestParam(required = false) Integer status) {
+        String userId = JwtTokenUtil.getUserId(token);
+        logger.info("用户:{}定时任务分页列表",userId);
+        List<Account> accounts = accountService.queryAccountByUserId(userId);
+        List<String> ids = accounts.stream().map(Account::getId).collect(Collectors.toList());
+        Page<JobTask> jobTaskPage = jobTaskService.queryPageJobTask(page,status,ids);
+        return ResponseEntity.ok(JsonResult.success(jobTaskPage));
+    }
+
+    @DeleteMapping
+    @ApiOperation(value = "暂停任务")
+    public ResponseEntity<JsonResult<Boolean>> pageJobTask (@RequestHeader String token,
+                                                            @RequestParam String taskKey,
+                                                            @RequestParam String accountId) {
+        String userId = JwtTokenUtil.getUserId(token);
+        boolean enable = accountService.queryAccountByUserId(userId).stream()
+                .anyMatch(e->accountId.equals(e.getId()));
+        if (!enable) {
+            throw new CustomException(500,"你没有权限操作该公众号");
+        }
+        logger.info("用户:{}暂停定时任务,targetKey:{}",userId,taskKey);
+        JobTask jobTask = jobTaskService.queryJobTask(taskKey);
+        scheduleHandler.cancelJob(taskKey);
+        jobTask.setStatus(Constants.CANCEL);
+        jobTask.setUpdateTime(LocalDateTime.now().format(Constants.DATE_TIME_FORMATTER));
+        boolean upResult = jobTaskService.updateById(jobTask);
+        return ResponseEntity.ok(JsonResult.success(upResult));
+    }
+}

+ 0 - 1
operation-backend/src/main/java/com/idiot/operationbackend/controller/group/CustomerMsgController.java

@@ -9,7 +9,6 @@ import com.idiot.operationbackend.service.facade.CustomerMsgService;
 import com.idiot.operationbackend.support.Constants;
 import com.idiot.operationbackend.support.JsonResult;
 import com.idiot.operationbackend.util.JwtTokenUtil;
-import com.idiot.operationbackend.vo.BaseType;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.slf4j.Logger;

+ 1 - 4
operation-backend/src/main/java/com/idiot/operationbackend/controller/group/GroupMsgController.java

@@ -5,11 +5,9 @@ import com.idiot.operationbackend.entity.Account;
 import com.idiot.operationbackend.entity.GroupMsg;
 import com.idiot.operationbackend.service.facade.AccountService;
 import com.idiot.operationbackend.service.facade.GroupMsgService;
-import com.idiot.operationbackend.support.Constants;
 import com.idiot.operationbackend.support.CustomException;
 import com.idiot.operationbackend.support.JsonResult;
 import com.idiot.operationbackend.util.JwtTokenUtil;
-import com.idiot.operationbackend.vo.BaseType;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.slf4j.Logger;
@@ -19,7 +17,6 @@ import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 
 import javax.validation.Valid;
-import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
 import java.util.stream.Collectors;
@@ -35,7 +32,7 @@ import java.util.stream.Collectors;
 public class GroupMsgController {
 
 
-    private final Logger logger = LoggerFactory.getLogger(CustomerMsgController.class);
+    private final Logger logger = LoggerFactory.getLogger(GroupMsgController.class);
 
     @Autowired
     private AccountService accountService;

+ 1 - 1
operation-backend/src/main/java/com/idiot/operationbackend/controller/group/TemplateMsgController.java

@@ -35,7 +35,7 @@ import java.util.stream.Collectors;
 @Api(value = "TemplateMsgController", tags ="模板消息")
 public class TemplateMsgController {
 
-    private final Logger logger = LoggerFactory.getLogger(CustomerMsgController.class);
+    private final Logger logger = LoggerFactory.getLogger(TemplateMsgController.class);
 
     @Autowired
     private AccountService accountService;

+ 142 - 0
operation-backend/src/main/java/com/idiot/operationbackend/entity/JobTask.java

@@ -0,0 +1,142 @@
+package com.idiot.operationbackend.entity;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+
+/**
+ * 定时任务
+ * @author wang xiao
+ * @date Created in 14:43 2020/9/23
+ */
+@TableName("t_job_task")
+public class JobTask {
+
+    @TableId
+    private String id;
+
+    private String accountId;
+
+    private String nikeName;
+
+    private String headImage;
+
+    private String taskLabel;
+
+    private Long taskTimer;
+
+    private Integer status;
+
+    private Integer type;
+
+    private String taskKey;
+
+    private String createTime;
+
+    private String updateTime;
+
+    public String getId() {
+        return id;
+    }
+
+    public void setId(String id) {
+        this.id = id;
+    }
+
+    public String getAccountId() {
+        return accountId;
+    }
+
+    public void setAccountId(String accountId) {
+        this.accountId = accountId;
+    }
+
+    public String getNikeName() {
+        return nikeName;
+    }
+
+    public void setNikeName(String nikeName) {
+        this.nikeName = nikeName;
+    }
+
+    public String getHeadImage() {
+        return headImage;
+    }
+
+    public void setHeadImage(String headImage) {
+        this.headImage = headImage;
+    }
+
+    public String getTaskLabel() {
+        return taskLabel;
+    }
+
+    public void setTaskLabel(String taskLabel) {
+        this.taskLabel = taskLabel;
+    }
+
+    public Long getTaskTimer() {
+        return taskTimer;
+    }
+
+    public void setTaskTimer(Long taskTimer) {
+        this.taskTimer = taskTimer;
+    }
+
+    public Integer getStatus() {
+        return status;
+    }
+
+    public void setStatus(Integer status) {
+        this.status = status;
+    }
+
+    public Integer getType() {
+        return type;
+    }
+
+    public void setType(Integer type) {
+        this.type = type;
+    }
+
+    public String getTaskKey() {
+        return taskKey;
+    }
+
+    public void setTaskKey(String taskKey) {
+        this.taskKey = taskKey;
+    }
+
+    public String getCreateTime() {
+        return createTime;
+    }
+
+    public void setCreateTime(String createTime) {
+        this.createTime = createTime;
+    }
+
+    public String getUpdateTime() {
+        return updateTime;
+    }
+
+    public void setUpdateTime(String updateTime) {
+        this.updateTime = updateTime;
+    }
+
+
+    @Override
+    public String toString() {
+        return "JobTask{" +
+                "id='" + id + '\'' +
+                ", accountId='" + accountId + '\'' +
+                ", nikeName='" + nikeName + '\'' +
+                ", headImage='" + headImage + '\'' +
+                ", taskLabel='" + taskLabel + '\'' +
+                ", taskTimer=" + taskTimer +
+                ", status=" + status +
+                ", type=" + type +
+                ", taskKey='" + taskKey + '\'' +
+                ", createTime='" + createTime + '\'' +
+                ", updateTime='" + updateTime + '\'' +
+                '}';
+    }
+}

+ 207 - 0
operation-backend/src/main/java/com/idiot/operationbackend/handler/JobScheduleHandler.java

@@ -0,0 +1,207 @@
+package com.idiot.operationbackend.handler;
+
+import com.idiot.operationbackend.entity.JobTask;
+import com.idiot.operationbackend.service.facade.JobTaskService;
+import com.idiot.operationbackend.support.job.BaseScheduledTask;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.InitializingBean;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
+import org.springframework.stereotype.Component;
+import org.springframework.util.CollectionUtils;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ScheduledFuture;
+import java.util.concurrent.locks.ReentrantLock;
+
+/**
+ * @author wang xiao
+ * @date Created in 15:24 2020/9/23
+ */
+@Component
+public class JobScheduleHandler implements InitializingBean {
+
+    /**
+     * 添加进来的job 未注册
+     */
+    private final Map<String, JobTask>  taskMap = new ConcurrentHashMap<>(16);
+
+    /**
+     * 注册进来的 ScheduledFuture
+     */
+    private final Map<String, ScheduledFuture<?>>  futureMap = new ConcurrentHashMap<>(16);
+
+    private final Logger logger = LoggerFactory.getLogger(JobScheduleHandler.class);
+
+    private final ReentrantLock lock = new ReentrantLock();
+
+
+
+    @Autowired
+    @Qualifier(value = "taskScheduler")
+    private ThreadPoolTaskScheduler taskScheduler;
+
+
+    @Autowired
+    private JobTaskService jobTaskService;
+
+
+    /**
+     *  添加任务
+     * @author wangxiao
+     * @date 16:05 2020/9/23
+     * @param jobTask 任务
+     * @return java.lang.Boolean
+     */
+    public Boolean addJob(JobTask jobTask) {
+        String taskKey = jobTask.getTaskKey();
+        logger.info("任务:[任务id:{},公众号:{},描述:{}],添加任务------>start",jobTask.getId(),jobTask.getAccountId(),jobTask.getTaskLabel());
+        lock.lock();
+        try{
+            if (isAdd(taskKey)) {
+                logger.info("任务:[任务id:{},公众号:{},描述:{}],添加任务------>已经存在",jobTask.getId(),jobTask.getAccountId(),jobTask.getTaskLabel());
+                return false;
+            }
+            this.taskMap.put(taskKey,jobTask);
+            logger.info("任务:[任务id:{},公众号:{},描述:{}],添加任务------>end",jobTask.getId(),jobTask.getAccountId(),jobTask.getTaskLabel());
+        }finally {
+            lock.unlock();
+            logger.info("任务:[任务id:{},公众号:{},描述:{}],添加任务------>lock error",jobTask.getId(),jobTask.getAccountId(),jobTask.getTaskLabel());
+        }
+        return null;
+    }
+
+    /**
+     *  执行注册任务
+     * @author wangxiao
+     * @date 16:00 2020/9/23
+     * @param taskKey taskKey
+     */
+    private void registerTask(String  taskKey) {
+        JobTask jobTask = taskMap.get(taskKey);
+        if (Objects.isNull(jobTask)) {
+            return;
+        }
+        if (isRegister(taskKey)){
+            logger.info("任务:[任务id:{},公众号:{},描述:{}]注册------->已经注册",jobTask.getId(),jobTask.getAccountId(),jobTask.getTaskLabel());
+        }
+        logger.info("任务:[任务id:{},公众号:{},描述:{}]注册------->start",jobTask.getId(),jobTask.getAccountId(),jobTask.getTaskLabel());
+        Long  taskTime = jobTask.getTaskTimer();
+        BaseScheduledTask scheduledTask = getTaskByKey(taskKey);
+        if (Objects.isNull(scheduledTask)){
+            logger.info("任务:[任务id:{},公众号:{},描述:{}]注册------->is null",jobTask.getId(),jobTask.getAccountId(),jobTask.getTaskLabel());
+            return;
+        }
+        ScheduledFuture<?> scheduledFuture = taskScheduler.schedule(scheduledTask,new Date(taskTime));
+        futureMap.put(taskKey, scheduledFuture);
+        logger.info("任务:[任务id:{},公众号:{},描述:{}]注册------->end",jobTask.getId(),jobTask.getAccountId(),jobTask.getTaskLabel());
+    }
+
+    /**
+     *  添加并注册
+     * @author wangxiao
+     * @date 16:35 2020/9/23
+     * @param jobTask jobTask
+     */
+    public void addAndRegisterJob(JobTask jobTask) {
+        String taskKey = jobTask.getTaskKey();
+        addJob(jobTask);
+        registerTask(taskKey);
+    }
+
+
+   /**
+    * 取消任务
+    * @author wangxiao
+    * @date 16:02 2020/9/23
+    * @param taskKey taskKey
+    * @return java.lang.Boolean
+    */
+    public Boolean cancelJob(String taskKey) {
+        logger.info("任务:[任务taskKey:{}]取消任务------->start",taskKey);
+        boolean taskStartFlag = futureMap.containsKey(taskKey);
+        logger.info("任务:[任务taskKey:{}是否存在:{}]取消任务------->start",taskKey,taskStartFlag);
+        if (taskStartFlag) {
+            ScheduledFuture<?> scheduledFuture = futureMap.get(taskKey);
+            scheduledFuture.cancel(true);
+            futureMap.remove(taskKey);
+        }
+        taskMap.remove(taskKey);
+        logger.info("任务:[任务taskKey:{}]取消任务------->end",taskKey);
+        return taskStartFlag;
+    }
+
+    /**
+     *  重新添加
+     * @author wangxiao
+     * @date 16:25 2020/9/23
+     * @param taskKey taskKey
+     * @return java.lang.Boolean
+     */
+    public Boolean restart(String taskKey) {
+        JobTask jobTask = taskMap.get(taskKey);
+        logger.info("任务:[任务id:{},公众号:{},描述:{}]重启",jobTask.getId(),jobTask.getAccountId(),jobTask.getTaskLabel());
+        this.cancelJob(taskKey);
+        return this.addJob(jobTask);
+    }
+
+
+    /**
+     *  是否已经注册成功
+     * @author wangxiao
+     * @date 15:59 2020/9/23
+     * @param taskKey taskKey
+     * @return java.lang.Boolean
+     */
+    private Boolean isRegister(String taskKey) {
+        if (futureMap.containsKey(taskKey)) {
+            if (!futureMap.get(taskKey).isCancelled()) {
+                return true;
+            }
+        }
+        return false;
+    }
+
+    /**
+     *  是否已经添加成功
+     * @author wangxiao
+     * @date 15:59 2020/9/23
+     * @param taskKey taskKey
+     * @return java.lang.Boolean
+     */
+    private Boolean isAdd(String taskKey) {
+        return taskMap.containsKey(taskKey);
+    }
+
+    /**
+     *
+     * @author wangxiao
+     * @date 16:29 2020/9/23
+     * @param taskKey
+     * @return com.idiot.operationbackend.support.job.BaseScheduledTask
+     */
+    private BaseScheduledTask getTaskByKey (String taskKey) {
+        return null;
+    }
+
+
+    @Override
+    public void afterPropertiesSet() throws Exception {
+        List<JobTask> jobTaskList = jobTaskService.queryByInitJob();
+        if (CollectionUtils.isEmpty(jobTaskList)) {
+            return;
+        }
+        int size = jobTaskList.size();;
+        logger.error("!!!!初始化启动加载job!!!!--------->start,job size is:{}",size);
+        for (JobTask jobTask : jobTaskList) {
+            addAndRegisterJob(jobTask);
+        }
+        logger.error("!!!!初始化启动加载job!!!!--------->end,  job size is:{}",size);
+    }
+}

+ 11 - 0
operation-backend/src/main/java/com/idiot/operationbackend/mappers/JobTaskMapper.java

@@ -0,0 +1,11 @@
+package com.idiot.operationbackend.mappers;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.idiot.operationbackend.entity.JobTask;
+
+/**
+ * @author wang xiao
+ * @date Created in 14:53 2020/9/23
+ */
+public interface JobTaskMapper extends BaseMapper<JobTask> {
+}

+ 44 - 0
operation-backend/src/main/java/com/idiot/operationbackend/service/facade/JobTaskService.java

@@ -0,0 +1,44 @@
+package com.idiot.operationbackend.service.facade;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.idiot.operationbackend.entity.JobTask;
+
+import java.util.List;
+
+/**
+ * @author wang xiao
+ * @date Created in 14:53 2020/9/23
+ */
+public interface JobTaskService extends IService<JobTask> {
+
+    /**
+     * 查询需要加载的定时任务
+     * @author wangxiao
+     * @date 14:57 2020/9/23
+     * @return java.util.List<com.idiot.operationbackend.entity.JobTask>
+     */
+    List<JobTask> queryByInitJob();
+
+
+    /**
+     *  查询定时任务
+     * @author wangxiao
+     * @date 15:38 2020/9/23
+     * @param taskKey taskKey
+     * @return com.idiot.operationbackend.entity.JobTask
+     */
+    JobTask queryJobTask(String taskKey);
+
+
+    /**
+     *  查询分页定时
+     * @author wangxiao
+     * @date 17:06 2020/9/23
+     * @param page page
+     * @param status status
+     * @param ids ids
+     * @return com.baomidou.mybatisplus.extension.plugins.pagination.Page<com.idiot.operationbackend.entity.JobTask>
+     */
+    Page<JobTask> queryPageJobTask(int page,Integer status,List<String> ids);
+}

+ 48 - 0
operation-backend/src/main/java/com/idiot/operationbackend/service/impl/JobTaskServiceImpl.java

@@ -0,0 +1,48 @@
+package com.idiot.operationbackend.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.idiot.operationbackend.entity.JobTask;
+import com.idiot.operationbackend.mappers.JobTaskMapper;
+import com.idiot.operationbackend.service.facade.JobTaskService;
+import com.idiot.operationbackend.support.Constants;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * @author wang xiao
+ * @date Created in 14:55 2020/9/23
+ */
+@Service
+public class JobTaskServiceImpl extends ServiceImpl<JobTaskMapper, JobTask> implements JobTaskService {
+
+
+    @Override
+    public List<JobTask> queryByInitJob() {
+        long epochMilli = LocalDateTime.now().toInstant(Constants.DEFAULT_ZONE).toEpochMilli();
+        return list(Wrappers.<JobTask>lambdaQuery().eq(JobTask::getStatus,Constants.WAITING)
+                .gt(JobTask::getTaskTimer,epochMilli));
+    }
+
+    @Override
+    public JobTask queryJobTask(String taskKey) {
+        return getOne(Wrappers.<JobTask>lambdaQuery().eq(JobTask::getTaskKey,taskKey),false);
+    }
+
+    @Override
+    public Page<JobTask> queryPageJobTask(int page, Integer status, List<String> ids) {
+        Page<JobTask> queryPage = new Page<>(page,15);
+        LambdaQueryWrapper<JobTask> queryWrapper = Wrappers.<JobTask>lambdaQuery();
+        if (Objects.nonNull(status)) {
+            queryWrapper.eq(JobTask::getStatus,status);
+        }
+        queryWrapper.in(JobTask::getAccountId,ids)
+                .orderByDesc(JobTask::getCreateTime);
+        return page(queryPage,queryWrapper);
+    }
+}

+ 9 - 0
operation-backend/src/main/java/com/idiot/operationbackend/support/job/BaseScheduledTask.java

@@ -0,0 +1,9 @@
+package com.idiot.operationbackend.support.job;
+
+/**
+ * 调度接口 封装一层是为了名字统一
+ * @author wang xiao
+ * @date Created in 15:07 2020/9/23
+ */
+public interface BaseScheduledTask extends Runnable{
+}

+ 14 - 0
operation-backend/src/main/java/com/idiot/operationbackend/support/job/GroupScheduledTaskTask.java

@@ -0,0 +1,14 @@
+package com.idiot.operationbackend.support.job;
+
+/**
+ * @author wang xiao
+ * @date Created in 15:09 2020/9/23
+ */
+public class GroupScheduledTaskTask implements BaseScheduledTask {
+
+
+    @Override
+    public void run() {
+
+    }
+}

+ 21 - 0
sql/dataBase.sql

@@ -434,3 +434,24 @@ CREATE TABLE `t_template_msg`  (
   `create_time` datetime(0) NULL DEFAULT NULL,
   PRIMARY KEY (`id`) USING BTREE
 ) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '模板消息' ROW_FORMAT = Dynamic;
+
+
+-- ----------------------------
+-- Table structure for t_job_task 定时任务
+-- ----------------------------
+DROP TABLE IF EXISTS `t_job_task`;
+CREATE TABLE `t_job_task`  (
+  `id` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL COMMENT 'id',
+  `task_label` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '任务描述',
+  `task_timer` bigint(0) NULL DEFAULT NULL COMMENT '出发时间戳',
+  `status` tinyint(1) NULL DEFAULT NULL COMMENT '状态',
+  `type` tinyint(1) NULL DEFAULT NULL COMMENT '类型 0群发1客服消息3模板消息',
+  `task_key` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL COMMENT '任务信息id',
+  `create_time` datetime(0) NULL DEFAULT NULL,
+  `update_time` datetime(0) NULL DEFAULT NULL,
+  `account_id` varchar(30) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
+  `nike_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
+  `head_image` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NULL DEFAULT NULL,
+  PRIMARY KEY (`id`) USING BTREE
+) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '定时任务记录表' ROW_FORMAT = Dynamic;
+