什么是Quartz
Quartz是OpenSymphony开源组织在Job scheduling领域的开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的日程序表。Jobs可以做成标准的Java组件或 EJBs。
Quartz是一个任务日程管理系统,一个在预先确定(被纳入日程)的时间到达时,负责执行(或者通知)其他软件组件的系统。
Quartz用一个小Java库发布文件(.jar文件),这个库文件包含了所有Quartz核心功能。这些功能的主要接口(API)是Scheduler接口。它提供了简单的操作,例如:将任务纳入日程或者从日程中取消,开始/停止/暂停日程进度。
spring整合Quartz的maven依赖
<!--定时任务-->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz-jobs</artifactId>
<version>2.2.1</version>
</dependency>
Quartz框架的核心对象
1、Scheduler – 核心调度器
2、Job – 任务
3、JobDetail – 任务描述
4、Trigger -- 触发器
对象间的关系
完整的quartz整合spring用例
首先写任务类
package com.quartz;
import org.quartz.JobExecutionException;
import java.util.Date;
/**
* @Author :MrYu
* @Description : 任务类
* 创建时间 :2019/5/26 on 6:04
*/
public class Schedule1 {
int i=0;
public void execute() throws JobExecutionException {
i++;
System.out.println("第"+i+"次执行,时间为"+new Date());
}
}
详细配置:
<?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:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task.xsd">
<!-- 注册任务类-->
<bean id="schedule1" class="com.quartz.Schedule1"></bean>
<!--将Job类配置JobDetail-->
<bean id="SpringQtzJobMethod"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject">
<ref bean="schedule1"/><!--任务类-->
</property>
<property name="targetMethod"> <!-- 要执行的方法名称 -->
<value>execute</value>
</property>
</bean>
<!--配置调度触发器-->
<bean id="cronTriggerFactoryBean" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean ">
<property name="jobDetail" ref="SpringQtzJobMethod"></property>
<property name="cronExpression" value="0/5 * * * * ?"></property>
</bean>
<!-- 配置调度工厂-->
<bean id="SpringJobSchedulerFactoryBean"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTriggerFactoryBean"/>
</list>
</property>
</bean>
</beans>
测试用例:
package com.quartz;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
/**
* @Author :MrYu
* @Description : 基于Quartz的定时任务
* 注意:不能用@Test测试,完全测试部出来效果的
* 创建时间 :2019/5/26 on 4:28
*/
public class TestSpringQuartz {
public static void main(String[] args) {
ApplicationContext ctx = new ClassPathXmlApplicationContext("spring/application-quartz.xml");
}
}
执行结果:
[ INFO ] - [ org.springframework.context.support.AbstractApplicationContext.prepareRefresh(AbstractApplicationContext.java:513) ] Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@4926097b: startup date [Sun May 26 06:16:25 CST 2019]; root of context hierarchy
[ INFO ] - [ org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:316) ] Loading XML bean definitions from class path resource [spring/application-quartz.xml]
[ INFO ] - [ org.quartz.impl.StdSchedulerFactory.instantiate(StdSchedulerFactory.java:1184) ] Using default implementation for ThreadExecutor
[ INFO ] - [ org.quartz.core.SchedulerSignalerImpl.<init>(SchedulerSignalerImpl.java:61) ] Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
[ INFO ] - [ org.quartz.core.QuartzScheduler.<init>(QuartzScheduler.java:240) ] Quartz Scheduler v.2.2.1 created.
[ INFO ] - [ org.quartz.simpl.RAMJobStore.initialize(RAMJobStore.java:155) ] RAMJobStore initialized.
[ INFO ] - [ org.quartz.core.QuartzScheduler.initialize(QuartzScheduler.java:305) ] Scheduler meta-data: Quartz Scheduler (v2.2.1) 'SpringJobSchedulerFactoryBean' with instanceId 'NON_CLUSTERED'
Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
NOT STARTED.
Currently in standby mode.
Number of jobs executed: 0
Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.
Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.
[ INFO ] - [ org.quartz.impl.StdSchedulerFactory.instantiate(StdSchedulerFactory.java:1339) ] Quartz scheduler 'SpringJobSchedulerFactoryBean' initialized from an externally provided properties instance.
[ INFO ] - [ org.quartz.impl.StdSchedulerFactory.instantiate(StdSchedulerFactory.java:1343) ] Quartz scheduler version: 2.2.1
[ INFO ] - [ org.quartz.core.QuartzScheduler.setJobFactory(QuartzScheduler.java:2311) ] JobFactory set to: org.springframework.scheduling.quartz.AdaptableJobFactory@3bd94634
[ INFO ] - [ org.springframework.context.support.DefaultLifecycleProcessor$LifecycleGroup.start(DefaultLifecycleProcessor.java:341) ] Starting beans in phase 2147483647
[ INFO ] - [ org.springframework.scheduling.quartz.SchedulerFactoryBean.startScheduler(SchedulerFactoryBean.java:649) ] Starting Quartz Scheduler now
[ INFO ] - [ org.quartz.core.QuartzScheduler.start(QuartzScheduler.java:575) ] Scheduler SpringJobSchedulerFactoryBean_$_NON_CLUSTERED started.
第1次执行,时间为Sun May 26 06:16:26 CST 2019
第2次执行,时间为Sun May 26 06:16:30 CST 2019
第3次执行,时间为Sun May 26 06:16:35 CST 2019
第4次执行,时间为Sun May 26 06:16:40 CST 2019
第5次执行,时间为Sun May 26 06:16:45 CST 2019
第6次执行,时间为Sun May 26 06:16:50 CST 2019
第7次执行,时间为Sun May 26 06:16:55 CST 2019
第8次执行,时间为Sun May 26 06:17:00 CST 2019
第9次执行,时间为Sun May 26 06:17:05 CST 2019
第10次执行,时间为Sun May 26 06:17:10 CST 2019
第11次执行,时间为Sun May 26 06:17:15 CST 2019
第12次执行,时间为Sun May 26 06:17:20 CST 2019
第13次执行,时间为Sun May 26 06:17:25 CST 2019
第14次执行,时间为Sun May 26 06:17:30 CST 2019
第15次执行,时间为Sun May 26 06:17:35 CST 2019
第16次执行,时间为Sun May 26 06:17:40 CST 2019
第17次执行,时间为Sun May 26 06:17:45 CST 2019
第18次执行,时间为Sun May 26 06:17:50 CST 2019