一、前言
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); //恢复组中的所有任务
}
}
就是这么简单、恭喜你,完结撒花。
五、后继
生活明朗,万物可爱,人间值得,未来可期。