springboot集成任务调度框架Quartz

首先

搭建一个springboot项目

然后, pom文件加上依赖

        <!--quartz start-->
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.3.0</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
        </dependency>
        <!--quartz end-->

创建SchedulerConfig配置类,注入Scheduler

package com.springboot.service.job;

import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;

/**
 * @author Administrator
 */
@Configuration
@Component
public class SchedulerConfig {

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


    /**
     * 初始注入scheduler
     * @return
     * @throws SchedulerException
     */
    @Bean
    public Scheduler scheduler() throws SchedulerException{
        SchedulerFactory schedulerFactoryBean = new StdSchedulerFactory();
        return schedulerFactoryBean.getScheduler();
    }

}

创建业务逻辑Job, 要实现Job接口,该类为执行业务逻辑的地方

package com.springboot.service.job;


import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class TestQuartzJob implements Job {

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

    /**
     * 执行业务逻辑的地方
     * @param jobExecutionContext
     */
    @Override
    public void execute(JobExecutionContext jobExecutionContext){
        String jobName = (String) jobExecutionContext.getJobDetail().getJobDataMap().get("jobName");
        logger.info("当前执行的任务名称是: " + jobName);
        Thread current = Thread.currentThread();
        logger.info("QuartzJobDemo.execute 定时任务Quartz:"+current.getId()+ ",name:"+current.getName());
    }
}

创建定时任务启动类,用来启动以及关闭任务

package com.springboot.service.job;

import org.quartz.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class QuartzManager {
    private static final Logger logger = LoggerFactory.getLogger(QuartzManager.class);

    @Autowired
    private Scheduler scheduler;

    public void startJob() throws SchedulerException {
        startJobDemo(scheduler);
    }

    public void stopJob() {
        removeJob("job1", "group1");
    }

    private void startJobDemo(Scheduler scheduler) throws SchedulerException {
        // 通过JobBuilder构建JobDetail实例,JobDetail规定只能是实现Job接口的实例
        // JobDetail 是具体Job实例
        JobDetail jobDetail = JobBuilder.newJob(TestQuartzJob.class).withIdentity("job1", "group1").build();
        //传参数到TestQuartzJob中,供其使用
        jobDetail.getJobDataMap().put("jobName","job1");
        // 基于表达式构建触发器
        CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/5 * * * * ?");
        // CronTrigger表达式触发器 继承于Trigger
        // TriggerBuilder 用于构建触发器实例
        CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("job1", "group1")
                .withSchedule(cronScheduleBuilder).build();
        //开启定时任务
        scheduler.scheduleJob(jobDetail, cronTrigger);
        //启动定时器
        scheduler.start();
    }

    /**
     * 删除定时任务
     * @param jobName
     * @param groupName
     */
    public void removeJob(String jobName, String groupName) {
        TriggerKey triggerKey = TriggerKey.triggerKey(jobName, groupName);
        try {
            if (checkExists(jobName, groupName)) {
                logger.info("开始关闭任务job1");
                //暂停触发器
                scheduler.pauseTrigger(triggerKey);
                //关闭触发器
                scheduler.unscheduleJob(triggerKey);
                logger.info("关闭任务job1成功");
            }
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 判断任务是否存在
     * @param jobName
     * @param groupName
     * @return
     * @throws SchedulerException
     */
    public boolean checkExists(String jobName, String groupName) throws SchedulerException {
        TriggerKey triggerKey = TriggerKey.triggerKey(jobName, groupName);
        return scheduler.checkExists(triggerKey);
    }

}

创建Controller测试类, 测试定时调度任务

package com.springboot.controller;

import com.springboot.service.job.QuartzManager;
import org.quartz.SchedulerException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class JobController {
    @Autowired
    private QuartzManager quartzManager;

    @GetMapping("start/job1")
    public void startJob1() {
        try {
            quartzManager.startJob();
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }
    @GetMapping("stop/job1")
    public void stopJob1() {
        quartzManager.stopJob();
    }

}

利用Postman调接口测试

开启任务

在这里插入图片描述
在这里插入图片描述
定时任务五秒执行一次

关闭任务

在这里插入图片描述
在这里插入图片描述
关闭后, 任务不在执行

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值