Springboot整合quartz

介绍

平时在工作中经常会用到定时任务,如自动实现计费,扫描订单,清理日志,数据定时抽取等等。本篇将介绍springboot整合quartz实现定时任务以及springboot自带的定时任务。

springboot的定时任务
启动类
/**
 * 启动类
 */
@SpringBootApplication
//@EnableScheduling

public class SpringbootQuartzApplication {
    public static void main( String[] args )
    {
        SpringApplication.run(SpringbootQuartzApplication.class,args);
    }
}

定时任务类

@EnableScheduling 开启注解,以及@Scheduled 配置定时任务执行的时间即可。

import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;

import java.text.SimpleDateFormat;
import java.util.Date;
@Configuration
@EnableScheduling
public class SimpleSchedule {
    //每五秒执行一次
    @Scheduled(cron="*/5 * * * * ?")
    public void schedule(){
        System.out.println("执行定时任务..."+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
    }
}

执行定时任务

quartz定时任务
依赖
  <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-quartz</artifactId>
    </dependency>
    <dependency>
实体类

创表语句:

-- quartz.sys_job definition

CREATE TABLE `sys_job` (
  `job_id` int NOT NULL AUTO_INCREMENT,
  `job_class` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '任务类名',
  `job_cron` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT 'cron表达式',
  `job_params` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '参数',
  `job_desc` varchar(255) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '描述',
  `job_status` int DEFAULT NULL COMMENT '状态 1正常 0停止',
  `create_by` varchar(32) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '创建人',
  `create_time` datetime DEFAULT NULL COMMENT '创建时间',
  `del_flag` int DEFAULT NULL COMMENT '删除状态',
  `update_by` varchar(32) CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci DEFAULT NULL COMMENT '修改人',
  `update_time` datetime DEFAULT NULL COMMENT '修改时间',
  PRIMARY KEY (`job_id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

实体类

@Data
@TableName("`sys_job`")
public class SysJob implements Serializable {
    @TableId(value = "job_id",type = IdType.AUTO )
    private Integer jobId;
    //任务类
    @TableField(value = "job_class")
    private String jobClass;
    //定时任务表达式
    @TableField(value = "job_cron")
    private String jobCron;
    //任务参数
    @TableField(value = "job_params")
    private String jobParams;
    //任务描述
    @TableField(value = "job_desc")
    private String jobDesc;
    //任务状态 1 正常 0 停止
    private String jobStatus;
    //是否逻辑删除
    @TableLogic
    @TableField(value = "del_flag")
    private String delFlag;
    //创建人
    @TableField(value = "create_by")
    private String createBy;
    //创建时间
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(value = "create_time",fill = FieldFill.INSERT)
    private String createTime;
    //更新人
    @TableField(value = "update_by")
    private String updateBy;
    //更新时间
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @TableField(value = "update_time",fill = FieldFill.INSERT_UPDATE)
    private String updateTime;
}

对于任务进行CRUD操作
mapper映射
/**
 * 系统任务映射类
 */
@Mapper
public interface SysJobMapper extends BaseMapper<SysJob> {

}
服务类
/**
 * <p>
 * 系统任务服务类 实现任务的增删改查
 * </p>
 */
public interface ISysJobService extends IService<SysJob> {

    //添加任务
    void saveSysJob(SysJob job);

    //更新任务
    void updateSysJob(SysJob job);

    //删除任务
    void delSysJob(SysJob job);

    //启动任务
    void restartSysJob(SysJob job);

    //停止任务
    void stopSysJob(SysJob job);
}
服务实现类
/**
 * <p>
 * 任务表 服务实现类
 * </p>
 */
@Service
public class SysJobServiceImpl extends ServiceImpl<SysJobMapper, SysJob> implements ISysJobService {

    @Autowired
    BaseMapper baseMapper;

    @Autowired
    private Scheduler scheduler;


    //添加任务
    @Override
    public void saveSysJob(SysJob job){
        //根据状态是否加入定时任务
        if("1".equals(job.getJobStatus())){
            // 定时器添加
            this.addSysJob(job.getJobClass().trim(), job.getJobCron().trim(), job.getJobParams());
        }
        //保存数据库
        baseMapper.insert(job);
    }

    //更新任务
    @Override
    public void updateSysJob(SysJob job){
        //根据状态是否加入定时任务
        if("1".equals(job.getJobStatus())){
            // 定时器添加
            this.addSysJob(job.getJobClass().trim(), job.getJobCron().trim(), job.getJobParams());
        }else{
            //停止定时任务
            this.stopSysJob(job);
        }
        //保存数据库
        baseMapper.updateById(job);
    }

    //删除任务
    @Override
    public void delSysJob(SysJob job){
        this.stopSysJob(job);
        //数据库删除
        baseMapper.deleteById(job.getJobId());
    }

    //启动任务
    @Override
    public void restartSysJob(SysJob job){
         //先停止
         this.stopSysJob(job);
         //在添加任务
         this.addSysJob(job.getJobClass(),job.getJobCron(),job.getJobParams());
    }

    //停止任务
    @Override
    public void stopSysJob(SysJob job){
        try {
            String jobClassName = job.getJobClass();
            //删除触发器
            scheduler.pauseTrigger(TriggerKey.triggerKey(jobClassName));
            scheduler.unscheduleJob(TriggerKey.triggerKey(jobClassName));
            scheduler.deleteJob(JobKey.jobKey(jobClassName));
        } catch (Exception e) {
            e.printStackTrace();
        }
        //更新任务状态
        this.updateSysJob(job);
    }
    /**
     * 添加定时任务
     * */
    private void addSysJob(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(Exception e) {
            e.printStackTrace();
      }
    }

    private static Job getClass(String classname) throws Exception {
        Class<?> class1 = Class.forName(classname);
        return (Job) class1.newInstance();
    }


}
简单的任务

public class SysJob1 implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("执行定时任务SysJob1..."+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
    }
}
public class SysJob2 implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("执行定时任务SysJob2..."+ new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));

    }
}
controller
@RestController
public class SysJobController {

    @Autowired
    ISysJobService sysJobService;
    //添加任务
    @GetMapping("/saveSysJob")
    void saveSysJob(){
        SysJob sysJob = new SysJob();
        sysJob.setJobClass("com.elite.springboot.task.SysJob2");
        sysJob.setJobCron("*/2 * * * * ?");
        sysJob.setJobParams("");
        sysJob.setJobDesc("2秒中一次定时执行任务sysjob2");
        sysJob.setJobStatus("1"); //正常
        sysJobService.saveSysJob(sysJob);
    }

    //更新任务
    @GetMapping("/updateSysJob")
    void updateSysJob(){
        SysJob sysJob = new SysJob();
        sysJob.setJobId(1);
        sysJob.setJobClass("com.elite.springboot.task.SysJob1");
        sysJob.setJobCron("*/3 * * * * ?");
        sysJob.setJobParams("");
        sysJob.setJobDesc("2秒中一次定时执行任务sysjob1");
        sysJob.setJobStatus("1"); //正常
        sysJobService.updateSysJob(sysJob);
    }

}

执行结果

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小刘同学要加油呀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值