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定时原理图: