什麼是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