常见的定时任务技术--Quartz [kwɔːts] 框架(任务调度框架)

                                      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就行,会在控制台上输出的。


Quartz 任务调度表达式语法

Quartz cron表达式支持七个域:

名称是否必须允许值特殊字符
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

注意:

日与周,必须有一个是问号。否则就会有冲突。

月份和星期的名称是不区分大小写的。FRI 和 fri 是一样的。

 

举例:

表达式意义
"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定时原理图:

 

 

 

 

 

 

 

 

 

 

 

一个Java开发的菜鸟
原文地址:https://www.cnblogs.com/lanto/p/13282558.html