卷前:参考自CSDN

Spring注解@Scheduled执行定时任务
项目的开发中往往需要设置定时任务,比如每天早上6点要及时推送一个消息,又比如每过一分钟要对系统当前用户的行为进行识别等等;在spring中提供了使用@Scheduled的注解形式来执行定时任务。

①在spring的配置文件中导入

xmlns:task="http://www.springframework.org/schema/task     xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
       http://www.springframework.org/schema/task
       http://www.springframework.org/schema/task/spring-task-3.1.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context-3.0.xsd">

②配置定时任务的线程池

<task:executor id="executor" pool-size="10"/>
<task:scheduler id="scheduler" pool-size="5"/>
<task:annotation-driven executor="executor" scheduler="scheduler" />开启task任务及其相关配置

③扫描任务配置

<context:annotation-config />
<context:component-scan base-package="cn.pcshao.service.imageTask" />

或者使用的注解方式

④为定时任务的方法加上注解

@Scheduled(cron = "0/30 * * * * ?")
public void doSomeTask() {
    logger.info("定时任务some执行");
    //定时任务不能有返回值;只能在注解了component类中使用定时任务
}

上述代码的输出效果每隔30秒:

定时任务some执行
定时任务some执行
定时任务some执行
定时任务some执行

⑤corn表达式

一个cron表达式有至少6个用空格分隔
corn表达式格式:
秒 分 时 日 月 周 年(可选)。
“?”字符:表示不确定的值
“,”字符:指定数个值
“-”字符:指定一个值的范围
“/”字符:指定一个值的增加幅度。n/m表示从n开始,每次增加m
“L”字符:用在日表示一个月中的最后一天,用在周表示该月最后一个星期X
“W”字符:指定离给定日期最近的工作日(周一到周五)
“#”字符:表示该月第几个周X。6#3表示该月第3个周五

例子:
每隔5秒执行一次:/5 * * * ?
每隔1分钟执行一次:0 /1 * * ?
每天23点执行一次:0 0 23 * * ?
每天凌晨1点执行一次:0 0 1 * * ?
每月1号凌晨1点执行一次:0 0 1 1 * ?
每月最后一天23点执行一次:0 0 23 L * ?
每周星期天凌晨1点实行一次:0 0 1 ? * L
在26分、29分、33分执行一次:0 26,29,33 * * * ?
每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 * * ?
每天的8点开始,2小时执行一次:0 0 8/2 * * ?

 

补充(思考来自互联网):如果在集群的环境下,这种定时任务应注意使用,因为多台机器会各自执行相同的定时任务。解决此问题的思想是:制定一台机器的ip,当触发定时任务的时候进行判断,只识别集群中的一台机器执行定时任务。