一、这是springboot中配置静态定时任务的注解

1. 在启动类上面加上 @EnableScheduling 注解开启定时任务

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;@SpringBootApplication
@EnableScheduling
public class App {public static void main(String[] args) {SpringApplication.run(App.class, args);}
}

2. 开启单个定时任务

在定时任务方法上加上@Scheduled注解
org.springframework.scheduling.annotation.Scheduled

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;/*** 测试定时任务** @author √Angelの爱灬* @date 2020/3/13*/
@Component
public class TestTask {@Scheduled(cron="0 25 15 * * ? ")public void testScheduledCron(){// TODO: 执行定时任务 }}

单个定时任务的弊端:不可以准确地控制定时
比如:我想在每天的凌晨1:30,上午8:40,中午12:00,晚上18:34执行一次,单个定时任务就实现不了了,只能 1:30、8:30、12:30、18:30执行

3. 开启多个定时任务

在定时任务方法上加上@Schedules注解
org.springframework.scheduling.annotation.Schedules

 @Schedules({@Scheduled(cron="25 43 15 * * ? "),@Scheduled(cron="10 43 15 * * ? "),@Scheduled(cron="40 43 15 * * ? "),})public void execute(){//do something}

这样就可以非常准确地执行定时任务了

4. 拓展:@Scheduled的参数

(1):cron:

[秒] [分] [小时] [日] [月] [周] [年]
@Scheduled(cron = "*/5 * * * * ?")
public void test(){}

每隔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 * * ?

  • *:表示所有值。 例如:在分的字段上设置 *,表示每一分钟都会触发。
  • ?:表示不指定值。使用的场景为不需要关心当前设置这个字段的值。例如:要在每月的10号触发一个操作,但不关心是周几,所以需要周位置的那个字段设置为”?” 具体设置为 0 0 0 10 * ?
  • -:表示区间。例如 在小时上设置 “10-12”,表示 10,11,12点都会触发。
  • ,: 表示指定多个值,例如在周字段上设置 “MON,WED,FRI” 表示周一,周三和周五触发
  • /:用于递增触发。如在秒上面设置”5/15” 表示从5秒开始,每增15秒触发(5,20,35,50)。 在月字段上设置’1/3’所示每月1号开始,每隔三天触发一次。

通配符说明可以去查询相关资料

cron还支持占位符:

@Scheduled(cron = "${time.cron}")
public void test(){}

(2) fixedDelay:上一次执行完毕时间点之后多长时间再执行。

@Scheduled(fixedDelay = 5000) //上一次执行完毕时间点之后5秒再执行
public void test(){}

(3) fixedDelayString:与 fixedDelay 意思相同,只是使用字符串的形式。唯一不同的是支持占位符。

@Scheduled(fixedDelayString = "5000") //上一次执行完毕时间点之后5秒再执行
public void test(){}
@Scheduled(fixedDelayString = "${time.fixedDelayString}") //上一次执行完毕时间点之后5秒再执行
public void test(){}

(4) fixedRate:上一次开始执行时间点之后多长时间再执行。

@Scheduled(fixedRate = 5000) //上一次开始执行时间点之后5秒再执行
public void test(){}

(5) fixedRateString:与 fixedRate 意思相同,只是使用字符串的形式。唯一不同的是支持占位符。

@Scheduled(fixedRateString = "${time.fixedRateString}") //上一次开始执行时间点之后5秒再执行
public void test(){}

(6) initialDelay:第一次延迟多长时间后再执行。

@Scheduled(initialDelay = 1000, fixedRate = 5000) //第一次延迟1秒后执行,之后按fixedRate的规则每5秒执行一次
public void test(){}

(6) initialDelayString:与 initialDelay 意思相同,只是使用字符串的形式。唯一不同的是支持占位符。

@Scheduled(initialDelayString = "${time.initialDelayString}", fixedRate = 5000) //第一次延迟1秒后执行,之后按fixedRate的规则每5秒执行一次
public void test(){}

@Scheduled总结

5. 结合nacos动态配置使用

这里的动态配置不是动态配置定时任务执行时间,@Scheduled 定时的时间不能动态的改变

在项目中,我们可能需要在nacos中配置一些信息并且动态刷新,通过定时任务来获取到这些值,做一些与该值相关的操作,但是刷新后却发现定时任务不再执行,代码如下:

配置前:nacos

test:name: 张三

配置后:nacos

test:name: 李四

java代码:

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;/*** 测试定时任务** @author √Angelの爱灬* @date 2021/12/27*/
@Component
@Data
@RefreshScope
public class TestTask {@Value("${test.name}")private String name;@Scheduled(cron = "*/5 * * * * ?")public void testScheduledCron(){System.out.println("当前时间: " + System.currentTimeMillis());System.out.println(name);}}

控制台输出:


此时定时任务却不再执行了

经查阅,nacos中配置修改后,获取该配置的类变成了懒加载模式,即调用时才会加载,所以定时任务不再执行

解决办法:

1. 添加配置类:
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.stereotype.Component;/*** 定时任务配置类** @author √Angelの爱灬* @date 2021/12/27*/
@Data
@Component
@RefreshScope
public class TestTaskConfig {@Value("${test.name:}")private String name;}
2. 通过配置类获取该配置的值
import com.shop.manager.task.TestTaskConfig;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;import javax.annotation.Resource;/*** 测试定时任务** @author √Angelの爱灬* @date 2021/12/27*/
@Component
public class TestTask {@Resourceprivate TestTaskConfig taskConfig;@Scheduled(cron = "*/5 * * * * ?")public void testScheduledCron(){System.out.println("当前时间: " + System.currentTimeMillis());System.out.println(taskConfig.getName());}}

这时再动态刷新配置中的值就可以正常的执行了

定时任务——@Scheduled注解做定时任务相关推荐

  1. Spring定时任务@Scheduled注解使用配置方式(cron表达式、fixedRate和fixedDelay)

    Spring定时任务@Scheduled注解使用配置方式(cron表达式.fixedRate和fixedDelay) 序言: 个人推荐一个很方便的在线Cron生成器(网页版):https://qqe2 ...

  2. scheduled java_java使用@Scheduled注解执行定时任务

    前言 在写项目的时候经常需要特定的时间做一些特定的操作,尤其是游戏服务器,维护线程之类的,这时候就需要用到定时器. 如果此时你刚好用的是spring的话,哪么@scheduled注解是非常好用的. 使 ...

  3. Spring 的@Scheduled注解实现定时任务运行和调度

    Spring 的@Scheduled注解实现定时任务运行和调度 首先要配置我们的spring.xml   ---  即spring的主配置文件(有的项目中叫做applicationContext.xm ...

  4. scheduled每天下午1点执行一次_在Spring Boot项目中使用@Scheduled注解实现定时任务...

    在java开发中定时任务的实现有多种方式,jdk有自己的定时任务实现方式,很多框架也有定时任务的实现方式.这里,我介绍一种很简单的实现方式,在Spring Boot项目中使用两个注解即可实现. 在sp ...

  5. Spring的@Scheduled注解实现定时任务

    Spring的@Scheduled注解实现定时任务 [简介篇] 项目经常会用到定时任务,实现定时任务的方式有很多种.在Spring框架中,实现定时任务很简单,常用的实现方式是使用注解@Schedule ...

  6. java @Scheduled注解执行定时任务

    使用spring @Scheduled注解执行定时任务: @Scheduled(cron = "0 0 2 * * ?") //每天凌晨2点@RequestMapping(&quo ...

  7. SpringBoot定时任务@Scheduled注解详解

    SpringBoot定时任务@Scheduled注解详解 项目开发中,经常会遇到定时任务的场景,Spring提供了@Scheduled注解,方便进行定时任务的开发 概述 要使用@Scheduled注解 ...

  8. @Scheduled注解实现定时任务

    @Scheduled注解实现定时任务 开启定时任务 配置定时任务 cron 表达式格式 通配符含义 开启定时任务 使用 @Scheduled 非常容易,直接创建一个 Spring Boot 项目,并且 ...

  9. java scheduled_怎么在java中利用@Scheduled注解执行定时任务

    怎么在java中利用@Scheduled注解执行定时任务 发布时间:2021-01-13 16:52:56 来源:亿速云 阅读:84 作者:Leah 本篇文章给大家分享的是有关怎么在java中利用@S ...

最新文章

  1. 对象的notify方法的含义和对象锁释放的三种情况
  2. uart与usart区别
  3. formdata.append加多个值_呆哥数学每日一题 —— 多个最值函数混合向量
  4. C语言 学生管理系统
  5. 如何让智能客服成为企业的生产力工具?
  6. python循环结束执行后面代码_计算机程序中某种代码的反复执行,称为________。Python中的循环有重复一定次数的________,也有重复到某种情况结束的________。...
  7. 【OS学习笔记】二十二 保护模式六:保户模式下操作系统内核如何加载用户程序并运行 对应的汇编代码之用户程序
  8. 从今天起,开始等待中信世界杯信用卡
  9. FinalShell SSH工具下载
  10. 工作工资不高,很普通的一个我
  11. 使用hessian+protocol buffer+easyUI综合案例--登陆
  12. Python工具——tqdm:进度条
  13. 基于单片机的表决器(七人)系统设计(#0496)
  14. 工业交换机在智能交通电子警察系统解决方案的应用
  15. java整数最大_Java 整数最大值
  16. 教你如何用ps制作紫色光斑效果
  17. 哪个ppt模板网站好
  18. 【文献翻译】Select-Storage: A New Oracle Design Pattern on Blockchain
  19. slxrom+v.21+原生android+4.2,小米MIX2S 魔趣OS 安卓9 MagiskV21版 完美ROOT 纯净完美 原生极简 纯净推荐...
  20. 使用 SVG 实现圆环日期选择器

热门文章

  1. python利用有道翻译做一个实时翻译软件
  2. 网易免费企业邮箱配置客户端
  3. 涅槃重生,字节人力荐大型分布式手册,凤凰架构让你浴火成神
  4. Day3 4月29日
  5. python plot画简单的曲线图
  6. VB.net学习笔记(六)VB.net的对象
  7. 手持弹幕android制作,手持弹幕神器
  8. K8S:Volume
  9. MIDI 文件格式 (转)
  10. STM32——时钟系统RCC详细介绍