记录spring boot集成quartz实现定时任务

1、添加maven依赖

代码如下:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
        </dependency>

2、实现job接口,并在execute方法中实现业务逻辑

代码如下:

public class PrintWordsJob implements Job {

    private static final Logger logger = LoggerFactory.getLogger(PrintWordsJob.class);

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        String printTime = new SimpleDateFormat("yy-MM-dd HH:mm:ss").format(new Date());
//        这里处理简单,只做打印时间,getMergedJobDataMap()方法是获取 JobDetail 中传递的的 usingJobData
        logger.info("PrintWordsJob start at: {}, map: {}", printTime, jobExecutionContext.getMergedJobDataMap().get("name"));
    }
}

3、实现一个简单的定时任务

代码如下:

    public void test() throws SchedulerException {
//		 定义作业的实例
        JobDetail jobDetail = JobBuilder.newJob(PrintWordsJob.class)
                // 任务标识,及任务分组
                .withIdentity("job", "group")
                // 链接调用,增加需要的参数
                .usingJobData("name","guaniu")
                .build();

//		触发器
        SimpleTrigger simpleTrigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger", "group")
                // 立即执行
                .startNow()
                // 10s后停止
                .endAt(new Date(System.currentTimeMillis()+10*1000))
                .withSchedule(
                        SimpleScheduleBuilder.simpleSchedule()
                                // 每秒执行一次
                                .withIntervalInSeconds(1)
                                // 一直执行
                                .repeatForever()
                ).build();
        scheduler.scheduleJob(jobDetail, simpleTrigger);
    }

简单封装的工具类

代码如下:

@Component
public class QuartzUtils {

    private static final Logger logger = LoggerFactory.getLogger(QuartzUtils.class);

    @Autowired
    private Scheduler scheduler;
    
    /**
     * @param quartzDataDomain
     * {
     *     "jobName": "guaniu",
     *     "jobGroup": "test",
     *     "cron": "0/2 * * * * ?",
     *     "triggerName": "manual",
     *     "triggerGroup": "manualGroup",
     *     "usingJobDataMap": {
     *         "name": "guaniu"
     *     },
     *     "category": "create"
     * }
     * jobName、jobGroup要在前端传值试效验,保证唯一不重复,
     * 否则会报错:Unable to store Job : 'test1.guaniu1', because one already exists with this identification.
     */
    public void operationQuartzJob(QuartzDataDomain quartzDataDomain) throws SchedulerException {
        String category = quartzDataDomain.getCategory();
        if (category.equals("create")){
            createJob(quartzDataDomain);
        }else if (category.equals("modify")){
            modifyJob(quartzDataDomain);
        }else if (category.equals("pause")){
            pauseJob(quartzDataDomain);
        }else if (category.equals("resume")){
            resumeJob(quartzDataDomain);
        }else if (category.equals("deleteJob")){
            deleteJob(quartzDataDomain);
        }
    }

    public void operationQuartzJob(QuartzDataDomain quartzDataDomain) throws SchedulerException {
        String category = quartzDataDomain.getCategory();
        if (category.equals("create")){
            createJob(quartzDataDomain);
        }else if (category.equals("modify")){
            modifyJob(quartzDataDomain);
        }else if (category.equals("pause")){
            pauseJob(quartzDataDomain);
        }else if (category.equals("resume")){
            resumeJob(quartzDataDomain);
        }else if (category.equals("deleteJob")){
            deleteJob(quartzDataDomain);
        }
    }

//    创建并有运行job
    private void createJob(QuartzDataDomain quartzDataDomain) throws SchedulerException {
//        如果这个任务存在就删除
        deleteJob(quartzDataDomain);

        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(quartzDataDomain.getCron());

        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity(quartzDataDomain.getTriggerName(), quartzDataDomain.getTriggerGroup())
                .withSchedule(cronScheduleBuilder)
                .build();

        scheduler.scheduleJob(initJobDetail(quartzDataDomain), trigger);
    }

//    修改job的cron
    private void modifyJob(QuartzDataDomain quartzDataDomain) throws SchedulerException {
        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(quartzDataDomain.getCron());
        TriggerKey triggerKey = TriggerKey.triggerKey(quartzDataDomain.getTriggerName(), quartzDataDomain.getTriggerGroup());
        CronTrigger cronTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);
        String oldTime = cronTrigger.getCronExpression();
        if (!oldTime.equalsIgnoreCase(quartzDataDomain.getCron())){
            Trigger trigger = TriggerBuilder.newTrigger()
                    .withIdentity(quartzDataDomain.getTriggerName(), quartzDataDomain.getTriggerGroup())
                    .withSchedule(cronScheduleBuilder)
                    .build();

            scheduler.rescheduleJob(triggerKey, trigger);
        }
    }

//    暂停job
    private void pauseJob(QuartzDataDomain quartzDataDomain) throws SchedulerException {
        JobKey jobKey = initJobKey(quartzDataDomain);
        JobDetail jobDetail = scheduler.getJobDetail(jobKey);

        if(jobDetail != null){
            scheduler.pauseJob(jobKey);
        }
    }

//    暂停所有的job
//    public void pauseAllJob() throws SchedulerException {
//        scheduler.pauseAll();
//    }


//    重新运行job
    private void resumeJob(QuartzDataDomain quartzDataDomain) throws SchedulerException {
        JobKey jobKey = initJobKey(quartzDataDomain);
        JobDetail jobDetail = scheduler.getJobDetail(jobKey);
        if(jobDetail != null){
            scheduler.resumeJob(jobKey);
        }
    }

//    重新运行所有的job
//    public void resumeAllJob() throws SchedulerException {
//        scheduler.resumeAll();
//    }

//    删除job
    private void deleteJob(QuartzDataDomain quartzDataDomain) throws SchedulerException {
        TriggerKey triggerKey = TriggerKey.triggerKey(quartzDataDomain.getTriggerName(), quartzDataDomain.getTriggerGroup());
        JobKey jobKey = initJobKey(quartzDataDomain);
        Trigger trigger =  scheduler.getTrigger(triggerKey);

        if(trigger != null){
            // 停止触发器
            scheduler.pauseTrigger(triggerKey);
            // 移除触发器
            scheduler.unscheduleJob(triggerKey);
            // 删除任务
            scheduler.deleteJob(jobKey);
        }
    }

    public String checkTriggerStatus(QuartzDataDomain quartzDataDomain) throws SchedulerException {
        String result;
        Trigger.TriggerState triggerState = scheduler.getTriggerState(TriggerKey.triggerKey(quartzDataDomain.getTriggerName(), quartzDataDomain.getTriggerGroup()));
        switch (triggerState){
            case NONE:
                result = "不存在";
                logger.info("status: {}, quartzDataDomain: {}", "不存在", quartzDataDomain);
                return result;
            case ERROR:
                result = "错误";
                logger.info("status: {}, quartzDataDomain: {}", "错误", quartzDataDomain);
                return result;
            case NORMAL:
                result = "正常";
                logger.info("status: {}, quartzDataDomain: {}", "正常", quartzDataDomain);
                return result;
            case PAUSED:
                result = "暂停";
                logger.info("status: {}, quartzDataDomain: {}", "暂停", quartzDataDomain);
                return result;
            case BLOCKED:
                result = "阻塞";
                logger.info("status: {}, quartzDataDomain: {}", "阻塞", quartzDataDomain);
                return result;
            case COMPLETE:
                result = "完成";
                logger.info("status: {}, quartzDataDomain: {}", "完成", quartzDataDomain);
                return result;
            default:
                result = "未知现象";
                logger.info("status: {}, quartzDataDomain: {}", triggerState, quartzDataDomain);
        }
        return result;
    }

    private static JobKey initJobKey(QuartzDataDomain quartzDataDomain){
        return new JobKey(quartzDataDomain.getJobName(), quartzDataDomain.getJobGroup());
    }
    
    private static JobDetail initJobDetail(QuartzDataDomain quartzDataDomain){
        JobDataMap jobDataMap = new JobDataMap();
        Map<String, Object> map = quartzDataDomain.getUsingJobDataMap();
        if (map != null && !map.isEmpty()){
            for (Map.Entry<String, Object> m: map.entrySet()) {
                jobDataMap.put(m.getKey(), m.getValue());
            }
            return JobBuilder.newJob(PrintWordsJob.class)
                    .withIdentity(initJobKey(quartzDataDomain))
                    .usingJobData(jobDataMap)
                    .build();
        }else {
            return JobBuilder.newJob(PrintWordsJob.class)
                    .withIdentity(initJobKey(quartzDataDomain))
                    .build();
        }
    }
}
public class QuartzDataDomain {
    private String jobName;
    private String jobGroup;
    private String cron;
    private String triggerName;
    private String triggerGroup;
    private Map<String, Object> usingJobDataMap;
    private String category;

    public String getJobName() {
        return jobName;
    }

    public void setJobName(String jobName) {
        this.jobName = jobName;
    }

    public String getJobGroup() {
        return jobGroup;
    }

    public void setJobGroup(String jobGroup) {
        this.jobGroup = jobGroup;
    }

    public String getCron() {
        return cron;
    }

    public void setCron(String cron) {
        this.cron = cron;
    }

    public String getTriggerName() {
        return triggerName;
    }

    public void setTriggerName(String triggerName) {
        this.triggerName = triggerName;
    }

    public String getTriggerGroup() {
        return triggerGroup;
    }

    public void setTriggerGroup(String triggerGroup) {
        this.triggerGroup = triggerGroup;
    }

    public Map<String, Object> getUsingJobDataMap() {
        return usingJobDataMap;
    }

    public void setUsingJobDataMap(Map<String, Object> usingJobDataMap) {
        this.usingJobDataMap = usingJobDataMap;
    }

    public String getCategory() {
        return category;
    }

    public void setCategory(String category) {
        this.category = category;
    }

    @Override
    public String toString() {
        return "QuartzDataDomain{" +
                "jobName='" + jobName + '\'' +
                ", jobGroup='" + jobGroup + '\'' +
                ", cron='" + cron + '\'' +
                ", triggerName='" + triggerName + '\'' +
                ", triggerGroup='" + triggerGroup + '\'' +
                ", usingJobDataMap=" + usingJobDataMap +
                ", category='" + category + '\'' +
                '}';
    }
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值