Ver Fonte

fix:任务记录表

wangzaijun há 2 semanas atrás
pai
commit
b667df4d37

+ 33 - 4
mo-daq/src/main/java/com/smppw/modaq/application/task/ParseSchedulerTask.java

@@ -1,8 +1,13 @@
 package com.smppw.modaq.application.task;
 
 import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.exceptions.ExceptionUtil;
 import com.smppw.modaq.application.service.EmailParseApiService;
+import com.smppw.modaq.domain.entity.TaskRecordDO;
+import com.smppw.modaq.domain.service.TaskRecordService;
 import jakarta.annotation.PostConstruct;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 import org.springframework.scheduling.annotation.EnableScheduling;
 import org.springframework.scheduling.annotation.Scheduled;
 import org.springframework.stereotype.Component;
@@ -12,10 +17,14 @@ import java.util.Date;
 @Component
 @EnableScheduling
 public class ParseSchedulerTask {
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+
     private final EmailParseApiService emailParseApiService;
+    private final TaskRecordService taskRecordService;
 
-    public ParseSchedulerTask(EmailParseApiService emailParseApiService) {
+    public ParseSchedulerTask(EmailParseApiService emailParseApiService, TaskRecordService taskRecordService) {
         this.emailParseApiService = emailParseApiService;
+        this.taskRecordService = taskRecordService;
     }
 
     @PostConstruct
@@ -26,9 +35,29 @@ public class ParseSchedulerTask {
     /**
      * 定时任务每2小时执行一次
      */
-    @Scheduled(cron = "0 0 */2 * * ?")
+    @Scheduled(cron = "0 0 */1 * * ?")
     public void run() {
-        Date preDay = DateUtil.offsetMinute(new Date(), -121);
-        this.emailParseApiService.parseEmail(preDay, new Date());
+        String taskKye = "mo_email_parser_task";
+        TaskRecordDO task = this.taskRecordService.getTaskRecord(taskKye);
+        if (task == null) {
+            return;
+        }
+        long start = System.currentTimeMillis();
+        Date now = new Date();
+        try {
+            Date startTime = DateUtil.offsetMinute(task.getStartTime(), -2);
+            this.emailParseApiService.parseEmail(startTime, now);
+            task.setStatus(1);
+        } catch (Exception e) {
+            task.setStatus(2);
+            task.setErrMsg(ExceptionUtil.stacktraceToString(e));
+            this.logger.error("任务{} 执行错误:{}", taskKye, ExceptionUtil.stacktraceToString(e));
+        } finally {
+            task.setEndTime(now);
+            this.taskRecordService.updateStatus(task);
+            if (this.logger.isInfoEnabled()) {
+                this.logger.info("任务{} 执行完成,耗时:{}ms", taskKye, System.currentTimeMillis() - start);
+            }
+        }
     }
 }

+ 38 - 0
mo-daq/src/main/java/com/smppw/modaq/domain/entity/TaskRecordDO.java

@@ -0,0 +1,38 @@
+package com.smppw.modaq.domain.entity;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Getter;
+import lombok.Setter;
+
+import java.util.Date;
+
+@Setter
+@Getter
+@TableName("mo_task_record")
+public class TaskRecordDO {
+    private Long id;
+
+    private String taskKey;
+
+    private Date startTime;
+
+    private Date endTime;
+
+    private Integer status;
+
+    private String errMsg;
+
+    /**
+     * 创建时间
+     */
+    @TableField(value = "createtime", fill = FieldFill.INSERT)
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField(value = "updatetime", fill = FieldFill.INSERT_UPDATE)
+    private Date updateTime;
+}

+ 9 - 0
mo-daq/src/main/java/com/smppw/modaq/domain/mapper/TaskRecordMapper.java

@@ -0,0 +1,9 @@
+package com.smppw.modaq.domain.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.smppw.modaq.domain.entity.TaskRecordDO;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface TaskRecordMapper extends BaseMapper<TaskRecordDO> {
+}

+ 83 - 0
mo-daq/src/main/java/com/smppw/modaq/domain/service/TaskRecordService.java

@@ -0,0 +1,83 @@
+package com.smppw.modaq.domain.service;
+
+import cn.hutool.core.date.DateUtil;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.smppw.modaq.domain.entity.TaskRecordDO;
+import com.smppw.modaq.domain.mapper.TaskRecordMapper;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Service;
+
+import java.util.Date;
+import java.util.Objects;
+
+@Service
+public class TaskRecordService {
+    private final Logger logger = LoggerFactory.getLogger(this.getClass());
+    private final TaskRecordMapper mapper;
+
+    public TaskRecordService(TaskRecordMapper mapper) {
+        this.mapper = mapper;
+    }
+
+    /**
+     * 获取任务的记录
+     *
+     * @param taskKey 任务标识
+     * @return /
+     */
+    public TaskRecordDO getTaskRecord(String taskKey) {
+        TaskRecordDO temp = this.getTaskRecordDO(taskKey);
+        if (temp != null && Objects.equals(0, temp.getStatus())) {
+            this.logger.warn("{} 任务正在执行中,不能重复执行!", taskKey);
+            return null;
+        }
+        if (temp == null) {
+            temp = new TaskRecordDO();
+            temp.setTaskKey(taskKey);
+            temp.setStartTime(DateUtil.offsetDay(new Date(), -1));
+        } else {
+            temp.setId(null);
+            temp.setEndTime(null);
+            temp.setErrMsg(null);
+            temp.setUpdateTime(null);
+            if (Objects.equals(1, temp.getStatus())) {
+                temp.setStartTime(temp.getEndTime());
+            } else {
+                temp.setStartTime(temp.getStartTime());
+            }
+        }
+        temp.setStatus(0);
+        temp.setCreateTime(new Date());
+        this.mapper.insert(temp);
+        return temp;
+    }
+
+    public void updateStatus(TaskRecordDO taskRecordDO) {
+        if (taskRecordDO == null) {
+            return;
+        }
+        Long id = taskRecordDO.getId();
+        if (id != null) {
+            taskRecordDO.setUpdateTime(new Date());
+            this.mapper.updateById(taskRecordDO);
+        } else {
+            this.mapper.insert(taskRecordDO);
+        }
+    }
+
+    /**
+     * 获取最近一次执行的记录
+     *
+     * @param taskKey 任务标识
+     * @return /
+     */
+    private TaskRecordDO getTaskRecordDO(String taskKey) {
+        LambdaUpdateWrapper<TaskRecordDO> wrapper = Wrappers.lambdaUpdate(TaskRecordDO.class)
+                .eq(TaskRecordDO::getTaskKey, taskKey)
+                .orderByDesc(TaskRecordDO::getStartTime)
+                .last("limit 1");
+        return this.mapper.selectOne(wrapper);
+    }
+}