zoukankan      html  css  js  c++  java
  • 常见的定时任务技术--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开发的菜鸟
  • 相关阅读:
    研发环境容器化实施过程(docker + docker-compose + jenkins)
    Java虚拟机-字节码执行引擎
    Java虚拟机-类加载机制
    Java虚拟机-字节码指令
    Java虚拟机-类文件结构
    Java虚拟机理解-内存管理
    单元测试实践(SpringCloud+Junit5+Mockito+DataMocker)
    Git基础概念与Flow流程介绍
    谷歌最佳实践
    谷歌最佳实践
  • 原文地址:https://www.cnblogs.com/lanto/p/13282558.html
Copyright © 2011-2022 走看看