Bladeren bron

quartz定时任务配置

ZhangManMan 2 jaren geleden
bovenliggende
commit
4456d293e7

+ 10 - 0
src/main/java/com/sky/ioc/constant/Constant.java

@@ -6,4 +6,14 @@ public class Constant {
     public static MsgCode MSG_CODE = new MsgCode();
 
    public final static  String PHONE_CODE = "089383";
+
+    /**
+     * 正常状态
+     */
+    public static final Integer STATUS_NORMAL = 0;
+
+    /**
+     * 禁用状态
+     */
+    public static final Integer STATUS_DISABLE = -1;
 }

+ 35 - 0
src/main/java/com/sky/ioc/controller/scene/StrategyController.java

@@ -1,6 +1,9 @@
 package com.sky.ioc.controller.scene;
 
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.sky.ioc.entity.QuartzJob;
 import com.sky.ioc.entity.domain.scene.Strategy;
+import com.sky.ioc.service.job.IQuartzJobService;
 import com.sky.ioc.service.scene.StrategyService;
 import com.sky.ioc.tool.ReturnMsg;
 import io.swagger.annotations.Api;
@@ -21,6 +24,9 @@ public class StrategyController {
     @Autowired
     StrategyService strategyService;
 
+    @Autowired
+    private IQuartzJobService quartzJobService;
+
     @ApiOperation("创建策略")
     @PostMapping(value = "/add")
     public ReturnMsg addStrategy(@RequestBody Strategy strategy){
@@ -53,4 +59,33 @@ public class StrategyController {
     public ReturnMsg batchDelByIds(@RequestBody List<Integer> ids){
         return strategyService.delBatchById(ids);
     }
+
+    @ApiOperation("创建定时任务")
+    @PostMapping(value = "/addjob")
+    public ReturnMsg addjob(@RequestBody QuartzJob quartzJob){
+        List<QuartzJob> list = quartzJobService.list(new QueryWrapper<QuartzJob>().eq("job_class_name", quartzJob.getJobClassName()));
+        if (list != null && list.size() > 0) {
+            return ReturnMsg.fail("该定时任务类名已存在");
+        }
+        quartzJobService.saveAndScheduleJob(quartzJob);
+        return ReturnMsg.ok("创建定时任务成功");
+    }
+
+    /**
+     * 通过id删除
+     *
+     * @param id
+     * @return
+     */
+    @ApiOperation("删除定时任务")
+    @PostMapping(value = "/deljob")
+    public ReturnMsg<?> delete(@RequestParam(name = "id", required = true) String id) {
+        QuartzJob quartzJob = quartzJobService.getById(id);
+        if (quartzJob == null) {
+            return ReturnMsg.fail("未找到对应实体");
+        }
+        quartzJobService.deleteAndStopJob(quartzJob);
+        return ReturnMsg.ok("删除成功!");
+    }
+
 }

+ 71 - 0
src/main/java/com/sky/ioc/entity/QuartzJob.java

@@ -0,0 +1,71 @@
+package com.sky.ioc.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+
+@Data
+@TableName("sys_quartz_job")
+public class QuartzJob implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.AUTO)
+    private Integer id;
+    /**
+     * 创建人
+     */
+    private String createBy;
+
+
+    /**
+     * 修改人
+     */
+    private String updateBy;
+
+    /**
+     * 任务类名
+     */
+    private String jobClassName;
+    /**
+     * cron表达式
+     */
+    private String cronExpression;
+    /**
+     * 参数
+     */
+    private String parameter;
+    /**
+     * 描述
+     */
+    private String description;
+    /**
+     * 状态 0正常 -1停止
+     */
+    private Integer status;
+    /**
+     * 删除状态
+     */
+    @TableLogic
+    private Integer delFlag;
+    /**
+     * 创建时间
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT)
+    private Date createTime;
+    /**
+     * 修改时间
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @TableField(fill = FieldFill.INSERT_UPDATE)
+    private Date updateTime;
+}

+ 23 - 0
src/main/java/com/sky/ioc/job/SampleJob.java

@@ -0,0 +1,23 @@
+package com.sky.ioc.job;
+
+import lombok.extern.slf4j.Slf4j;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+
+import java.util.Date;
+
+/**
+ * 不带参的简单定时任务
+ * 
+ * @Author nzc
+ */
+@Slf4j
+public class SampleJob implements Job {
+
+	@Override
+	public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
+
+		log.info(String.format("普通定时任务 SampleJob !  时间:" + new Date()));
+	}
+}

+ 39 - 0
src/main/java/com/sky/ioc/job/SampleParamJob.java

@@ -0,0 +1,39 @@
+package com.sky.ioc.job;
+
+import com.sky.ioc.service.job.IQuartzJobService;
+import lombok.extern.slf4j.Slf4j;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDateTime;
+
+/**
+ * 带参数的简单的定时任务
+ * 
+ * @Author nzc
+ */
+@Component
+@Slf4j
+public class SampleParamJob implements Job {
+
+
+	@Autowired
+	private IQuartzJobService quartzJobService;
+	/**
+	 * 若参数变量名修改 QuartzJobController中也需对应修改
+	 */
+	private String parameter;
+
+	public void setParameter(String parameter) {
+		this.parameter = parameter;
+	}
+
+	@Override
+	public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
+		log.info(String.format("带参数定时任务 SampleParamJob !   时间:" + LocalDateTime.now(), this.parameter));
+		quartzJobService.test(this.parameter);
+	}
+}

+ 11 - 0
src/main/java/com/sky/ioc/mapper/job/QuartzJobMapper.java

@@ -0,0 +1,11 @@
+package com.sky.ioc.mapper.job;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.sky.ioc.entity.QuartzJob;
+import org.apache.ibatis.annotations.Mapper;
+
+@Mapper
+public interface QuartzJobMapper extends BaseMapper<QuartzJob> {
+
+
+}

+ 18 - 0
src/main/java/com/sky/ioc/service/job/IQuartzJobService.java

@@ -0,0 +1,18 @@
+package com.sky.ioc.service.job;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.sky.ioc.entity.QuartzJob;
+import org.quartz.SchedulerException;
+
+public interface IQuartzJobService extends IService<QuartzJob> {
+
+    boolean saveAndScheduleJob(QuartzJob quartzJob);
+
+    boolean editAndScheduleJob(QuartzJob quartzJob) throws SchedulerException;
+
+    boolean deleteAndStopJob(QuartzJob quartzJob);
+
+    boolean resumeJob(QuartzJob quartzJob);
+
+    void test(String param);
+}

+ 133 - 0
src/main/java/com/sky/ioc/service/job/impl/QuartzJobServiceImpl.java

@@ -0,0 +1,133 @@
+package com.sky.ioc.service.job.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.sky.ioc.constant.Constant;
+import com.sky.ioc.entity.QuartzJob;
+import com.sky.ioc.mapper.job.QuartzJobMapper;
+import com.sky.ioc.service.job.IQuartzJobService;
+import lombok.extern.slf4j.Slf4j;
+import org.quartz.*;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Slf4j
+@Service
+public class QuartzJobServiceImpl extends ServiceImpl<QuartzJobMapper, QuartzJob> implements IQuartzJobService {
+
+    @Autowired
+    private QuartzJobMapper quartzJobMapper;
+
+    @Autowired
+    private Scheduler scheduler;
+
+
+    /**
+     * 保存&启动定时任务
+     */
+    @Override
+    public boolean saveAndScheduleJob(QuartzJob quartzJob) {
+        if (Constant.STATUS_NORMAL.equals(quartzJob.getStatus())) {
+            // 定时器添加
+            this.schedulerAdd(quartzJob.getJobClassName().trim(), quartzJob.getCronExpression().trim(), quartzJob.getParameter());
+        }
+        // DB设置修改
+        return this.save(quartzJob);
+    }
+
+    /**
+     * 恢复定时任务
+     */
+    @Override
+    public boolean resumeJob(QuartzJob quartzJob) {
+        schedulerDelete(quartzJob.getJobClassName().trim());
+        schedulerAdd(quartzJob.getJobClassName().trim(), quartzJob.getCronExpression().trim(), quartzJob.getParameter());
+        quartzJob.setStatus(Constant.STATUS_NORMAL);
+        return this.updateById(quartzJob);
+    }
+
+    @Override
+    public void test(String param) {
+        System.out.println("param====>"+param);
+    }
+
+    /**
+     * 编辑&启停定时任务
+     * @throws SchedulerException
+     */
+    @Override
+    public boolean editAndScheduleJob(QuartzJob quartzJob) throws SchedulerException {
+        if (Constant.STATUS_NORMAL.equals(quartzJob.getStatus())) {
+            schedulerDelete(quartzJob.getJobClassName().trim());
+            schedulerAdd(quartzJob.getJobClassName().trim(), quartzJob.getCronExpression().trim(), quartzJob.getParameter());
+        }else{
+            scheduler.pauseJob(JobKey.jobKey(quartzJob.getJobClassName().trim()));
+        }
+        return this.updateById(quartzJob);
+    }
+
+    /**
+     * 删除&停止删除定时任务
+     */
+    @Override
+    public boolean deleteAndStopJob(QuartzJob job) {
+        schedulerDelete(job.getJobClassName().trim());
+        return this.removeById(job.getId());
+    }
+
+    /**
+     * 添加定时任务
+     *
+     * @param jobClassName
+     * @param cronExpression
+     * @param parameter
+     */
+    private void schedulerAdd(String jobClassName, String cronExpression, String parameter) {
+        try {
+            // 启动调度器
+            scheduler.start();
+            // 构建job信息
+            JobDetail jobDetail = JobBuilder.newJob(getClass(jobClassName).getClass()).withIdentity(jobClassName).usingJobData("parameter", parameter).build();
+            // 表达式调度构建器(即任务执行的时间)
+            CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);
+
+            // 按新的cronExpression表达式构建一个新的trigger
+            CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(jobClassName).withSchedule(scheduleBuilder).build();
+
+            scheduler.scheduleJob(jobDetail, trigger);
+        } catch (SchedulerException e) {
+           // throw new MyException("创建定时任务失败", e);
+        } catch (RuntimeException e) {
+           // throw new MyException(e.getMessage(), e);
+        }catch (Exception e) {
+           // throw new MyException("后台找不到该类名:" + jobClassName, e);
+        }
+    }
+
+    /**
+     * 删除定时任务
+     *
+     * @param jobClassName
+     */
+    private void schedulerDelete(String jobClassName) {
+        try {
+            /*使用给定的键暂停Trigger 。*/
+            scheduler.pauseTrigger(TriggerKey.triggerKey(jobClassName));
+            /*从调度程序中删除指示的Trigger */
+            scheduler.unscheduleJob(TriggerKey.triggerKey(jobClassName));
+            /*从 Scheduler 中删除已识别的Job - 以及任何关联的Trigger */
+            scheduler.deleteJob(JobKey.jobKey(jobClassName));
+        } catch (Exception e) {
+            log.error(e.getMessage(), e);
+          //  throw new MyException("删除定时任务失败");
+        }
+    }
+
+    private static Job getClass(String classname) throws Exception {
+        Class<?> class1 = Class.forName(classname);
+        return (Job) class1.newInstance();
+    }
+
+
+
+
+}

+ 10 - 0
src/main/resources/application-dev.yml

@@ -6,6 +6,16 @@ server:
 
 # 数据源
 spring:
+  ## quartz定时任务,采用数据库方式
+  quartz:
+    #相关属性配置
+    properties:
+      org:
+        quartz:
+          jobStore:
+            driverDelegateClass: org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
+    #数据库方式
+    job-store-type: jdbc
   datasource:
     druid:
       url: jdbc:postgresql://121.43.55.7:5433/building?stringtype=unspecified&u003fuseUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&serverTimezone=PRC&useSSL=false&tinyInt1isBit=false