定时任务:SpringBoot+Quartz


Quartz说明

定时任务主要使用它的三大组件。

  • 调度器:Scheduler。
  • 任务:JobDetail。
  • 触发器:Trigger,包括 SimpleTrigger 和 CronTrigger。

使用流程:

  1. 创建任务:具体的业务逻辑,需要实现Job接口,将业务逻辑代码存放在void execute(JobExecutionContext context) 方法中。
  2. 定时执行任务:将任务创建好后,定时执行它,需要用到Quartz的三大组件:
  • JobDetail用来绑定Job,并设置任务的相关属性
  • Trigger指定Job的执行时间,执行间隔,运行次数等
  • Schedule来负责调度结合JobDetail和Trigger

实战演练

在这里插入图片描述

  1. pom.xml 导入相关依赖【springboot和Quartz】
    <dependencies>

        <!--springboot相关依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.5.1</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>2.5.1</version>
        </dependency>

        <!--quartz-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-quartz</artifactId>
            <version>2.5.1</version>
        </dependency>
    </dependencies>
  1. application.yml 【不需要配置】
  2. QuartzApplication启动类
@SpringBootApplication
public class QuartzApplication {
    public static void main(String[] args) {
        SpringApplication.run(QuartzApplication.class, args);
        System.out.println("QuartzApplication启动成功");
    }
}
  1. 任务:DemoJob【需要定时开启的任务】
/**
 * <h3>DemoJob</h3>
 * <p>定时任务</p>
 *
 * @author : he zhe
 * @date : 2022-07-29 14:26
 **/
public class DemoJob implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        //获取JobDetail中传递的参数
        String url = (String) jobExecutionContext.getJobDetail().getJobDataMap().get("url");

        //获取当前时间
        Date date = new Date();
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        //打印信息
        System.out.println("当前时间:" + dateFormat.format(date)+"  用户:"+new Random().nextInt(100)+"  访问了"+url);
        System.out.println("----------------------------------------");
    }
}
  1. 工具类:JobUtils【开启和关闭定时任务方法封装】
/**
 * <h3>JobUtils</h3>
 * <p>任务调度工具类</p>
 *
 * @author : he zhe
 * @date : 2022-07-29 14:49
 **/
public class JobUtils {

    private static SchedulerFactory schedulerFactory;

    private static void setSchedulerFactory(){
        schedulerFactory = new StdSchedulerFactory();
    }


    public static void open(String className, String jobId){
        if (schedulerFactory == null) {
            setSchedulerFactory();
        }

        try {
            // 1、创建调度器Scheduler
            Scheduler scheduler = schedulerFactory.getScheduler();

            // 2、创建JobDetail实例,并与Job类绑定(Job执行内容)
            className = "com.study.job."+className;
            Class forName = Class.forName(className);
            JobDetail jobDetail = JobBuilder.newJob(forName)
                    .withIdentity(jobId)
                    .usingJobData("url","https://blog.csdn.net/qq_43466788")
                    .build();

            // 3、构建Trigger实例,每隔1s执行一次
            Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "triggerGroup1")
                    .startNow()//立即生效
                    .withSchedule(SimpleScheduleBuilder.simpleSchedule()
                            .withIntervalInSeconds(1)//每隔1s执行一次
                            .repeatForever()).build();//一直执行

            //4、执行
            scheduler.scheduleJob(jobDetail, trigger);
            System.out.println("--------scheduler start ! ------------");
            scheduler.start();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public static void close(String jobId) {
        try {
            // 任务全部使用同一个调度器
            Scheduler scheduler = null;

            // 获取调度器
            scheduler = schedulerFactory.getScheduler();

            JobKey jobKey = JobKey.jobKey(jobId);

            // 添加到调度器
            scheduler.deleteJob(jobKey);

            System.out.println("--------scheduler shutdown ! ------------");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
  1. 接口:DemoJobController【控制定时任务开启关闭】
@RestController
public class DemoJobController {

    @RequestMapping(value = "/open", method = RequestMethod.POST)
    public String test(String className) {
        //开启定时任务
        JobUtils.open(className,"1");
        return "定时任务启动成功";
    }

    @RequestMapping(value = "/close", method = RequestMethod.POST)
    public String test2(String jobId) {
        //开启定时任务
        JobUtils.close(jobId);
        return "定时任务关闭成功";
    }
}
  1. 启动服务
    访问:http://localhost:80/open?className=DemoJob
    在这里插入图片描述
    然后就可以在控制台看到:【不停的打印】
    在这里插入图片描述
    访问:POST http://localhost:80/close?jobId=1
    在这里插入图片描述
    控制台打印scheduler shutdown !后,停止了定时任务
    在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值