• 第五周作业 高端的定时任务调度框架Quartz


    平时我们在使用的是jdk里面自带的Timer触发器,但是他有个很大的缺点,就是要设置执行频率,这对于处理大量请求的服务器来说是一件比较耗费资源的事情,因为我处理大量的请求已经是够忙的了,再来定时检查下任务效率就低了。

    Quartz有两大触发器,除了上面使用的SimpleTrigger外,就是CronTrigger。一个是简单触发器,一个是任务触发器,后者可以配置详细的任务执行时机,精确到某年,某月,某日,某时,某秒,在我们做项目的时候比较常用。

    Timer

      jdk里面的Timer比较简单,主要设置执行频率及其延迟时间。

    Quartz:

      SimpleTrigger和CronTrigger,首先将将他的配置详见下面:主要详见配置文件的相关注释

      

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
     4     xmlns:context="http://www.springframework.org/schema/context"
     5     xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
     6     xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     7     http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd 
     8     http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
     9     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    10     
    11     <!-- 注册一个普通的Bean -->
    12     <bean id="quartzTask" class="cn.hp.nsfw.complain.quartz.QuartzTask"></bean>
    13     <!-- 制定任务信息 -->
    14     <bean id="jodDetail1" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    15         <!-- 设置执行对象 -->
    16         <property name="targetObject" ref="quartzTask"></property>
    17         <!--设置执行对象中的方法  -->
    18         <property name="targetMethod" value="doSimpleTriggerTask"></property>
    19         <!-- 设置是否同步(同步即可以2个以上的任务同时执行)默认是可以并发执行的 -->
    20         <property name="concurrent" value="false"></property>
    21     </bean>
    22     
    23     <bean id="jodDetail2" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
    24         <!-- 设置执行对象 -->
    25         <property name="targetObject" ref="quartzTask"></property>
    26         <!--设置执行对象中的方法  -->
    27         <property name="targetMethod" value="doCronTriggerTask"></property>
    28         <!-- 设置是否同步(同步即可以2个以上的任务同时执行)默认是可以并发执行的 -->
    29         <property name="concurrent" value="false"></property>
    30     </bean>
    31     
    32     <!-- 制定任务执行时机(即任务的触发器) -->
    33     <bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
    34         <!-- 设置任务详细信息 -->
    35         <property name="jobDetail" ref="jodDetail1"></property>
    36         <!-- 设置任务延迟执行时间 ,延迟两秒执行-->
    37         <property name="startDelay" value="3000"></property>
    38         <!-- 设置任务执行频率 ,执行频率为2秒-->
    39         <property name="repeatInterval" value="2000"></property>
    40     </bean>
    41     
    42     <!-- 任务触发器 -->
    43     <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
    44         <!-- 设置任务详细信息 -->
    45         <property name="jobDetail" ref="jodDetail2"></property>
    46         <!-- 设置任务延迟执行时机-->
    47         <property name="cronExpression" value="0/3 * * * * ?"></property>
    48     </bean>
    49     
    50     <!-- 3.设置调度工厂 -->
    51     <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    52         <!-- 设置触发器们 -->
    53         <property name="triggers">
    54             <list>
    55                 <!-- <ref bean="simpleTrigger"/> -->
    56                 <!-- <ref bean="cronTrigger"/> -->
    57             </list>
    58         </property>
    59     </bean>
    60     
    61 </beans>
    View Code

      相关的Bean类

     1 package cn.hp.nsfw.complain.quartz;
     2 
     3 import java.text.SimpleDateFormat;
     4 import java.util.Date;
     5 
     6 public class QuartzTask {
     7     
     8     public void doSimpleTriggerTask()
     9     {
    10         System.out.println("doSimpleTriggerTask  ...   "+new 
    11                 SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
    12     }
    13     
    14     public void doCronTriggerTask()
    15     {
    16         System.out.println("doCronTriggerTask  ...   "+new 
    17                 SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
    18     }
    19 
    20 }
    View Code

     相应的结果:

     

    任务触发器:

    关于相关的配置参见如下说明:

    '*' 字符可以用于所有字段,在“分”字段中设为"*"表示"每一分钟"的含义。

    '?' 字符可以用在“日”和“周几”字段它用来指定 '不明确的值'. 这在你需要指定这两个字段中的某一个值而不是另外一个的时候会被用到。在后面的例子中可以看到其含义。

    '-' 字符被用来指定一个值的范围,比如在“小时”字段中设为"10-12"表示"10点到12".

    ',' 字符指定数个值。比如在“周几”字段中设为"MON,WED,FRI"表示"the days Monday, Wednesday, and Friday".

    '/' 字符用来指定一个值的的增加幅度比如在“秒”字段中设置为"0/15"表示"0, 15, 30, 和 45"。而 "5/15"则表示"5, 20, 35, 和 50". '/'前加"*"字符相当于指定从0秒开始每个字段都有一系列可以开始或结束的数值。对于“秒”和“分”字段来说,其数值范围为059,对于“小时”字段来说其为023, 对于“日”字段来说为031, 而对于“月”字段来说为112"/"字段仅仅只是帮助你在允许的数值范围内从开始"n"的值。 因此对于“月”字段来说"7/6"只是表示7月被开启而不是“每六个月”请注意其中微妙的差别。

    'L'字符可用在“日”和“周几”这两个字段。它是"last"的缩写但是在这两个字段中有不同的含义。例如,“日”字段中的"L"表示"一个月中的最后一天—— 对于一月就是31号对于二月来说就是28号(非闰年)。而在“周几”字段中它简单的表示"7" or "SAT",但是如果在“周几”字段中使用时跟在某个数字之后它表示"该月最后一个星期×—— 比如"6L"表示"该月最后一个周五"。当使用'L'选项时,指定确定的列表或者范围非常重要,否则你会被结果搞糊涂的。

    'W' 可用于“日”字段。用来指定历给定日期最近的工作日(周一到周五。比如你将“日”字段设为"15W",意为: "离该月15号最近的工作日"。因此如果15号为周六,触发器会在14号即周五调用。如果15号为周日触发器会在16号也就是周一触发。如果15号为周二,那么当天就会触发。然而如果你将“日”字段设为"1W", 而一号又是周六触发器会于下周一也就是当月的3号触发,因为它不会越过当月的值的范围边界。'W'字符只能用于“日”字段的值为单独的一天而不是一系列值的时候。

    'L''W'可以组合用于“日”字段表示为'LW',意为"该月最后一个工作日"

    '#' 字符可用于“周几”字段。该字符表示“该月第几个周×”,比如"6#3"表示该月第三个周五( 6表示周五而"#3"该月第三个)。再比如: "2#1" = 表示该月第一个周一而 "4#5" = 该月第五个周三。注意如果你指定"#5"该月没有第五个“周×”,该月是不会触发的。

    'C' 字符可用于“日”和“周几”字段,它是"calendar"的缩写。它表示为基于相关的日历所计算出的值(如果有的话)。如果没有关联的日历那它等同于包含全部日历。“日”字段值为"5C"表示"日历中的第一天或者5号及其以后",“周几”字段值为"1C"则表示"日历中的第一天或者周日及其以后"

    对于“月份”字段和“周几”字段来说合法的字符都不是大小写敏感的。

  • 相关阅读:
    20161101学习笔记
    20161031学习笔记
    20161028学习笔记
    20161027学习笔记
    ReentrantLock Condition
    ReentrantLock 重入锁
    CountDownLatch用法与原理
    场景化解释 AQS原理
    Atomic
    多线程工具类
  • 原文地址:https://www.cnblogs.com/he-123/p/5347402.html
Copyright © 2020-2023  润新知