Selaa lähdekoodia

add
优化定时任务

# Conflicts:
# nb-admin/src/main/resources/application-dev.yml
# nb-admin/src/main/resources/logback-spring.xml
# nb-service/web-service/src/main/java/com/nb/web/service/bus/service/LocalBusClinicService.java
# nb-service/web-service/src/main/java/com/nb/web/service/bus/service/LocalBusPatientService.java
# nb-service/web-service/src/main/java/com/nb/web/service/quartz/job/service/impl/SysJobServiceImpl.java
# nb-service/web-service/src/main/java/com/nb/web/service/quartz/util/AbstractQuartzJob.java

# Conflicts:
# nb-admin/src/main/resources/application-prod.yml
# nb-admin/src/main/resources/application.yml
# nb-admin/src/main/resources/logback-spring.xml
# nb-core/src/main/java/com/nb/core/utils/DateCompareUtil.java
# nb-service/web-service/pom.xml

lifang 1 kuukausi sitten
vanhempi
commit
4a9d12663a

+ 4 - 9
nb-admin/src/main/resources/logback-spring.xml

@@ -5,6 +5,7 @@
               value="%red(%d{yyyy-MM-dd HH:mm:ss}) %green([%thread]) %highlight(%-5level) %boldMagenta(%logger{36}%n) - %msg%n"/>
     <property name="log.pattern" value="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"/>
 
+
     <appender name="ERRORLOGEventPublisher" class="com.nb.common.log.SystemLoggingAppender">
         <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
             <level>WARN</level>
@@ -24,15 +25,13 @@
         <file>${LOG_PATH}/sys-console.log</file>
         <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
             <!-- 日志文件名格式 -->
-            <fileNamePattern>${LOG_PATH}/sys-console.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
+            <fileNamePattern>${LOG_PATH}/sys-console.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
             <!-- 日志最大的历史 15天 -->
             <maxHistory>15</maxHistory>
             <!-- 单个文件最大100MB -->
             <maxFileSize>100MB</maxFileSize>
             <!-- 总日志保留大小 -->
             <totalSizeCap>10GB</totalSizeCap>
-            <!-- 设置7天滚动一次 -->
-            <cleanHistoryOnStart>true</cleanHistoryOnStart>
         </rollingPolicy>
         <encoder>
             <pattern>${log.pattern}</pattern>
@@ -50,15 +49,13 @@
         <!-- 循环政策:基于时间和大小创建日志文件 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
             <!-- 日志文件名格式 -->
-            <fileNamePattern>${LOG_PATH}/sys-info.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
+            <fileNamePattern>${LOG_PATH}/sys-info.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
             <!-- 日志最大的历史 15天 -->
             <maxHistory>15</maxHistory>
             <!-- 单个文件最大100MB -->
             <maxFileSize>100MB</maxFileSize>
             <!-- 总日志保留大小 -->
             <totalSizeCap>10GB</totalSizeCap>
-            <!-- 设置7天滚动一次 -->
-            <cleanHistoryOnStart>true</cleanHistoryOnStart>
         </rollingPolicy>
         <encoder>
             <pattern>${log.pattern}</pattern>
@@ -78,15 +75,13 @@
         <!-- 循环政策:基于时间和大小创建日志文件 -->
         <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
             <!-- 日志文件名格式 -->
-            <fileNamePattern>${LOG_PATH}/sys-error.%d{yyyy-MM-dd}.%i.log.gz</fileNamePattern>
+            <fileNamePattern>${LOG_PATH}/sys-error.%d{yyyy-MM-dd}.%i.log</fileNamePattern>
             <!-- 日志最大的历史 15天 -->
             <maxHistory>15</maxHistory>
             <!-- 单个文件最大100MB -->
             <maxFileSize>100MB</maxFileSize>
             <!-- 总日志保留大小 -->
             <totalSizeCap>10GB</totalSizeCap>
-            <!-- 设置7天滚动一次 -->
-            <cleanHistoryOnStart>true</cleanHistoryOnStart>
         </rollingPolicy>
         <encoder>
             <pattern>${log.pattern}</pattern>

+ 8 - 58
nb-core/src/main/java/com/nb/core/utils/DateCompareUtil.java

@@ -2,9 +2,6 @@ package com.nb.core.utils;
 
 import cn.hutool.core.date.DateUtil;
 
-import java.time.LocalDateTime;
-import java.time.ZoneId;
-import java.time.format.DateTimeFormatter;
 import java.util.Date;
 
 /**
@@ -17,13 +14,13 @@ import java.util.Date;
 public class DateCompareUtil {
 
     /**
-     * 按年月日时分进行比较,忽略秒和毫秒部分,时区为东八区
+     * 按年月日时分进行比较,忽略毫秒部分
      *
      * @param date1 第一个日期
      * @param date2 第二个日期
-     * @return 如果两个日期的年月日时分相同返回true,否则返回false
+     * @return 如果两个日期的年月日时分相同返回true,否则返回false
      */
-    public static boolean isSameDateTimeIgnoreSeconds(Date date1, Date date2) {
+    public static boolean isSameDateTimeIgnoreMillis(Date date1, Date date2) {
         if (date1 == null && date2 == null) {
             return true;
         }
@@ -31,13 +28,8 @@ public class DateCompareUtil {
             return false;
         }
 
-        // 转换为东八区 LocalDateTime
-        ZoneId chinaZone = ZoneId.of("Asia/Shanghai");
-        LocalDateTime localDateTime1 = date1.toInstant().atZone(chinaZone).toLocalDateTime();
-        LocalDateTime localDateTime2 = date2.toInstant().atZone(chinaZone).toLocalDateTime();
-        
-        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
-        return localDateTime1.format(formatter).equals(localDateTime2.format(formatter));
+        String format = "yyyy-MM-dd HH:mm:ss";
+        return DateUtil.format(date1, format).equals(DateUtil.format(date2, format));
     }
 
     /**
@@ -55,35 +47,11 @@ public class DateCompareUtil {
             return false;
         }
 
-        // 转换为东八区进行比较
-        ZoneId chinaZone = ZoneId.of("Asia/Shanghai");
-        LocalDateTime localDateTime1 = date1.toInstant().atZone(chinaZone).toLocalDateTime();
-        LocalDateTime localDateTime2 = date2.toInstant().atZone(chinaZone).toLocalDateTime();
-
-        return localDateTime1.toLocalDate().equals(localDateTime2.toLocalDate());
+        return DateUtil.isSameDay(date1, date2);
     }
 
     /**
-     * 按年月日时分秒进行比较,忽略毫秒部分
-     *
-     * @param date1 第一个日期
-     * @param date2 第二个日期
-     * @return 如果两个日期的年月日时分秒相同返回true,否则返回false
-     */
-    public static boolean isSameDateTimeIgnoreMillis(Date date1, Date date2) {
-        if (date1 == null && date2 == null) {
-            return true;
-        }
-        if (date1 == null || date2 == null) {
-            return false;
-        }
-
-        String format = "yyyy-MM-dd HH:mm:ss";
-        return DateUtil.format(date1, format).equals(DateUtil.format(date2, format));
-    }
-
-    /**
-     * 按年月日时分秒毫秒进行精确比较,时区为东八区
+     * 按年月日时分秒毫秒进行精确比较
      *
      * @param date1 第一个日期
      * @param date2 第二个日期
@@ -97,24 +65,6 @@ public class DateCompareUtil {
             return false;
         }
 
-        // 转换为东八区进行比较
-        ZoneId chinaZone = ZoneId.of("Asia/Shanghai");
-        LocalDateTime localDateTime1 = date1.toInstant().atZone(chinaZone).toLocalDateTime();
-        LocalDateTime localDateTime2 = date2.toInstant().atZone(chinaZone).toLocalDateTime();
-        
-        return localDateTime1.equals(localDateTime2);
-    }
-    
-    /**
-     * 将Date转换为年月日时分字符串形式,时区为东八区
-     * 
-     * @param date 待转换的日期
-     * @return 格式为"yyyy-MM-dd HH:mm"的字符串
-     */
-    public static Date convertToyyyyMMddHHmm(Date date) {
-        if (date == null) {
-            return null;
-        }
-        return DateUtil.beginOfMinute(date);
+        return date1.equals(date2);
     }
 }

+ 109 - 0
nb-service/web-service/src/main/java/com/nb/web/service/quartz/job/service/impl/SysJobServiceImpl.java

@@ -0,0 +1,109 @@
+package com.nb.web.service.quartz.job.service.impl;
+
+import com.nb.web.service.quartz.constant.ScheduleConstants;
+import com.nb.web.service.quartz.exception.TaskException;
+import com.nb.web.service.quartz.job.mapper.SysJobMapper;
+import com.nb.web.service.quartz.job.po.SysJobPO;
+import com.nb.web.service.quartz.job.service.ISysJobService;
+import com.nb.web.service.quartz.util.ScheduleUtils;
+import org.quartz.JobDataMap;
+import org.quartz.JobKey;
+import org.quartz.Scheduler;
+import org.quartz.SchedulerException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+import java.util.Collections;
+import java.util.List;
+
+/**
+@author npy
+@create 2024-08-26-8:54
+*/
+@Service
+public class SysJobServiceImpl implements ISysJobService {
+
+    @Autowired
+    private Scheduler scheduler;
+
+    @Autowired
+    private SysJobMapper jobMapper;
+
+
+    /**
+     * 项目启动时,初始化定时器 主要是防止手动修改数据库导致未同步到定时任务处理(注:不能手动修改数据库ID和任务组名,否则会导致脏数据)
+     */
+    @PostConstruct
+    public void init() throws SchedulerException, TaskException
+    {
+        scheduler.clear();
+    }
+    @Override
+    public List<SysJobPO> selectJobList(SysJobPO job) {
+        return Collections.emptyList();
+    }
+
+    @Override
+    public SysJobPO selectJobById(Long jobId) {
+        return null;
+    }
+
+    @Override
+    public int pauseJob(SysJobPO job) throws SchedulerException {
+        return 0;
+    }
+
+    @Override
+    public int resumeJob(SysJobPO job) throws SchedulerException {
+        return 0;
+    }
+
+    @Override
+    public int deleteJob(SysJobPO job) throws SchedulerException {
+        return 0;
+    }
+
+    @Override
+    public void deleteJobByIds(Long[] jobIds) throws SchedulerException {
+
+    }
+
+    @Override
+    public int changeStatus(SysJobPO job) throws SchedulerException {
+        return 0;
+    }
+
+    @Override
+    public boolean run(SysJobPO job) throws SchedulerException {
+        boolean result = false;
+        Long jobId = Long.valueOf(job.getJobId());
+        String jobGroup = job.getJobGroup();
+        SysJobPO properties = jobMapper.selectJobById(jobId);
+        // 参数
+        JobDataMap dataMap = new JobDataMap();
+        dataMap.put(ScheduleConstants.TASK_PROPERTIES, properties);
+        JobKey jobKey = ScheduleUtils.getJobKey(jobId, jobGroup);
+        if (scheduler.checkExists(jobKey))
+        {
+            result = true;
+            scheduler.triggerJob(jobKey, dataMap);
+        }
+        return result;
+    }
+
+    @Override
+    public int insertJob(SysJobPO job) throws SchedulerException, TaskException {
+        return 0;
+    }
+
+    @Override
+    public int updateJob(SysJobPO job) throws SchedulerException, TaskException {
+        return 0;
+    }
+
+    @Override
+    public boolean checkCronExpressionIsValid(String cronExpression) {
+        return false;
+    }
+}

+ 107 - 0
nb-service/web-service/src/main/java/com/nb/web/service/quartz/util/AbstractQuartzJob.java

@@ -0,0 +1,107 @@
+package com.nb.web.service.quartz.util;
+
+import com.nb.web.service.quartz.constant.Constants;
+import com.nb.web.service.quartz.constant.ScheduleConstants;
+import com.nb.web.service.quartz.job.po.SysJobPO;
+import com.nb.web.service.quartz.jobLog.po.SysJobLogPO;
+import com.nb.web.service.quartz.jobLog.service.ISysJobLogService;
+import org.apache.commons.lang3.StringUtils;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.Date;
+import java.util.UUID;
+
+/**
+ * 抽象quartz调用
+ *
+ * @author ruoyi
+ */
+public abstract class AbstractQuartzJob implements Job
+{
+    private static final Logger log = LoggerFactory.getLogger(AbstractQuartzJob.class);
+
+    /**
+     * 线程本地变量
+     */
+    private static ThreadLocal<Date> threadLocal = new ThreadLocal<>();
+
+    @Override
+    public void execute(JobExecutionContext context) throws JobExecutionException
+    {
+        SysJobPO sysJob = new SysJobPO();
+        BeanUtils.copyBeanProp(sysJob, context.getMergedJobDataMap().get(ScheduleConstants.TASK_PROPERTIES));
+        try
+        {
+            before(context, sysJob);
+            if (sysJob != null)
+            {
+                doExecute(context, sysJob);
+            }
+            after(context, sysJob, null);
+        }
+        catch (Exception e)
+        {
+            log.error("任务执行异常  - :", e);
+            after(context, sysJob, e);
+        }
+    }
+
+    /**
+     * 执行前
+     *
+     * @param context 工作执行上下文对象
+     * @param sysJob 系统计划任务
+     */
+    protected void before(JobExecutionContext context, SysJobPO sysJob)
+    {
+        threadLocal.set(new Date());
+    }
+
+    /**
+     * 执行后
+     *
+     * @param context 工作执行上下文对象
+     * @param sysJob 系统计划任务
+     */
+    protected void after(JobExecutionContext context, SysJobPO sysJob, Exception e)
+    {
+        Date startTime = threadLocal.get();
+        threadLocal.remove();
+
+        final SysJobLogPO sysJobLog = new SysJobLogPO();
+        sysJobLog.setJobName(sysJob.getJobName());
+        sysJobLog.setJobGroup(sysJob.getJobGroup());
+        sysJobLog.setInvokeTarget(sysJob.getInvokeTarget());
+        sysJobLog.setStartTime(startTime);
+        sysJobLog.setEndTime(new Date());
+        long runMs = sysJobLog.getEndTime().getTime() - sysJobLog.getStartTime().getTime();
+        sysJobLog.setJobMessage(sysJobLog.getJobName() + " 总共耗时:" + runMs + "毫秒");
+        sysJobLog.setId(String.valueOf(UUID.randomUUID().toString().replace("-", "").substring(0, 16).hashCode()& 0xFFFF));
+        if (e != null)
+        {
+            sysJobLog.setStatus(Constants.FAIL);
+            String errorMsg = StringUtils.substring(ExceptionUtil.getExceptionMessage(e), 0, 2000);
+            sysJobLog.setExceptionInfo(errorMsg);
+        }
+        else
+        {
+            sysJobLog.setStatus(Constants.SUCCESS);
+        }
+
+        // 写入数据库当中
+//        SpringUtils.getBean(ISysJobLogService.class).addJobLog(sysJobLog);
+    }
+
+    /**
+     * 执行方法,由子类重载
+     *
+     * @param context 工作执行上下文对象
+     * @param sysJob 系统计划任务
+     * @throws Exception 执行过程中的异常
+     */
+    protected abstract void doExecute(JobExecutionContext context, SysJobPO sysJob) throws Exception;
+}