关于给springboot添加定时器的两种方式

springboot技术学习 https://www.itkc8.com

简单两步,实现在spring boot中配置和使用定时器:

1、在入口类中加入@EnableScheduling注解:

 

[java] view plain copy

  1. @SpringBootApplication  
  2. @EnableScheduling  
  3. public class MySpringBootApplication {  
  4.     private static Logger logger = LoggerFactory.getLogger(MySpringBootApplication.class);  
  5.       
  6.     public static void main(String[] args) {  
  7.         SpringApplication.run(MySpringBootApplication.class, args);  
  8.         logger.info("My Spring Boot Application Started");  
  9.     }  
  10. }  


2、创建定时器类,类中的方法注解了@Scheduled就是一个定时器:

 

 

[java] view plain copy

  1. @Component  
  2. public class Scheduler {  
  3.     private final Logger logger = LoggerFactory.getLogger(this.getClass());  
  4.       
  5.     @Scheduled(cron="0 0/1 * * * ?"//每分钟执行一次  
  6.     public void statusCheck() {      
  7.         logger.info("每分钟执行一次。开始……");  
  8.         //statusTask.healthCheck();  
  9.         logger.info("每分钟执行一次。结束。");  
  10.     }    
  11.   
  12.     @Scheduled(fixedRate=20000)  
  13.     public void testTasks() {      
  14.         logger.info("每20秒执行一次。开始……");  
  15.         //statusTask.healthCheck();  
  16.         logger.info("每20秒执行一次。结束。");  
  17.     }    
  18. }  

 

启动项目,验证结果:

 

[plain] view plain copy

  1. 2016-07-19 14:51:57,049:INFO pool-2-thread-1 (Scheduler.java:28) - 每20秒执行一次。开始……  
  2. 2016-07-19 14:51:57,049:INFO pool-2-thread-1 (Scheduler.java:31) - 每20秒执行一次。结束。  
  3. 2016-07-19 14:52:00,002:INFO pool-2-thread-1 (Scheduler.java:19) - 每分钟执行一次。开始……  
  4. 2016-07-19 14:52:00,002:INFO pool-2-thread-1 (Scheduler.java:22) - 每分钟执行一次。结束。  
  5. 2016-07-19 14:52:17,049:INFO pool-2-thread-1 (Scheduler.java:28) - 每20秒执行一次。开始……  
  6. 2016-07-19 14:52:17,049:INFO pool-2-thread-1 (Scheduler.java:31) - 每20秒执行一次。结束。  
  7. 2016-07-19 14:52:37,049:INFO pool-2-thread-1 (Scheduler.java:28) - 每20秒执行一次。开始……  
  8. 2016-07-19 14:52:37,049:INFO pool-2-thread-1 (Scheduler.java:31) - 每20秒执行一次。结束。  
  9. 2016-07-19 14:52:57,049:INFO pool-2-thread-1 (Scheduler.java:28) - 每20秒执行一次。开始……  
  10. 2016-07-19 14:52:57,049:INFO pool-2-thread-1 (Scheduler.java:31) - 每20秒执行一次。结束。  
  11. 2016-07-19 14:53:00,002:INFO pool-2-thread-1 (Scheduler.java:19) - 每分钟执行一次。开始……  
  12. 2016-07-19 14:53:00,002:INFO pool-2-thread-1 (Scheduler.java:22) - 每分钟执行一次。结束。  
  13. 2016-07-19 14:53:17,049:INFO pool-2-thread-1 (Scheduler.java:28) - 每20秒执行一次。开始……  
  14. 2016-07-19 14:53:17,049:INFO pool-2-thread-1 (Scheduler.java:31) - 每20秒执行一次。结束。  


关于@Scheduled注解中参数的使用,以及cron的定义,请参考:http://blog.csdn.net/ClementAD/article/details/42042111

 

源代码参考:https://github.com/xujijun/my-spring-boot

 

 

SpringBoot配置定时任务可以直接使用自带的Scheduled,这相当于一个轻量级的Quartz,它可以让我们直接使用注解来完成定时任务的配置。

 

**

@Configuration
@EnableScheduling
public class SchedulingConfig {
    private final Logger logger = LoggerFactory.getLogger(getClass());

    @Resource 
    private RobotRestServiceImpl robotRestService;

    @Scheduled(cron = "0 0/10 * * * ?") // 每10分钟执行一次
    public void getToken() {
        logger.info("getToken定时任务启动");
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 说明

    类上带有@Configuration的类,等同于spring的XML配置文件,好处是使用Java代码可以检查类型安全。通常还会搭配其他注解来实现不同的需求,如本例中,搭配的@EnableScheduling。

    在spring-boot中需要在类上添加@EnableScheduling注解来开启对计划任务的支持。

    在开启对计划任务的支持后,需要@Scheduled注解的配合。@Scheduled是方法上注解,添加该注解的方法即为单个计划任务。@Scheduled注解定义了计划任务的执行计划,有两种方式可以定义: 
    1.@Scheduled(fixedRate = 5000) //通过@Scheduled声明该方法是计划任务,使用fixedRate属性每隔固定时间5秒执行一次 
    2.@Scheduled(cron = “0 0/10 * * * ?”) //使用cron属性可按照指定时间执行,本例指的是每10分钟执行一次;

很快就能找到对应的拼写,不需要去百度,万一当时没网呢是不是。

 

好了 最后 cron的表达式如下(百度的= =勿喷)

 

●星号(*):可用在所有字段中,表示对应时间域的每一个时刻,例如,*在分钟字段时,表示“每分钟”;

●问号(?):该字符只在日期和星期字段中使用,它通常指定为“无意义的值”,相当于点位符;

●减号(-):表达一个范围,如在小时字段中使用“10-12”,则表示从10到12点,即10,11,12;

●逗号(,):表达一个列表值,如在星期字段中使用“MON,WED,FRI”,则表示星期一,星期三和星期五;

●斜杠(/):x/y表达一个等步长序列,x为起始值,y为增量步长值。如在分钟字段中使用0/15,则表示为0,15,30和45秒,而5/15在分钟字段中表示5,20,35,50,你也可以使用*/y,它等同于0/y;

●L:该字符只在日期和星期字段中使用,代表“Last”的意思,但它在两个字段中意思不同。L在日期字段中,表示这个月份的最后一天,如一月的31号,非闰年二月的28号;如果L用在星期中,则表示星期六,等同于7。但是,如果L出现在星期字段里,而且在前面有一个数值X,则表示“这个月的最后X天”,例如,6L表示该月的最后星期五;

●W:该字符只能出现在日期字段里,是对前导日期的修饰,表示离该日期最近的工作日。例如15W表示离该月15号最近的工作日,如果该月15号是星期六,则匹配14号星期五;如果15日是星期日,则匹配16号星期一;如果15号是星期二,那结果就是15号星期二。但必须注意关联的匹配日期不能够跨月,如你指定1W,如果1号是星期六,结果匹配的是3号星期一,而非上个月最后的那天。W字符串只能指定单一日期,而不能指定日期范围;

●LW组合:在日期字段可以组合使用LW,它的意思是当月的最后一个工作日;

●井号(#):该字符只能在星期字段中使用,表示当月某个工作日。如6#3表示当月的第三个星期五(6表示星期五,#3表示当前的第三个),而4#5表示当月的第五个星期三,假设当月没有第五个星期三,忽略不触发;

● C:该字符只在日期和星期字段中使用,代表“Calendar”的意思。它的意思是计划所关联的日期,如果日期没有被关联,则相当于日历中所有日期。例如5C在日期字段中就相当于日历5日以后的第一天。1C在星期字段中相当于星期日后的第一天。

Cron表达式对特殊字符的大小写不敏感,对代表星期的缩写英文大小写也不敏感。

表2下面给出一些完整的Cron表示式的实例:
 CRON表达式    含义 
"0 0 12 * * ?"    每天中午十二点触发 
"0 15 10 ? * *"    每天早上10:15触发 
"0 15 10 * * ?"    每天早上10:15触发 
"0 15 10 * * ? *"    每天早上10:15触发 
"0 15 10 * * ? 2005"    2005年的每天早上10:15触发 
"0 * 14 * * ?"    每天从下午2点开始到2点59分每分钟一次触发 
"0 0/5 14 * * ?"    每天从下午2点开始到2:55分结束每5分钟一次触发 
"0 0/5 14,18 * * ?"    每天的下午2点至2:55和6点至6点55分两个时间段内每5分钟一次触发 
"0 0-5 14 * * ?"    每天14:00至14:05每分钟一次触发 
"0 10,44 14 ? 3 WED"    三月的每周三的14:10和14:44触发 
"0 15 10 ? * MON-FRI"    每个周一、周二、周三、周四、周五的10:15触发

springboot技术学习 https://www.itkc8.com

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值