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


    首先,搭建好一个springboot项目,可使用maven或者gradle或者其他(MD不会啊。。。),这个因为本次的重点在于如何添加定时器,本人会在这几天有时间的时候来写一个如何搭建一个简单的springboot的项目的过程。现在时间有限,所以喽。还请各位多包涵。

    咳咳。好了 进入主题。

    方法一:通过springboot自带入口来开启定时器。

    首先我们都知道,springboot有一个自己的入口,也就是@SpringBootApplication(他是一个组合注解 由@Configuration,@EnableAutoConfiguration和@ComponentScan组成,好了好了。。。扯远了)。

    首先定时器需要有一个总开关,因为我可能要定时很多函数,如果我想全都暂时关上总不能一个一个把注解给删掉吧。所以我们需要先把总开关打开,也就是在springboot的入口处添加@EnableScheduling这个注解。上代码(此为springboot的入口)

    [html] view plain copy
     
    1. @SpringBootApplication  
    2. @EnableScheduling  
    3. public class DemoApplication {  
    4.   
    5.     public static void main(String[] args) {  
    6.         SpringApplication.run(DemoApplication.class, args);  
    7.     }  
    8. }  

    总开关添加好后,我们只需要对需要定时方法进行配置即可,使用注解@Scheduled(cron = "0/2 * * * * *") 后面为Cron表达式。表示每2秒执行一次。cron的具体语法我会一会贴在最后。

    [html] view plain copy
     
    1. @Scheduled(cron = "0/2 * * * * *")  
    2. public void timer(){  
    3.     //获取当前时间  
    4.     LocalDateTime localDateTime =LocalDateTime.now();  
    5.     System.out.println("当前时间为:" + localDateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")));  
    6. }  

    好了,大功告成。你会发现这个方法每两秒就会被运行一次(LocalDateTime是java1.8新出的特性,比之前的Date更加清晰且好用,推荐有兴趣的同学可以学习一下,入手很快)。

    [plain] view plain copy
     
    1. 当前时间为:2017-05-27 15:03:42  
    2. 当前时间为:2017-05-27 15:03:44  
    3. 当前时间为:2017-05-27 15:03:46  

    方法二:可能有的同学说,springboot我不喜欢加一堆乱七八糟的,我就要看着清晰、简洁。快活。OK 可以,有过基于xml开发经验的同学应该知道。使用定时器我只要在xml中做好配置,即可将我想要运行的方法按照我所配置的事件去运行,没错!但是springboot主张无xml,但是我们可以使用注解来让类变成xml,上代码。

    [html] view plain copy
     
    1. @Configuration          //证明这个类是一个配置文件  
    2. @EnableScheduling       //打开quartz定时器总开关  
    3. public class Timer {  
    4. }  

    OK 大功告成。(没了?  对。就这么简单。) 此做法和将@EnableScheduling这个注解写在springboot入口处的效果是一样的,两个写一个即可。接下来去配置你所要定时的方法即可。

    另外给大家mark一个小技巧。如果一般来说忘记了某个注解里面的key的名字的话。不一定要急着去百度。可以按住ctrl点进去看一下里面的方法名字即可,例如我忘记了@Scheduled中的cron是怎么拼写了。我可以点进去查看

    [html] view plain copy
     
    1. @Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})  
    2. @Retention(RetentionPolicy.RUNTIME)  
    3. @Documented  
    4. @Repeatable(Schedules.class)  
    5. public @interface Scheduled {  
    6.     String cron() default "";  
    7.   
    8.     String zone() default "";  
    9.   
    10.     long fixedDelay() default -1L;  
    11.   
    12.     String fixedDelayString() default "";  
    13.   
    14.     long fixedRate() default -1L;  
    15.   
    16.     String fixedRateString() default "";  
    17.   
    18.     long initialDelay() default -1L;  
    19.   
    20.     String initialDelayString() default "";  
    21. }  


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

    好了 最后 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触发

  • 相关阅读:
    集合中的3个经典练习题
    创建泛类集合List以及数组转集合,集合转数组的应用
    添加一个txt文件(例如在桌面),利用后台对文件写入内容
    File类的创建,删除文件
    集合中存放随机数的问题之解析
    集合中的类型转化 以及求集合中元素的最大值,平均值
    response.sendRedirect()使用注意事项
    request.getContextPath是为了解决相对路径的问题,可返回站点的根路径
    java中instanceof的用法
    getParameter 与 getAttribute的区别
  • 原文地址:https://www.cnblogs.com/dzcWeb/p/8270700.html
Copyright © 2020-2023  润新知