ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Spring定时任务

Spring定时任务 Spring定时任务(一)SpringTask使用背景在日常开发中经常会用到任务调度这类程序。实现方法常用的有A. 通过java.util.Timer、TimerTask实现。 B.通过Spring自带的SpringTask。 C. 通过Spring结合Quartz实现。本文我们将讲述SpringTask的使用入门方法。一、配置A. 引入SpringTask命名空间B. 开启Spring注解扫描 将Bean的创建交由Spring进行管理。用于创建Scheduler声明 context:component-scan base-package“com.unben.scheduler” / C. 开启SpringTask注解驱动。作用识别Task相关注解如“Scheduled” task:annotation-driven/ D. 创建TreadPoolTaskScheduler实例并指定该线程池初始大小。 task:scheduler id“taskScheduler” pool-size“5” / E. SpringTask的触发器实现方案有两种 一种是基于Cron表达式的CronTrigger触发器 另一种是基于接受固定周期的PeriodicTrigger触发器。在接下来的步骤二、三中我们将分别讲述两种触发器的使用方法二、 接受固定周期的PeriodicTrigger触发器案例1案例2配置详解ref任务调度工作类method工作类中具体执行的哪个方法initial-delay初次调度执行前延时时长。单位毫秒fixed-delay上一次调度完成后延时多少时间进行下一次调用。单位毫秒fixed-rate上一次调用开始后延时多少时间进行下一次调用。不等待上一次调度完成单位毫秒。三、基于Cron表达式的CronTrigger触发器案例3案例4配置说明Cron语法格式Seconds Minutes Hours DayofMonth Month DayofWeek。如上案例表示每隔多少秒钟执行一次。关于的Cron表达式如下。### cron表达式详解一、 语法Cron表达式是一个字符串从Spring4.x版本后不再进行年份的支持。该字符串以5个空格隔开分为6个域每一个域代表一个含义。语法如下seconds minutes hours daysOfMonth months daysOfWeek有兴趣的同学可以参考Cron表达式解析类org.springframework.scheduling.support.CronSequenceGenerator二、pattern每隔域说明字段名 含义 允许的值 允许的特殊字符 seconds 秒 0-59 , - * / minutes 分 0-59 , - * / hours 小时 0-23 , - * / daysOfMonth 日 1-31 , - * ? / L W C months 月 1-12 or JAN-DEC , - * / daysOfWeek 周几 1-7 or SUN-SAT , - * ? / L C #三、特殊字符说明* 可用在所有字段中表示对应时间域的每一个时刻例如*在分钟字段时表示“每分钟” 只能用在DayofMonth和DayofWeek两个域。它也匹配域的任意值但实际不会。因为DayofMonth和 DayofWeek会相互影响。例如想在每月的20日触发调度不管20日到底是星期几则只能使用如下写法 13 13 15 20 * , 其中最后一位只能用而不能使用*如果使用*表示不管星期几都会触发实际上并不是这样- 表达一个范围如在小时字段中使用“10-12”则表示从10到12点即10,11,12, 表达一个列表值如在星期字段中使用“MON,WED,FRI”则表示星期一星期三和星期五/ x/y表达一个等步长序列x为起始值y为增量步长值。如在分钟字段中使用0/15则表示为0,15,30和45秒而5/15在分钟字段中表示5,20,35,50你也可以使用*/y它等同于0/yL: 该字符只在日期和星期字段中使用代表“Last”的意思但它在两个字段中意思不同。L在日期字段中表示这个月份的最后一天如一月的31号非闰年二月的28号如果L用在星期中则表示星期六等同于7。但是如果L出现在星期字段里而且在前面有一个数值 X则表示“这个月的最后X天”例如6L表示该月的最后星期五W: 该字符只能出现在日期字段里是对前导日期的修饰表示离该日期最近的工作日。例如15W表示离该月15号最近的工作日如果该月15号是星期六则匹配14号星期五如果15日是星期日则匹配16号星期一如果15号是星期二那结果就是15号星期二。但必须注意关联的匹配日期不能够跨月如你指定1W如果1号是星期六结果匹配的是3号星期一而非上个月最后的那天。W字符串只能指定单一日期而不能指定日期范围LW组合在日期字段可以组合使用LW它的意思是当月的最后一个工作日#该字符只能在星期字段中使用表示当月某个工作日。如6#3表示当月的第三个星期五(6表示星期五#3表示当前的第三个)而4#5表示当月的第五个星期三假设当月没有第五个星期三忽略不触发C该字符只在日期和星期字段中使用代表“Calendar”的意思。它的意思是计划所关联的日期如果日期没有被关联则相当于日历中所有日期。例如5C在日期字段中就相当于日历5日以后的第一天。1C在星期字段中相当于星期日后的第一天。四、使用案例0 0 10,14,16 * * 每天上午10点下午2点4点 0 0/30 9-17 * * 朝九晚五工作时间内每半小时 0 0 12 * WED 表示每个星期三中午12点 “0 0 12 * * ” 每天中午12点触发 “0 15 10 * *” 每天上午10:15触发 “0 15 10 * * ” 每天上午10:15触发 “0 15 10 * * *” 每天上午10:15触发 “0 * 14 * * ” 在每天下午2点到下午2:59期间的每1分钟触发 “0 0/5 14 * * ” 在每天下午2点到下午2:55期间的每5分钟触发 “0 0/5 14,18 * * ” 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发 “0 0-5 14 * * ” 在每天下午2点到下午2:05期间的每1分钟触发 “0 10,44 14 3 WED” 每年三月的星期三的下午2:10和2:44触发 “0 15 10 * MON-FRI” 周一至周五的上午10:15触发 “0 15 10 15 * ” 每月15日上午10:15触发 “0 15 10 L * ” 每月最后一日的上午10:15触发 “0 15 10 * 6L” 每月的最后一个星期五上午10:15触发 “0 15 10 * 6#3” 每月的第三个星期五上午10:15触发
返回列表