quartz任务调度入门与spring整合开发
1.简介
什么是Quartz呢?
Quartz是OpenSymphony开源组织在Job scheduling领域的开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的日程序表。Jobs可以做成标准的Java组件或 EJBs。
Quartz是一个任务日程管理系统,一个在预先确定(被纳入日程)的时间到达时,负责执行(或者通知)其他软件组件的系统。
Quartz用一个小Java库发布文件(.jar文件),这个库文件包含了所有Quartz核心功能。这些功能的主要接口(API)是Scheduler接口。它提供了简单的操作,例如:将任务纳入日程或者从日程中取消,开始/停止/暂停日程进度。
2.maven依赖项—dependency
<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>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.12</version>
</dependency>
3.入门案例:
3.1 案例一:
@Test
public void quartzTest() throws Exception{
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
(---------------)
scheduler.start();
scheduler.shutdown();
}
3.2 案例二: SimpleTrigger 使用
必须掌握 JobDetail 和 Trigger 两个对象
Job 工作任务 ,你要做什么
Trigger 执行工作任务 触发条件 , 什么时间执行, 多久执行一次
/**
*创建一个类实现job接口
*/
public class QuartzJob implements Job{
public void execute(JobExecutionContext context) throws JobExecutionException {
System.out.println("hello quartz...");
}
}
/**
* 每一秒打印一次 hello quartz...
*/
public class QuartzPrint1 {
public static void main(String[] args) throws SchedulerException {
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
JobDetail job = JobBuilder.newJob(QuartzJob.class)
.withIdentity("job1", "group1").build();
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("tigger1", "group1")
.startNow()
.withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(1))
.build();
scheduler.scheduleJob(job, trigger);
scheduler.start();
}
}
3.3 案例三: CronTrigger 的使用
public class QuartzPrint2 {
public static void main(String[] args) throws SchedulerException {
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
JobDetail job = JobBuilder.newJob(QuartzJob.class)
.withIdentity("job1", "group1").build();
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity("trigger1", "group1")
.withSchedule(CronScheduleBuilder.cronSchedule("0 0 0 ? * *"))
.build();
scheduler.scheduleJob(job, trigger);
scheduler.start();
}
}
3.4 quartz框架核心对象
1、scheduler是一个计划调度器容器,容器里面可以盛放众多的JobDetail和trigger,当容器启动后,里面的每个JobDetail都会根据trigger按部就班自动去执行。
2、JobDetail是一个可执行的工作,它本身可能是有状态的。
3、Trigger触发器代表一个调度参数的配置,什么时候去调。
4、当JobDetail和Trigger在scheduler容器上注册后,形成了装配好的作业(JobDetail和Trigger所组成的一 对儿),就可以伴随容器启动而调度执行了。
5、scheduler是个容器,容器中有一个线程池,用来并行调度执行每个作业,这样可以提高容器效率。
3.5 Cron 表达式
1)Cron表达式的格式:秒 分 时 日 月 周 年(可选)。
字段名 允许的值 允许的特殊字符
秒 0-59 , - * /
分 0-59 , - * /
小时 0-23 , - * /
月中的某一天 1-31 , - * ? / L W C
月 1-12 or JAN-DEC , - * /
周中的某一天 1-7 or SUN-SAT , - * ? / L C #
年 (可选字段) empty, 1970-2099 , - * /
其中月和周只能设置一个值
“?”字符:表示不确定的值
“,”字符:指定数个值
“-”字符:指定一个值的范围
“/”字符:指定一个值的增加幅度。n/m表示从n开始,每次增加m
“L”字符:用在日表示一个月中的最后一天,用在周表示该月最后一个星期X
“W”字符:指定离给定日期最近的工作日(周一到周五)
“#”字符:表示该月第几个周X。6#3表示该月第3个周五
2)Cron表达式范例:
每隔5秒执行一次:*/5 * * * * ?
每隔1分钟执行一次:0 */1 * * * ?
每天23点执行一次:0 0 23 * * ?
每天凌晨1点执行一次:0 0 1 * * ?
每月1号凌晨1点执行一次:0 0 1 1 * ?
每月最后一天23点执行一次:0 0 23 L * ?
每周星期天凌晨1点实行一次:0 0 1 ? * L
在26分、29分、33分执行一次:0 26,29,33 * * * ?
每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 * * ?
每天中午12点触发 "0 0 12 * * ?"
每天上午10:15触发"0 15 10 ? * *"
每天上午10:15触发"0 15 10 * * ?"
每天上午10:15触发"0 15 10 * * ?*"
2017年的每天上午10:15触发"0 15 10 * * ? 2017"
在每天下午2点到下午2:59期间的每1分钟触发"0 * 14 * * ?"
在每天下午2点到下午2:55期间的每5分钟触发"0 0/5 14 * *?"
在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发"0 0/5 14,18 ** ?"
在每天下午2点到下午2:05期间的每1分钟触发"0 0-5 14 * *?"
每年三月的星期三的下午2:10和2:44触发"0 10,44 14 ? 3 WED"
MON-FRI" 周一至周五的上午10:15触发"0 15 10 ? *
每月15日上午10:15触发"0 15 10 15 *?"
每月最后一日的上午10:15触发"0 15 10 L * ?"
每月的最后一个星期五上午10:15触发"0 15 10 ? * 6L"
2002年至2005年的每月的最后一个星期五上午10:15触发"0 15 10 ? * 6L 2002-2005"
每月的第三个星期五上午10:15触发"0 15 10 ? * 6#3"
更多表达式请使用工具生成:CronExpBuilder-1.0(触发器表达式生成器).jar
如果双击打不开,请参考下方连接:
https://jingyan.baidu.com/article/200957617c3619cb0621b44d.html
4.Spring整合Quartz
4.1 导入依赖
<dependencies>
<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>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.1.7.RELEASE</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>tomcat-maven-plugin</artifactId>
<version>1.1</version>
<configuration>
<port>9999</port>
</configuration>
</plugin>
</plugins>
</build>
4.2 配置 spring web.xml 监听器
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
id="WebApp_ID" version="2.5">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
4.3 配置 Spring applicationContext.xml
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="jobFactory" ref="jobFactory" />
<property name="triggers">
<list>
<ref bean="simpleTrigger"/>
</list>
</property>
</bean>
<bean id="helloJob"
class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="cn.crystal.quartz.HelloJob" />
</bean>
<bean id="simpleTrigger"
class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<property name="jobDetail" ref="helloJob" />
<property name="startDelay" value="3000" />
<property name="repeatInterval" value="5000" />
</bean>
<context:component-scan base-package="cn.crystal.quartz.service" />
4.4 编写job程序
@Service("jobFactory")
public class JobFactory extends AdaptableJobFactory {
@Autowired
@Override
protected Object createJobInstance(TriggerFiredBundle bundle)
throws Exception {
Object jobInstance = super.createJobInstance(bundle);
capableBeanFactory.autowireBean(jobInstance);
return jobInstance;
}
}
public class HelloJob implements Job {
@Autowired
private HelloService helloService;
public void execute(JobExecutionContext context) throws JobExecutionException {
helloService.sayHello();
}
}
@Service
public class HelloService {
public void sayHello() {
System.out.println("hello,quartz spring !!!~~");
}
}
5.spring 自带定时任务功能!
1.在applicationContext.xml中加约束
xmlns:task="http://www.springframework.org/schema/task"
http:
2.配置开启定时任务注解 <task:annotation-driven/>
3.编写具体做事情的类及方法
@Component <context:component-scan base-package="cn.crystal"/>
public class BosTask {
@Scheduled(cron="*/5 * * * * ?")
public void refresh(){
System.out.println("定时操作...");
}
}