Преглед на файлове

fix:定时任务要给定一个超时时间,防止因系统中断或网络问题导致的任务无法重复执行问题

wangzaijun преди 1 месец
родител
ревизия
1c66906b86

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

@@ -47,8 +47,8 @@ public class ParseSchedulerTask {
      */
     @Scheduled(cron = "0 */11 * * * ?")
     public void letter() {
-        String taskKye = "mo_email_parse_letter_task";
-        TaskRecordDO task = this.taskRecordService.getTaskRecord(taskKye);
+        String taskKey = "mo_email_parse_letter_task";
+        TaskRecordDO task = this.taskRecordService.getTaskRecord(taskKey, 11 * 2 * 60);
         if (task == null) {
             return;
         }
@@ -64,12 +64,12 @@ public class ParseSchedulerTask {
         } catch (Exception e) {
             task.setStatus(2);
             task.setErrMsg(ExceptionUtil.stacktraceToString(e));
-            this.logger.error("任务{} 执行错误:{}", taskKye, ExceptionUtil.stacktraceToString(e));
+            this.logger.error("任务{} 执行错误:{}", taskKey, ExceptionUtil.stacktraceToString(e));
         } finally {
             task.setEndTime(now);
             this.taskRecordService.updateStatus(task);
             if (this.logger.isInfoEnabled()) {
-                this.logger.info("任务{} 执行完成,耗时:{}ms", taskKye, System.currentTimeMillis() - start);
+                this.logger.info("任务{} 执行完成,耗时:{}ms", taskKey, System.currentTimeMillis() - start);
             }
         }
     }
@@ -79,8 +79,8 @@ public class ParseSchedulerTask {
      */
     @Scheduled(cron = "0 */21 * * * ?")
     public void report() {
-        String taskKye = "mo_email_parser_report_task";
-        TaskRecordDO task = this.taskRecordService.getTaskRecord(taskKye);
+        String taskKey = "mo_email_parser_report_task";
+        TaskRecordDO task = this.taskRecordService.getTaskRecord(taskKey, 21 * 2 * 60);
         if (task == null) {
             return;
         }
@@ -96,12 +96,12 @@ public class ParseSchedulerTask {
         } catch (Exception e) {
             task.setStatus(2);
             task.setErrMsg(ExceptionUtil.stacktraceToString(e));
-            this.logger.error("定期报告解析任务{} 执行错误:{}", taskKye, ExceptionUtil.stacktraceToString(e));
+            this.logger.error("定期报告解析任务{} 执行错误:{}", taskKey, ExceptionUtil.stacktraceToString(e));
         } finally {
             task.setEndTime(now);
             this.taskRecordService.updateStatus(task);
             if (this.logger.isInfoEnabled()) {
-                this.logger.info("定期报告解析任务{} 执行完成,耗时:{}ms", taskKye, System.currentTimeMillis() - start);
+                this.logger.info("定期报告解析任务{} 执行完成,耗时:{}ms", taskKey, System.currentTimeMillis() - start);
             }
         }
     }

+ 12 - 5
mo-daq/src/main/java/com/smppw/modaq/domain/service/TaskRecordService.java

@@ -25,13 +25,22 @@ public class TaskRecordService {
      * 获取任务的记录
      *
      * @param taskKey 任务标识
+     * @param timeout 执行中的任务超时等待时间,单位秒
      * @return /
      */
-    public TaskRecordDO getTaskRecord(String taskKey) {
+    public TaskRecordDO getTaskRecord(String taskKey, int timeout) {
+        if (timeout <= 0) {
+            throw new RuntimeException("任务超时时间设置错误");
+        }
         TaskRecordDO temp = this.getTaskRecordDO(taskKey);
         if (temp != null && Objects.equals(0, temp.getStatus())) {
-            this.logger.warn("{} 任务正在执行中,不能重复执行!", taskKey);
-            return null;
+            Date timeoutDate = DateUtil.offsetSecond(new Date(), -1 * timeout);
+            if (temp.getStartTime() != null && temp.getStartTime().compareTo(timeoutDate) < 0) {
+                this.logger.info("{} 任务执行超时限制时间{}s,重新执行任务!", taskKey, timeout);
+            } else {
+                this.logger.warn("{} 任务正在执行中,不能重复执行!", taskKey);
+                return null;
+            }
         }
         if (temp == null) {
             temp = new TaskRecordDO();
@@ -43,8 +52,6 @@ public class TaskRecordService {
             temp.setUpdateTime(null);
             if (Objects.equals(1, temp.getStatus())) {
                 temp.setStartTime(temp.getEndTime());
-            } else {
-                temp.setStartTime(temp.getStartTime());
             }
             temp.setEndTime(null);
         }