zoukankan      html  css  js  c++  java
  • Spring定时任务配置

    简单功能——简单描述,不喜无忧

    主要介绍:Spring Task  、 Quartz 、年月日时分秒周的设置、 两者对比

    一、Spring Task

      Spring从3.0开始增加了自己的任务调度器,它是通过扩展java.util.concurrent包下面的类来实现的,使用起来较为简便;

      注解方式实现:

        首先增加命名空间schema

    1 <beans xmlns="http://www.springframework.org/schema/beans" 
    2         ......
    3         xmlns:task="http://www.springframework.org/schema/task"
    4             xsi:schemaLocation="
    5             ......
    6         http://www.springframework.org/schema/task
    7           http://www.springframework.org/schema/task/spring-task-4.1.xsd"

        其次,让spring能够扫描到

    1 <task:annotation-driven/>

        最后定时任务执行方法

    1 @Component(“taskJob”)  
    2 public class TaskJob {  
    3     @Scheduled(cron = "0 0 3 * * ?")  
    4     public void job1() {  
    5         System.out.println(“任务进行中。。。”);  
    6     }  
    7 }

      XML配置方式实现

     1 <?xml version="1.0" encoding="UTF-8"?>
     2 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:task="http://www.springframework.org/schema/task"
     3     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     4     xsi:schemaLocation="http://www.springframework.org/schema/beans
     5                         http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
     6 http://www.springframework.org/schema/task
     7     http://www.springframework.org/schema/task/spring-task-4.1.xsd"
     8     default-lazy-init="true">
     9 
    10     <!-- 定时任务demo -->
    11     <bean class="com.p.webapp.sync.SyncCtomerOrder" name="SyncCtomerOrder"></bean>
    12     <bean class="com.p.webapp.sync.NewSyncanzuMall" name="NewSyncanzuMall"></bean>
    13 
    14     <task:scheduler id="scheduler" pool-size="2" />
    15     <task:scheduled-tasks scheduler="scheduler">
    16         <task:scheduled ref="SyncCtomerOrder" method="SyncToCRM" cron="*/10 * * * * ?" />
    17         <task:scheduled ref="NewSyncanzuMall" method="syncToMall" cron="*/10 * * * * ?" />
    18     </task:scheduled-tasks>
    19 </beans>

     引入到spring-conf.xml中就可以使用

    备注:spring 定时器任务scheduled-tasks默认配置是单线程串行执行的,这就造成了若某个任务执行时间过长,其他任务一直在排队,业务逻辑没有及时处理的问题;

    增加线程池配置语句:

    <task:scheduler id="scheduler" pool-size="3" />

     二、Quartz 

     1、引入包

    1 <!-- maven依赖 -->
    2 <dependency>
    3      <groupId>org.quartz-scheduler</groupId>
    4      <artifactId>quartz</artifactId>
    5      <version>2.2.1</version>
    6 </dependency>

     SimpleTrigger方式:

     1 <!-- Quartz -->
     2     <bean name="quartzTest" class="com.jz.schedual.QuartzTest" />
     3     <bean id="quartzTestJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
     4         <property name="targetObject" ref="quartzTest"></property>
     5         <property name="targetMethod" value="autoRun"></property>
     6         <property name="concurrent" value="false"></property>
     7     </bean>
     8 
     9     <bean id="quartzTestTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
    10         <property name="jobDetail" ref="quartzTestJob"/>
    11         <!-- 20秒后运行 -->
    12         <property name="startDelay" value="20000" />
    13         <!-- 每隔三十秒重复 -->
    14         <property name="repeatInterval" value="30000" />
    15     </bean>
    16 
    17     <bean name="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    18         <property name="triggers">
    19             <list>
    20                 <ref local="quartzTestTrigger" />
    21             </list>
    22         </property>
    23     </bean>

    CronTrigger方式:在spring配置文件中定义各种bean

     1 <!-- Quartz -->
     2     <bean name="quartzTest" class="com.jz.schedual.QuartzTest" />
     3     <bean id="quartzTestJob" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
     4         <property name="targetObject" ref="quartzTest"></property>
     5         <property name="targetMethod" value="autoRun"></property>
     6      <!-- 设定多个job不会并发运行 -->
     7         <property name="concurrent" value="false"></property>
     8     </bean>
     9 
    10     <bean id="quartzTestTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
    11         <property name="jobDetail" ref="quartzTestJob"/>
    12         <!-- 每天十点 -->
    13         <property name="cronExpression" value="0 0 10 * * ?"></property>
    14     </bean>
    15 
    16     <bean name="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    17         <property name="triggers">
    18             <list>
    19                 <ref local="quartzTestTrigger" />
    20             </list>
    21         </property>
    22     </bean>

    三、年月日时分秒周配置

     1 字段对应顺序如下
     2 字段   允许值   允许的特殊字符
     3 秒    0-59    , - * /
     4 分    0-59    , - * /
     5 小时    0-23    , - * /
     6 日期    1-31    , - * ? / L W C
     7 月份    1-12 或者 JAN-DEC    , - * /
     8 星期    1-7 或者 SUN-SAT    , - * ? / L C #
     9 年(可选)    留空, 1970-2099    , - * / 
    10 - 区间  
    11 * 通配符  
    12 ? 你不想设置那个字段
    13 
    14 
    15 下面只例出几个式子
    16 CRON表达式    含义 
    17 "0 0 12 * * ?"    每天中午十二点触发 
    18 "0 15 10 ? * *"    每天早上10:15触发 
    19 "0 15 10 * * ?"    每天早上10:15触发 
    20 "0 15 10 * * ? *"    每天早上10:15触发 
    21 "0 15 10 * * ? 2005"    2005年的每天早上10:15触发 
    22 "0 * 14 * * ?"    每天从下午2点开始到2点59分每分钟一次触发 
    23 "0 0/5 14 * * ?"    每天从下午2点开始到2:55分结束每5分钟一次触发 
    24 "0 0/5 14,18 * * ?"    每天的下午2点至2:55和6点至6点55分两个时间段内每5分钟一次触发 
    25 "0 0-5 14 * * ?"    每天14:00至14:05每分钟一次触发 
    26 "0 10,44 14 ? 3 WED"    三月的每周三的14:10和14:44触发 
    27 "0 15 10 ? * MON-FRI"    每个周一、周二、周三、周四、周五的10:15触发 

    四,两者对比

    精确度和功能 

    • Quartz可以通过cron表达式精确到特定时间执行,而TimerTask不能。
    • Quartz拥有TimerTask所有的功能,而TimerTask则没有。 

    任务类的数量 

    • Quartz每次执行都创建一个新的任务类对象。
    • TimerTask则每次使用同一个任务类对象。 

    对异常的处理

    • Quartz的某次执行任务过程中抛出异常,不影响下一次任务的执行,当下一次执行时间到来时,定时器会再次执行任务。
    • TimerTask不同,一旦某个任务在执行过程中抛出异常,则整个定时器生命周期就结束,以后永远不会再执行定时器任务。

    总结:还是第三方考虑的周全,东西比较多,加上Quartz配置简单,maven也就是多加一个jar包,所以一般情况下还是使用Quartz了。

  • 相关阅读:
    IOS模拟器
    Android Monkey 测试实例
    Android log分析
    Android压力测试-Monkey
    IOS 压力测试-UI AutoMonkey
    Appium
    在chrome下鼠标拖动层变文本形状的问题
    学习笔记:利用GDI+生成简单的验证码图片
    利用FileStream实现多媒体文件复制
    C#读取Excel文件:通过OleDb连接,把excel文件作为数据源来读取
  • 原文地址:https://www.cnblogs.com/huasky/p/9138562.html
Copyright © 2011-2022 走看看