Spring注解@Scheduled执行定时任务

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="com.abc.service.impl" />

使用的扫描注解方式来实现Spring的定时任务,并指定扫描的包路径

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

@Scheduled(cron = "0/10 * * * * ?")
public void a() {
    logger.info("定时任务a执行了...");
}

注: 定时任务不能有返回值;只能在注解了component类中使用定时任务。

上述代码的输出效果为(每隔10秒):

定时任务a执行了...
定时任务a执行了...
定时任务a执行了...
定时任务a执行了...

其中cron为表达式,即设置定时任务的执行时间或者是间隔的表达式。

⑤corn表达式

是用于在注解@Scheduled中设置定时任务执行方式的。

以下是网上摘抄的部分说明:

一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素。
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,当触发定时任务的时候进行判断,只识别集群中的一台机器执行定时任务。(具体详见后续博文)

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值