Spring定时任务配置

it2025-05-01  8

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

主要介绍: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

最新回复(0)