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

原文地址:https://www.cnblogs.com/huasky/p/9138562.html