Quartz框架(任务调度框架)
步骤:
1.一个maven转成web的项目中 添加依赖
2.编写任务类(就是普通的类,里面定义一个普通的任务方法)
3.编写Spring整合Quartz配置
4.启动服务

实现:
1.一个maven转成web的项目中 添加依赖
<dependencies>
<!--定时任务 -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.3</version>
</dependency>
<!-- Spring框架 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.0.2.RELEASE</version>
</dependency>
<!--日志包-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
</dependencies>
2.编写任务类
也就是普通的类,只是里面加了自定义的任务方法。
/**
* 任务类
*/
public class MyJob {
/**
* 任务方法
*/
public void task(){
System.out.println("任务触发了..."+new Date());
}
}
3.编写Spring整合Quartz配置
先在web.xml里面配置一个 监听器,来加载quartz配置(applicationContext-task.xml)
再在applicationContext-task.xml里面配置(配置任务、配置触发器、配置任务调度对象)。
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" version="2.5"> <!--监听器加载quartz配置--> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext-task.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> </web-app>
applicationContext-task.xml:
<?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.创建任务对象:JobDetail 做什么 -->
<!--创建执行任务目标对象-->
<bean id="myJob" class="cn.itcast.quartz.MyJob"/>
<bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!--执行的任务对象-->
<property name="targetObject" ref="myJob"/>
<!--执行的方法-->
<property name="targetMethod" value="task"/>
</bean>
<!--2.创建触发器:Trigger 什么时候-->
<bean id="trigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<!--设置cron表达式 每隔5秒执行1次任务-->
<property name="cronExpression" value="0/5 * * * * ? *"/>
<!--关联任务-->
<property name="jobDetail" ref="jobDetail"/>
</bean>
<!--3.创建任务调度对象:Scheduler 在什么时候做什么-->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<!--关联触发器-->
<property name="triggers">
<array>
<ref bean="trigger"/>
</array>
</property>
</bean>
</beans>
4.启动服务
直接启动该tomcat就行,会在控制台上输出的。

| 是否必须 | 允许值 | 特殊字符 | |
|---|---|---|---|
| 秒 | 是 | 0-59 | , - * / |
| 分 | 是 | 0-59 | , - * / |
| 时 | 是 | 0-23 | , - * / |
| 日 | 是 | 1-31 | , - * ? / L W C |
| 月 | 是 | 1-12 或 JAN-DEC | , - * / |
| 周 | 是 | 1-7 或 SUN-SAT(从周日开始,1是周日,7是周六) | , - * ? / L C # |
| 年 | 否(可以省略) | 空 或 1970-2099 |
注意:
日与周,必须有一个是问号。否则就会有冲突。
举例:
表达式意义
"0 0 12 * * ?" 每天中午12点触发
"0 15 10 ? * *" 每天上午10:15触发
"0 15 10 * * ?" 每天上午10:15触发
"0 15 10 * * ? *" 每天上午10:15触发
"0 15 10 * * ? 2005" 2005年的每天上午10:15触发
"0 * 14 * *?" 在每天下午2点到下午2:59期间的每1分钟触发
"0 0/5 14 * *?" 在每天下午2点到下午2:55期间的每5分钟触发
"0 0/5 14,18 ** ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
"0 0-5 14 * *?" 在每天下午2点到下午2:05期间的每1分钟触发
"0 10,44 14 ? 3WED" 每年三月的星期三的下午2:10和2:44触发
"0 15 10 ? *MON-FRI" 周一至周五的上午10:15触发
"0 15 10 15 *?" 每月15日上午10:15触发
"0 15 10 L * ?" 每月最后一日的上午10:15触发
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6L2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发
"0 15 10 ? *6#3" 每月的第三个星期五上午10:15触发
扩展:
当quartz和rabbitMQ连用的时候(定时发送邮件),我们得注意:在消息提供方,的定时配置文件起名一定要与其他的不同,再在springmvc里面去导入,防止servlet和listener加载顺序(先监听再s)产生的控制针异常。

Quartz定时原理图:
