一文学会Quartz定时任务调度框架~

一、前言

1.1、Quartz简介

什么是Quartz?
 
简单来说,它就是一个用来实现定时任务的框架,可以利用它,使得代码逻辑按照指定的时间进行执行。

二、Quartz使用

2.1、导入依赖

新建一个普通的maven项目,导入quartz的依赖

<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>2.2.3</version>
</dependency>

2.2、 定义Job

//就是我们想定时执行的逻辑
public class HelloQuartzJob implements Job {
    
    
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
    
    
        System.out.println("hello quartz~"+new Date());
    }
}

2.3、测试Quartz的API

// quartz API的使用
public class HelloQuartz {
    
    
    public static void main(String[] args) throws SchedulerException {
    
    
        // 1、调度器
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

        //2、触发器
        SimpleTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "tgroup1")
                .startNow() //现在开始
                .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).withRepeatCount(10))//设定触发规则 这里是每隔2s执行一次,一共执行10次
                .endAt(new GregorianCalendar(2022, 11, 10, 17, 30, 30).getTime())
                .build();//结束时间

        //3、JobDetail (虽然我们编写了一个Job 但是我们得对Job进行进一步的封装,这样才能使用Quartz进行调用)
        JobDetail jobDetail = JobBuilder.newJob(HelloQuartzJob.class).withIdentity("job1", "jgroup1").build();

        //4、将JobDetail和触发器 添加到调度器中
        scheduler.scheduleJob(jobDetail,trigger);

        //注意:在Quartz中,scheduler调度器是核心组件 一切的任务以及 它对应触发器 都得注册进调度器中 否则这个调度器就白写了

        //启动、调度器开始工作 ,当调度器开始工作,它就会去检查调度器中的任务和他对应的触发器是否满足触发条件 如果满足 则执行job
        scheduler.start();
    }
}

在这里插入图片描述
完美运行。

2.4、Quartz的配置

我们可以在resources目录下创建quartz.properties配置文件,用它来对Quartz做一些自定义的配置。

# 指定调度器的名称
org.quartz.scheduler.instanceName = DefaultQuartzScheduler
# 指定线程池实现类(因为开启调度会从新开启一个新的线程)
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
# 线程池线程数量
org.quartz.threadPool.threadCount = 10
# 优先级,默认是5
org.quartz.threadPool.threadPriority = 5
# 非持久化job
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore

在这里插入图片描述

2.5、核心组件的说明

Scheduler:调度器。所有的任务调度都是由它来控制
 
Job:任务,自定义我们想要的业务逻辑 
 
JobDetail:基于Job进一步封装。并未Job指定更加详细的属性
 
Trigger:触发器。指定给某个任务,有它来指定任务的触发条件

三、Trigger触发器

3.1、CronTrigger触发器

可更加灵活的运用于各种业务场景,指定Cron表达式即可

实例:

CronTrigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger1", "tgroup1")
                .withSchedule(CronScheduleBuilder.cronSchedule("0/20 * * * * * ?"))//设定cron表达式即可 这里相当于是每20秒执行一次
                .build();

任务测试:

public class HelloQuartz {
    
    
    public static void main(String[] args) throws SchedulerException {
    
    
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

        CronTrigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("trigger1", "tgroup1")
                .withSchedule(CronScheduleBuilder.cronSchedule("0/20 * * * * ?"))//设定cron表达式即可 这里相当于是每20秒执行一次
                .build();
        JobDetail jobDetail = JobBuilder.newJob(HelloQuartzJob.class).withIdentity("job1", "jgroup1").build();
        scheduler.scheduleJob(jobDetail,trigger);
        scheduler.start();
    }
}

在这里插入图片描述
完美运行。

四、Spring整合Quartz

4.1、依赖

 <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>5.1.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>5.1.6.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.quartz-scheduler</groupId>
            <artifactId>quartz</artifactId>
            <version>2.2.3</version>
        </dependency>
    </dependencies>

4.2、创建一个Job

public class MyJob implements Job {
    
    
    @Override
    public void execute(JobExecutionContext context) throws JobExecutionException {
    
    
        System.out.println("hello spring and quartz"+new Date());
    }
}

4.3、配置applicationContext.xml

调度器: ScheduleFactoryBean
 
触发器:CronTriggerFactoryBean
 
JobDetail:JobDetailFactoryBean

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
               http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!--1、 定义一个任务bean,这里使用 通过工厂创建一个JobDetail   -->
    <bean id="1xjob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
        <property name="name" value="job1"/>
        <property name="group" value="jgroup1"/>
        <property name="jobClass" value="com.springquartzdemo.MyJob"/>
    </bean>

    <!--2、定义触发器的bean -->
    <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
        <!-- 指定触发器的名称  -->
        <property name="name" value="trigger1"/>
        <!-- 指定触发器的组  -->
        <property name="group" value="tgroup1"/>
        <!--指定trigger 绑定的JobDetail-->
        <property name="jobDetail" ref="1xjob"/>
        <!--cron表达式-->
        <property name="cronExpression" value="0/10 * * * * ?"/>
    </bean>


    <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="cronTrigger"></ref>
            </list>
        </property>
        <!--添加Quartz配置-->
        <property name="configLocation" value="classpath:quartz.properties" />

    </bean>


</beans>

4.4、操作

4.4.1、启动任务

加载spring配置文件,调度任务启动

public class QuartzTest {
    
    
    public static void main(String[] args) {
    
    
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
    }
}

测试
在这里插入图片描述

4.4.2、任务操作

一、删除

public class QuartzTest {
    
    
    public static void main(String[] args) throws InterruptedException, SchedulerException {
    
    
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        System.out.println("========");
        StdScheduler scheduler = (StdScheduler)context.getBean("scheduler");
        Thread.sleep(30); //30秒后删除任务
        //删除任务
        scheduler.deleteJob(JobKey.jobKey("job1","jgroup1"));
    }
}

二、暂停和恢复

public class QuartzTest {
    
    
    public static void main(String[] args) throws InterruptedException, SchedulerException {
    
    
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        System.out.println("========");
        StdScheduler scheduler = (StdScheduler)context.getBean("scheduler");
        Thread.sleep(3000);
        //暂停任务
        scheduler.pauseJob(JobKey.jobKey("job1","jgroup1"));
        Thread.sleep(3000);
        //恢复任务
        scheduler.resumeJob(JobKey.jobKey("job1","jgroup1"));
    }
}

三、批量操作

public class QuartzTest {
    
    
    public static void main(String[] args) throws InterruptedException, SchedulerException {
    
    
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        System.out.println("========");
        StdScheduler scheduler = (StdScheduler)context.getBean("scheduler");
        Thread.sleep(3000);
        GroupMatcher<JobKey> groupMatcher = GroupMatcher.groupEquals("jgroup1");
        scheduler.pauseJobs(groupMatcher); //暂停组中的所有任务
        Thread.sleep(3000);
        scheduler.resumeJobs(groupMatcher); //恢复组中的所有任务
    }
}

就是这么简单、恭喜你,完结撒花。

五、后继

生活明朗,万物可爱,人间值得,未来可期。

猜你喜欢

转载自blog.csdn.net/weixin_45647685/article/details/127378038
今日推荐