【Spring】@Scheduled 定时器注解使用

引言

@Scheduled 是用于在 Spring 框架中为方法配置定时任务的注解,它允许在一定的时间间隔或在特定的时间点运行一个方法,我们一般将该方法放在服务类中。


主要属性介绍

属性名称介绍
fixedRate以指定的毫秒数间隔连续执行方法。每次执行开始的时间都是固定的间隔时间。
示例:@Scheduled(fixedRate = 5000) 表示该方法每5秒执行一次
fixedDelay以指定的毫秒数间隔执行方法。方法执行完毕后,等待给定的延迟时间,然后开始下一次执行。
示例:@Scheduled(fixedDelay = 5000) 表示方法执行完毕后等待5秒,然后再执行下一次。
cron使用Cron表达式配置定时任务。Cron表达式可以非常灵活地指定任务的执行时间。
示例:@Scheduled(cron = “0 0 * * * ?”) 表示每天的整点执行一次该方法
initialDelay在系统初始延迟时间之后开始首次执行。
示例:@Scheduled(initialDelay = 2000, fixedRate = 5000) 在系统初始后,延迟2秒后开始,然后每5秒执行一次

cron 语法

简单介绍

Cron 表达式是一种由6到7个字段组成的字符串,每个字段代表时间的一个部分。这些字段以空格分隔,依次是:

秒(0-59)
分钟(0-59)
小时(0-23)
日期(1-31)
月份(1-12或JAN-DEC)
星期(1-7或SUN-SAT,周日为1)
年份(可选)

通常你会看到6个字段的Cron表达式(年份通常不使用)。每个字段中的值可以是数字、特殊符号或者范围表示。


特殊符号

*(星号):表示所有可能的值。如在分钟字段中使用,表示每分钟触发。
?(问号):仅在日期和星期字段中使用。表示不指定值,通常是因为在另一个字段中已经指定了条件。
-(连字符):表示一个范围。例如,1-5表示从1到5的范围。
,(逗号):表示列出多个值。例如,1,3,5表示1、3和5。
/(斜杠):表示步长。例如,0/15在秒字段中表示从0秒开始每15秒触发。
L:在日期字段中表示最后一天;在星期字段中表示最后一个星期几。例如,L在日期字段中表示该月的最后一天,在星期字段中表示周六。
W:表示工作日(星期一至五)。例如,15W表示离15号最近的工作日。
#:在星期字段中使用,表示一个特定的星期几。例如,2#3表示每月的第三个星期二


例子

每天早上9点执行一次

@Scheduled(cron = "0 0 9 * * ?")

每月的第一个星期一早上10点执行

@Scheduled(cron = "0 0 10 ? * 2#1")

每周三和周五下午2点执行

@Scheduled(cron = "0 0 14 ? * 3,5")

每隔10分钟执行一次

@Scheduled(cron = "0 */10 * * * ?")

每个月的最后一天晚上11点执行

@Scheduled(cron = "0 0 23 L * ?")

使用 @Scheduled 注解注意事项

线程安全

@Scheduled 注解的方法可能会被多个线程同时执行。如果方法不是线程安全的,可能导致数据竞争和其他并发问题。因此,在使用 @Scheduled 注解时,确保方法是线程安全的。


执行时间

如果定时任务的执行时间比间隔时间长,会导致方法重叠执行。根据需要调整 fixedRate 参数或 fixedDelay 参数。


配置

确保在 Spring 配置文件中启用了任务调度。通常在主应用类或配置类中使用 @EnableScheduling 注解。


异常处理

在定时任务中要注意异常处理,以免任务在发生错误时被中断。可以通过捕获和记录异常,或者重试失败任务来提高可靠性。





End


  • 19
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要实现对@Scheduled定时器的监控功能,可以通过以下步骤进行: 1. 自定义一个ScheduledAnnotationBeanPostProcessor类,继承Spring框架提供的ScheduledAnnotationBeanPostProcessor类,重写其postProcessAfterInitialization方法。 2. 在postProcessAfterInitialization方法中,获取所有被@Scheduled注解标注的方法,将其封装成一个ScheduledTask对象,并加入到一个ScheduledTaskRegistrar对象中进行管理。 3. ScheduledTaskRegistrar对象中可以通过调用addCronTask和addFixedDelayTask等方法,实现对定时任务的注册和管理。 4. 在ScheduledTaskRegistrar对象中添加一个TriggerListener,用于监听定时任务的执行情况,当定时任务执行出错时,可以通过该TriggerListener进行错误处理。 5. 在需要监控定时任务的地方,注入ScheduledTaskRegistrar对象,通过该对象可以获取到所有注册的定时任务,进而实现对定时任务的监控。 具体实现细节可以参考以下代码: ```java @Component public class ScheduledTaskMonitor extends ScheduledAnnotationBeanPostProcessor { private ScheduledTaskRegistrar taskRegistrar; @Autowired public void setTaskRegistrar(ScheduledTaskRegistrar taskRegistrar) { this.taskRegistrar = taskRegistrar; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { Object result = super.postProcessAfterInitialization(bean, beanName); if (result != null) { Method[] methods = result.getClass().getDeclaredMethods(); for (Method method : methods) { Scheduled scheduled = AnnotationUtils.findAnnotation(method, Scheduled.class); if (scheduled != null) { String cronExpression = scheduled.cron(); long fixedDelay = scheduled.fixedDelay(); long fixedRate = scheduled.fixedRate(); ScheduledTask scheduledTask = new ScheduledTask(result, method); if (!StringUtils.isEmpty(cronExpression)) { taskRegistrar.addCronTask(scheduledTask, cronExpression); } else if (fixedDelay > 0) { taskRegistrar.addFixedDelayTask(scheduledTask, fixedDelay); } else if (fixedRate > 0) { taskRegistrar.addFixedRateTask(scheduledTask, fixedRate); } } } } return result; } } ``` 在上述代码中,ScheduledTask类封装了一个被@Scheduled注解标注的方法,ScheduledTaskRegistrar类用于管理定时任务,TriggerListener用于监听定时任务的执行情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值