Quartz介绍及入门案例
1. Quartz 任务调度框架
概述
在实际项目开发中,除了Web应用、SOA服务外,还有一类不可缺少的,那就是定时任务调度。定时任务的场景可以说非常广泛:
某些网站会定时发送优惠邮件。
银行系统还款日信用卡催收款。
某些应用的生日祝福短信等。
完成这些功能都需要用到定时任务调度。那究竟何为定时任务调度,一句话概括就是:基于给定的时间点、给定的时间间隔、给定的执行次数自动执行的任务
JDK的Timer (定时任务只能执行一次,) , Quartz 、 Spring Task 、 (分布式的ElasticJob)
Quartz框架的介绍
Quartz是一个完全由Java编写的开源任务调度的框架,通过触发器设置作业定时运行规则,控制作业的运行时间。其中quartz集群通过故障切换和负载平衡的功能,能给调度器带来高可用性和伸缩性。主要用来执行定时任务,如:定时发送信息、定时生成报表等等。
Quartz框架的主要特点:
· 强大的调度功能,例如丰富多样的调度方法,可以满足各种常规和特殊需求;
· 灵活的应用方式,比如支持任务调度和任务的多种组合,支持数据的多种存储;
· 支持分布式集群,在被Terracotta收购之后,在原来基础上进行了进一步的改造。
任务调用:
- 你要干什么
- 你什么时候去干(触发器+到时间点马上就会触发)
Quartz使用
步骤:
- export_web_manager添加依赖
- 编写任务类(你要什么?)
- 编写Spring整合Quartz配置
- 启动服务
实现:
- export_web_manager添加依赖
使用Spring整合Quartz:
<!--定时任务 -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.3</version>
</dependency>
- 编写任务类
图1:
package cn.itcast.web.task;
import java.text.SimpleDateFormat;
import java.util.Date;
//任务类: 定义你要做什么
public class MyTask {
public void showTime(){
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("当前的系统时间:"+simpleDateFormat.format(new Date()));
}
}
在web.xml配置启动spirng==(已完成)==
<?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"
version="2.5">
<!--启动spring-->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring/applicationContext-*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
- 编写Spring整合Quartz配置
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--1. 定义你要做什么(任务的详情)-->
<bean id="myTask" class="cn.itcast.web.task.MyTask"/>
<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!--目标对象-->
<property name="targetObject" ref="myTask"/>
<!--任务对象的方法-->
<property name="targetMethod" value="showTime"/>
</bean>
<!--2. 定义触发器=时间表达式+任务详情(你什么时候做)-->
<bean id="trigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<!--时间表达式: 秒 分 时 日 月 周 年
注意:
1. 年是可以省略不写的.
2. 周与日是冲突,只能写一个。
-->
<property name="cronExpression" value="0/2 * * * * ? *"/>
<!--任务详情-->
<property name="jobDetail" ref="jobDetail"/>
</bean>
<!--3. 把触发器交给任务调度工厂-->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<array>
<ref bean="trigger"/>
</array>
</property>
</bean>
</beans>
- 启动服务
注意
倘若此处报错
Error creating bean with name ‘jobDetail’: Lookup method resolution failed; nested exception is java.lang.IllegalStateException: Failed to introspect Class [org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean] from ClassLoader [ParallelWebappClassLoader
有可能是导入quartz依赖的版本问题,请看解决方法。
小结
-
quartz 使用步骤
- 导入依赖 - 定义一个任务类 - 配置quartz的核心配置文件 - 定义任务详情 - 定义一个触发器 - 把触发器交给任务调度工厂
2. Quartz 任务调度表达式语法
介绍
Quartz cron 表达式的格式十分类似于 UNIX cron 格式,但还是有少许明显的区别。区别之一就是 Quartz 的格式向下支持到秒级别的计划,而UNIX cron 计划仅支持至分钟级。许多我们的触发计划要基于秒级递增的(例如,每45秒),因此这是一个非常好的差异。
在 UNIX cron 里,要执行的作业(或者说命令)是存放在 cron 表达式中的,在第六个域位置上。Quartz
用 cron 表达式存放执行计划。引用了cron 表达式的 CronTrigger 在计划的时间里会与 job 关联上。
另一个与 UNIX cron 表达式的不同点是在表达式中支持域的数目。UNIX 给出五个域(分、时、日、月和周),Quartz提供七个域。表 5.1 列出了Quartz cron 表达式支持的七个域。
语法
特殊符号的含义
特殊字符 | 意义 |
---|---|
* | 匹配所有的值。如:*在分钟的字段域里表示 每分钟 每 |
? | 只在日期域和星期域中使用。它被用来指定“非明确的值” |
- | 指定一个范围。如:“10-12”在小时域意味着“10点、11点、12点” |
, | 指定几个可选值。如:“MON,WED,FRI”在星期域里表示“星期一、星期三、星期五” |
/ | 指定增量。如:“0/15”在秒域意思是每分钟的0,15,30和45秒。 “5/15”在分钟域表示每小时的5,20,35和50。 |
Quartz Cron 表达式支持到七个域
日与周,必须有一个问号。否则就会有冲突。
月份和星期的名称是不区分大小写的。FRI 和 fri 是一样的。
举例
表达式意义
"0 0 12 * *?" 每天中午12点触发
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发
"0 0/5 14,18* * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
"0 0-5 14 * *? " 在每天下午2点到下午2:05期间的每1分钟触
Memorial Day is 522 days |