使用Quartz任务调度框架
Quartz是一个用JAVA编写的开源的作业调度框架,首先来看一下Quartz的核心的API类
- Job:每一个具体的任务或工作就是一个job,代表具体要执行的内容。
- JobDetail:JobDetail是一个用于绑定job的任务详情程序,指定了任务的方案和策略,job是任务的具体实现。Spring 中有JobDetailFactoryBean和 MethodInvokingJobDetailFactoryBean两个类作为JobDetail的实现类,如果任务调度只需要执行某个类的某个方法,可以直接使用MethodInvokingJobDetailFactoryBean。
- Trigger:Trigger是一个触发器,用于指定任务程序执行的时机。在Quartz中有SimpleTrigger,CronTrigger,DateIntervalTrigger和NthIncludedDayTrigger,其中CronTrigger使用比较多。Spring中把CronTrigger在CronTriggerFactoryBean这个类中。
- Scheduler:任务调度容器,一个Scheduler可以注册多个JobDetail和Trigger,但是一个Trigger只能绑定一个JobDetail,当Trigger绑定了JobDetail后就可以被容器调度了。
- Calender:它是一些日历特定时间点的集合。一个trigger可以包含多个Calendar,以便排除或包含某些时间点
- ThreadPool: Scheduler使用一个线程池作为任务运行的基础设施,任务通过共享线程池中的线程提高运行效率。
Cron表达式的(七子表达式)
Cron表达式的格式:秒 分 时 日 月 周 年(可选)。
字段名 允许的值 允许的特殊字符
秒 0-59 , – * /
分 0-59 , – * /
小时 0-23 , – * /
日 1-31 , – * ? / L W C
月 1-12 or JAN-DEC , – * /
周几 1-7 or SUN-SAT , – * ? / L C # MON FRI
年 (可选字段) empty, 1970-2099 , – * /
“?”字符:表示不确定的值
“,”字符:指定数个值
“-”字符:指定一个值的范围
“/”字符:指定一个值的增加幅度。n/m表示从n开始,每次增加m
“L”字符:用在日表示一个月中的最后一天,用在周表示该月最后一个星期X
“W”字符:指定离给定日期最近的工作日(周一到周五)
“#”字符:表示该月第几个周X。6#3表示该月第3个周五
Cron表达式范例:
每隔5秒执行一次:* 0/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 * * ?
使用Quartz和Spring测试使用任务调度框架
1、创建一个任务类Job
/**
* 定义晚安任务类
*/
public class GoodNightJob {
public void goodNight(){
System.out.println("夜晚,月光和星星都是那么耀眼!");
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("HH:mm:SS");
String formatDate = simpleDateFormat.format(date);
System.out.println("当前的时间是:"+formatDate);
System.out.println("这个时间正好是酣睡的好时机,看看大树和泥土都已经拥抱在一起了,渐渐。。渐渐 。。入梦");
}
}
2、使用Spring托管Quartz提供的JobDetail、Trigger、Schedualer的具体实现类,以下是spring配置文件的内容:
<?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"> <!-- bean definitions here -->
<!--定义一个任务类-->
<bean id="goodNightJob" class="com.yanghao.job.GoodNightJob"></bean>
<!--定义一个任务描述类-->
<bean id="goodNightJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="goodNightJob"></property>
<property name="targetMethod" value="goodNight"></property>
</bean>
<!--定义一个触发器-->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="goodNightJobDetail"></property>
<property name="cronExpression" value="0/10 * * * * ?"></property>
</bean>
<!--定义任务调度计划容器-->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTrigger"></ref>
</list>
</property>
</bean>
</beans>
3、配置Tomcat启动时加载Spring工厂、Spring就会根据配置文件把单例实体Bean托管到工厂中,web.xml配置
<!--加载Sping工厂-->
<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>
4、启动tomcat,任务将会按照我们定义的表示式,满足表达式条件时执行
Quartz的工作流程大致如下:
项目具体测试代码参见:https://github.com/dlyanghao/QuartzFrameworkUse
上一篇: 3D_HW9