Quartz作业调度的入门使用
概念
1.Job
表示一个工作,要执行的具体的内容。此接口中只有一个方法
2.JobDetail
JobDetail表示一个具体的可执行的调度程序,Job是这个可执行调度程序所要执行的内容
3.Trigger
Trigger代表一个调度参数的配置
4.Scheduler
Scheduler代表一个调度容器,一个调度容器中可以注册多个JobDetail和Trigger.
说明:
编写job实现业务,要做什么具体事情
使用JobDetail包装job,是任务对象,可以被调度
使用Trigger定制什么时候去调用某任务对象
使用Scheduler结合任务对象和触发器对象
第一个任务
1.引入依赖坐标
pom.xml
<dependencies> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.3</version> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz-jobs</artifactId> <version>2.2.3</version> </dependency> <!-- slf4j log4j --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.7</version> </dependency> </dependencies>
2.简单测试类
QuartzTest.java
package me.xueyao.quartz.test;
import org.junit.Test;
import org.quartz.Scheduler;
import org.quartz.impl.StdSchedulerFactory;
/**
* @author XueYao
* @date 2017-11-26
*/
public class QuartzTest {
//quartz容器启动和关闭
@Test
public void testFirst() throws Exception {
//Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
Scheduler scheduler = new StdSchedulerFactory().getScheduler();
// and start it off
scheduler.start();
//任务写在此处
scheduler.shutdown();
}
}SIMPLETRIGGER简单任务
1.创建业务任务job:
HelloJob.java
package me.xueyao.simpletrigger.test;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
/**
* @author XueYao
* @date 2017-11-26
*/
public class HelloJob implements Job{
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("hello quartz... thanks");
}
}2.编写调度代码:
SimpleTriggerTest.java
package me.xueyao.simpletrigger.test;
import org.junit.Test;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import static org.quartz.TriggerBuilder.newTrigger;
/**
* @author XueYao
* @date 2017-11-26
*/
public class SimpleTriggerTest {
//简单任务
@Test
public void testSimpleTrigger() throws SchedulerException {
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler scheduler = sf.getScheduler();
// define the job and tie it to our HelloJob class
//构建调度任务详情对象:包装job,并指定任务的组group1和任务名字job1
JobDetail job = newJob(HelloJob.class)
.withIdentity("job1", "group1")
.build();
// Trigger the job to run now, and then repeat every 40 seconds
//构建一个触发器(触发规则、什么时候如何调用任务的规则)
/*
* @param1 解决器的名字
* @param2 触发任务的组的名字
* */
Trigger trigger = newTrigger()
.withIdentity("trigger1", "group1")
.startNow() //马上开始执行任务
.withSchedule(simpleSchedule()//简单任务
.withIntervalInSeconds(5) //间隔5秒
.repeatForever()) //永远执行下去
.build();
// Tell quartz to schedule the job using our trigger
scheduler.scheduleJob(job, trigger);
scheduler.start();
//死循环,让程序一直执行
while (true) {
}
}
}CRONTRIGGER定时任务
cron表达式 通过7个字符表示计划,字符间用空格分隔即可
Seconds 秒
Minutes 分钟
Hours 小时
Day-of-Month 当前月第几天
Month 月
Day-of-Week 当前周第几天
Year 年(可省略) 举例:
0 0 12 ? * WED
解决: 0秒0分12点每个月星期三
值的解释:
0代表数字0
?代表未知,不存在,一般用于月的某一天和周的某一天,两者不能同时使用
WED,代表星期几,通常用1-7表示,1是星期日
/代表每隔多长刻度,例如0/15,放在分钟上,就表示每隔15分钟执行
测试代码:
package me.xueyao.crontrigger.test;
import me.xueyao.simpletrigger.test.HelloJob;
import org.junit.Test;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import static org.quartz.TriggerBuilder.newTrigger;
/**
* 定时任务
* @author XueYao
* @date 2017-11-26
*/
public class CronTriggerTest {
@Test
public void testCronTrigger() throws SchedulerException {
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler scheduler = sf.getScheduler();
// define the job and tie it to our HelloJob class
//构建调度任务详情对象:包装job,并指定任务的组group1和任务名字job1
JobDetail job = newJob(HelloJob.class)
.withIdentity("job1", "group1")
.build();
//构建一个触发器(触发规则、什么时候如何调用任务的规则)
/*
* @param1 解决器的名字
* @param2 触发任务的组的名字
* */
Trigger trigger = newTrigger()
.withIdentity("trigger1", "group1")
.startNow() //马上开始执行任务
.withSchedule(
//每隔5秒运行一次
//CronScheduleBuilder.cronSchedule("0/5 * * * * ?")
CronScheduleBuilder.cronSchedule("0/5 51 18 ? * 1")
) //永远执行下去
.build();
// Tell quartz to schedule the job using our trigger
scheduler.scheduleJob(job, trigger);
scheduler.start();
while (true) {
}
}
}SPRING整合QUARTZ
1.创建一个Maven java 项目
2.引入依赖坐标
pom.xml
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>me.xueyao.quartz</groupId> <artifactId>springQuartz</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <!-- spring context --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>4.2.9.RELEASE</version> </dependency> <!-- spring context support --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>4.2.9.RELEASE</version> </dependency> <!-- spring tx --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>4.2.9.RELEASE</version> </dependency> <!-- quartz核心 --> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.3</version> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz-jobs</artifactId> <version>2.2.3</version> </dependency> <!-- slf4j log4j --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> <version>1.7.7</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>4.2.9.RELEASE</version> <scope>test</scope> </dependency> </dependencies> </project>
3.编写job业务任务
HelloJob.java
package me.xueyao.quartz.job;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
/**
* @author XueYao
* @date 2017-11-26
*/
public class HelloJob implements Job{
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("hello quartz Spring ... thanks");
}
}4.Spring配置文件
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd "> <context:component-scan base-package="me.xueyao" /> <!-- 配置任务详情对象 --> <bean id="helloJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean"> <!-- 注入job的类型 --> <property name="jobClass" value="me.xueyao.quartz.job.HelloJob"/> <!-- 数据存放策略 --> <property name="jobDataAsMap"> <map> <!-- 任务执行超时时间 --> <entry key="timeout" value="5"/> </map> </property> </bean> <!-- ======================== 调度触发器 ======================== --> <!-- 简单任务 --> <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean"> <!-- see the example of method invoking job above 注入任务 --> <property name="jobDetail" ref="helloJobDetail" /> <!-- 10 seconds 第一次开始时间,即准备的时间,毫秒 --> <property name="startDelay" value="5000" /> <!-- repeat every 50 seconds 每次执行的间隔时间 --> <property name="repeatInterval" value="3000" /> </bean> <!-- 计划任务 --> <!-- <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="jobDetail" ref="exampleJob" /> run every morning at 6 AM <property name="cronExpression" value="0 0 6 * * ?" /> </bean> --> <!-- ======================== 调度工厂 ======================== --> <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="simpleTrigger" /> </list> </property> </bean> </beans>
5.测试代码
SpringQuartzTest.java
package me.xueyao.springquartz;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
/**
* @author XueYao
* @date 2017-11-26
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:applicationContext.xml"})
public class SpringQuartzTest {
@Test
public void test() {
while (true) {
}
}
}
