Quartz简单使用
一、quartz简单介绍
1.1 quartz是什么?
是一个完全由Java编写的开源的作业调度框架
1.2 quartz的主要用途
它主要是指定在某个时间去执行相应的任务的
比如:你买东西是下了单,在指定的时间内没有支付订单,那么就会执行任务将你的订单取消
二、Quartz的使用
1.1 常用的API
1.Job接口
1.这是一个定时功能的接口,称之为任务(job),我们需要实现此接口
2.Job的实现类主要有:SendMailJob/SendMessage/其他自定义的Job实现类
2.Trigger触发器
1.有了任务之后,需要一个触发器触发任务去执行,触发器Trigger最基本的功能 是指定Job的执行时间,执行间隔,运行次数等
2.实现类:SimpleTrigger/其他自定义的Trigger实现类
3.Scheduler调度器
调度器主要负责指定Trigger去执行指定的job任务。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vk1FJ4hP-1596108674692)(upload\image-20200730185900848.png)]
上图是Quartz的基本组成部分,及其三者之间的关系
1.2 使用方法
1.2.1 添加依赖
<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
</dependency>
1.2.2 简单的代码实现
1.自定义一个任务
public class HelloQuartz implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("任务被执行了,===="+sdf.format(new Date()));
}
}
2.启动任务,设置每5秒执行一次
public static void main(String[] args) throws SchedulerException {
//创建自定义的任务(job)对象
JobDetail build = JobBuilder.newJob(HelloQuartz.class).build();
//创建触发器(trigger)对象,并且设置触发规则,多少时间执行一次job
SimpleTrigger trigger = TriggerBuilder.newTrigger().withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(5)).build();
//创建任务调度对象
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
//4.将任务和触发器联系到一起
scheduler.scheduleJob(build, trigger);
//5.启动任务
scheduler.start();
}
执行结果
1.2.3 核心的对象介绍
-
JobDetail
主要指定了Job的更加详细的属性,如任务名称和任务群组...
-
Trigger
一个用于描述触发Job执行的时间规则的类
-
SimpleTrigger
一次或者固定时间间隔周期的触发规则
-
CronTrigger
通过cron表达式描述出更为复杂的触发规则
-
Scheduler
1. 代表一个Quartz的独立运行容器 2. Trigger和JobDetail被注册到Scheduler中 3. 二者在Scheduler中拥有各自的名称(name)和组名(group) 4. Trigger和JobDetail的名称和组名的组合必须唯一,但是Trigger的名称和组名的组合可以和JobDetail的相同,因为它们类型不同 5. 一个Job可以绑定多个Trigger
-
Calendar
Quartz提供的日历类,一个Trigger可以和多个Calendar关联,以此来排除一些特殊的日期
-
代码实现
配置文件
<?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"> <!--首先将自定义任务类加入到IOC容器--> <bean id="myJob" class="com.qf.quartz.MyJob"></bean> <!--配置固定时长的任务类,并注入被任务调度类和任务方法--> <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <!--注册被调度类--> <property name="targetObject" ref="myJob"></property> <!--注册被调度方法--> <property name="targetMethod" value="task1"></property> <!--设置名称--> <property name="name" value="task1"></property> <!--设置分组--> <property name="group" value="group"></property> </bean> <!--配置cron表达式的任务类,并且注入被任务调度类和任务方法--> <bean id="jobDetail2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <!--注册被调度类--> <property name="targetObject" ref="myJob"/> <!--注册被调度方法--> <property name="targetMethod" value="task2"/> <!--设置名称--> <property name="name" value="task2"></property> <!--设置分组--> <property name="group" value="group"></property> </bean> <!--配置固定时长的触发器并且配置任务的时间--> <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"> <!--配置此触发器作用的类型--> <property name="jobDetail" ref="jobDetail"/> <!--指定触发器执行的间隔--> <property name="repeatInterval" value="1000"/> </bean> <!--配置cron表达式的触发器并配置任务的规则--> <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <!--配置此触发器作用的类型--> <property name="jobDetail" ref="jobDetail2"/> <!--指定触发器执行的间隔--> <property name="cronExpression" value="0/1 * * * * ?"/> </bean> <!--配置调度--> <bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="simpleTrigger"/> <ref bean="cronTrigger"/> </list> </property> </bean> </beans>
自定义任务类
public class HelloQuartz2 implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("任务被执行了,===="+sdf.format(new Date())); } }
测试
public static void main(String[] args) throws SchedulerException { //创建自定义的任务(job)对象 JobDetail build = JobBuilder.newJob(HelloQuartz2.class).build(); //创建触发器(trigger)对象,并且设置触发规则,多少时间执行一次job Date startTime = new Date();//开始执行时间 startTime.setTime(startTime.getTime()+2000);//设置在两秒后执行 Date endTime = new Date(); endTime.setTime(endTime.getTime()+5000);//结束时间推迟5秒 SimpleTrigger trigger = TriggerBuilder.newTrigger() .withIdentity("trigger1", "triggerGroup1") .startNow()//设置立即生效时间 .startAt(startTime)//触发器开始时间 .endAt(endTime)//触发器结束时间 .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(1)) .build(); //创建任务调度对象 Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); //4.将任务和触发器联系到一起 scheduler.scheduleJob(build, trigger); //5.启动任务 scheduler.start(); }
运行结果