定时任务调度框架Quartz

一、简介

1.1 什么是Quartz

Quartz,定时任务框架,是由java编写的开源作业调度框架。

        不要让作业调度这个术语吓着你。尽管Quartz框架整合了许多额外功能, 但就其简易形式看,你会发现它易用得简直让人受不了!简单地创建一个实现org.quartz.Job接口的java类。Job接口包含唯一的方法:

        public void execute(JobExecutionContext context) throws JobExecutionException;

        在你的Job接口实现类里面,添加一些逻辑到execute()方法。一旦你配置好Job实现类并设定好调度时间表,Quartz将密切注意剩余时间。当调度程序确定该是通知你的作业的时候,Quartz框架将调用你Job实现类(作业类)上的execute()方法并允许做它该做的事情。无需报告任何东西给调度器或调用任何特定的东西。仅仅执行任务和结束任务即可。如果配置你的作业在随后再次被调用,Quartz框架将在恰当的时间再次调用它。

通俗来讲:就是我们需要服务器定时地调度执行某个业务或方法,但又不能每次都人工地调度此业务,这时候 Quartz框架 就可以为我们定时地自动去调度,我们只需配置好任务的详情、及配置(调度任务的事件等)即可。

Quartz官方文档:Quartz Enterprise Job Scheduler (quartz-scheduler.org)

Quartz学习文档:Quartz官方文档_w3cschool

1.2 Quartz的三大核心组件

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

Job(任务):是一个接口,有一个方法 void execute(JobExecutionContext context)  ,可以通过实现该接口来定义需要执行的任务(具体的逻辑代码)。

JobDetail:Quartz每次执行Job时,都重新创建一个Job实例,会接收一个Job实现类,以便运行的时候通过newInstance()的反射调用机制去实例化Job。JobDetail是用来描述Job实现类以及相关静态信息,比如任务在scheduler中的组名等信息。

Trigger(触发器):描述触发Job执行的时间触发规则实现类SimpleTrigger和CronTrigger可以通过crom表达式定义出各种复杂的调度方案。

Calendar:是一些日历特定时间的集合。一个Trigger可以和多个 calendar关联,比如每周一早上10:00执行任务,法定假日不执行,则可以通过calendar进行定点排除。

Scheduler(调度器):代表一个调度容器,一个调度容器中可以注册多个 JobDetail 和 Trigger。Scheduler可以将Trigger绑定到某一JobDetail上,这样当Trigger被触发时,对应的Job就会执行。一个Job可以对应多个Trigger,但一个Trigger只能对应一个Job。


二、Spring整合Quartz

【2.1 在pom.xml文件中添加Quartz依赖】

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-quartz -->
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

【2.2 实现定时业务逻辑】

创建一个业务类,继承 job 接口,并实现 execute() 方法,方法中即可实现相应业务逻辑

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

public class AlphaJob implements Job {

    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        
        // 业务逻辑代码略

    }
}

【2.3 配置定时任务】

定义一个配置类,将Trigger绑定到某一JobDetail上,并配置JobDetail和Trigger

import com.nowcoder.community.community.quartz.AlphaJob;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.JobDetailFactoryBean;
import org.springframework.scheduling.quartz.SimpleTriggerFactoryBean;

// 配置 --> 数据库 --> 调用
@Configuration
public class QuartzConfig {

    /**
     * FactoryBean可简化Bean的实例化过程:
     *      1. Spring通过FactoryBean封装了Bean的实例化过程.
     *      2. 它会将FactoryBean装配到Spring容器里.
     *      3. 然后将FactoryBean注入给其他的Bean.
     *      4. 该Bean得到的是FactoryBean所管理的对象实例
     */

    // 配置JobDetail
    @Bean
    public JobDetailFactoryBean alphaJobDetail() {
        JobDetailFactoryBean factoryBean = new JobDetailFactoryBean();
        factoryBean.setJobClass(AlphaJob.class);
        factoryBean.setName("alphaJob");
        factoryBean.setGroup("alphaJobGroup");
        factoryBean.setDurability(true);// 设置任务长久保存
        factoryBean.setRequestsRecovery(true);// 设置任务可恢复
        return factoryBean;
    }

    // 配置Trigger(SimpleTriggerFactoryBean, CronTriggerFactoryBean)
    @Bean
    public SimpleTriggerFactoryBean alphaTrigger(JobDetail alphaJobDetail) {
        SimpleTriggerFactoryBean factoryBean = new SimpleTriggerFactoryBean();
        factoryBean.setJobDetail(alphaJobDetail);// 设置任务的JobDetail
        factoryBean.setName("alphaTrigger");
        factoryBean.setGroup("alphaTriggerGroup");
        factoryBean.setRepeatInterval(3000);// 设置任务的执行频率(每三秒执行一次)
        factoryBean.setJobDataMap(new JobDataMap());// 设置存储Job的状态
        return factoryBean;
    }

}

注: 此配置类只有第一次调用时被读取到, 其封装的信息会被初始到数据库中, 以后每次quartz访问数据库调度任务, 而不再访问此配置文件。(前提是我们要配置Quartz和数据库相关配置,原因是Quartz原先默认将数据存到内存中而不是数据库,但要想实现分布式服务器就需要把共享数据存到数据库中)

在application.properties文件中进行存入数据库等配置:

# QuartzProperties
# 任务存储的方式
spring.quartz.job-store-type=jdbc
# 自定义调度器的名字
spring.quartz.scheduler-name=communityScheduler
# 调度器的id为自动生成
spring.quartz.properties.org.quartz.scheduler.instanceId=AUTO
# 通过JobStoreTX类将任务存到数据库
spring.quartz.properties.org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
# jdbc的驱动
spring.quartz.properties.org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
# 采用集群的方式
spring.quartz.properties.org.quartz.jobStore.isClustered=true
# Quratz底层的线程池
spring.quartz.properties.org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
# 线程数量
spring.quartz.properties.org.quartz.threadPool.threadCount=5

百度网盘数据库表sql语句提取地址:

链接:https://pan.baidu.com/s/1KqB5N4UQo3YgjomO050EIg?pwd=j8cm 
提取码:j8cm

【2.4 定义删除定时任务的测试类(选)】

当我们想要删除定时任务时,可以通过测试类的方式删除其数据信息

import org.junit.Test;
import org.junit.runner.RunWith;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringRunner;

@RunWith(SpringRunner.class)
@SpringBootTest
@ContextConfiguration(classes = CommunityApplication.class)
public class QuartzTests {

    @Autowired
    private Scheduler scheduler;

    @Test
    public void testDeleteJob() {
        try {
            boolean result = scheduler.deleteJob(new JobKey("alphaJob", "alphaJobGroup"));// 任务的名称和集群名称
            System.out.println(result);
        } catch (SchedulerException e) {
            e.printStackTrace();
        }
    }

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

李巴巴

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

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

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

打赏作者

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

抵扣说明:

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

余额充值