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了。

  • 相关阅读:
    366. Find Leaves of Binary Tree输出层数相同的叶子节点
    716. Max Stack实现一个最大stack
    515. Find Largest Value in Each Tree Row查找一行中的最大值
    364. Nested List Weight Sum II 大小反向的括号加权求和
    156. Binary Tree Upside Down反转二叉树
    698. Partition to K Equal Sum Subsets 数组分成和相同的k组
    244. Shortest Word Distance II 实现数组中的最短距离单词
    187. Repeated DNA Sequences重复的DNA子串序列
    java之hibernate之基于主键的双向一对一关联映射
    java之hibernate之基于主键的单向一对一关联映射
  • 原文地址:https://www.cnblogs.com/huasky/p/9138562.html
Copyright © 2011-2022 走看看