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) { } } }