Spring框架的@Scheduled
注解是一种用于简化定时任务实现的机制。使用@Scheduled
注解,可以很容易地在Spring管理的Bean中创建一个简单的定时任务,而无需深入了解底层的定时任务实现细节。
代码示例如下:任务每隔秒执行一次
@Component
public class job {
static int num=1;
@Scheduled(fixedRate = 1000L)
public void scheduleTime(){
System.out.println("每隔1秒执行一次,现在是第"+num+"次");
num+=1;
}
}
@Scheduled源码以及各熟悉的解释如下:
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Schedules.class)
@Reflective
public @interface Scheduled {
//CRON_DISABLED: 一个常量,表示cron表达式被禁用。如果cron属性设置为这个值,那么基于cron表达式的调度将不会被使用。
String CRON_DISABLED = "-";
//cron(): 定义一个cron表达式,用于复杂的时间设置。cron表达式是一种字符串,用于表达时间和日期的重复模式。
String cron() default "";
//zone(): 定义任务执行的时区。如果不设置,默认使用服务器的默认时区。
String zone() default "";
//fixedDelay(): 指定在任务成功执行完毕后,等待多长时间再执行下一次。如果设置为-1L,则不使用这个属性。
long fixedDelay() default -1L;
//fixedDelayString(): 与fixedDelay()相同,但允许你以字符串形式提供值,可以更容易地在配置文件中设置。
String fixedDelayString() default "";
//fixedRate(): 指定任务应该多久执行一次。如果设置为-1L,则不使用这个属性。
long fixedRate() default -1L;
//fixedRateString(): 与fixedRate()相同,但允许以字符串形式提供值。
String fixedRateString() default "";
//initialDelay(): 指定任务开始执行前的延迟时间(以毫秒为单位)。如果设置为-1L,则立即执行。
long initialDelay() default -1L;
//initialDelayString(): 与initialDelay()相同,但允许以字符串形式提供值。
String initialDelayString() default "";
//timeUnit(): 定义fixedDelay()和fixedRate()属性的时间单位,默认是毫秒
TimeUnit timeUnit() default TimeUnit.MILLISECONDS;
//scheduler(): 指定用于任务的调度器Bean的名称。如果留空,Spring将使用默认的调度器。
String scheduler() default "";
}
常用的属性有:cron(设置固定时间执行),fixedRate(每隔多久执行一次)。
在业务中cron的使用场景较多,比如每日签到(即每天凌晨刷新一次状态),
cron表达式的格式是固定的,包含七个可选字段,分别表示:
- 秒
- 分钟
- 小时
- 日期
- 月份
- 星期中的日期(1-7),1代表星期天
- 年份(可选字段,因为大多数实现不支持)
简单代码示例如下:
/**
* 0 第一个字段表示秒,这里设置为0,意味着在每分钟的第0秒触发。
* 0 第二个字段表示分钟,这里设置为0,意味着在每小时的第0分钟触发。
* 1 第三个字段表示小时,这里设置为0,意味着在凌晨0点触发。
* * 第四个字段表示月份中的日期,星号(*)表示每天。
* * 第五个字段表示月份,星号(*)表示每个月。
* ? 第六个字段表示星期几,问号(?)表示不指定具体星期几。
*/
@Scheduled(cron = "0 0 0 * * ?")
public void updateState(){
//方法体 ******
}