SpringBoot定时任务

1.使用注解的方式执行定时任务

首先需要在启动类中加上@EnableScheduling注解来开启定时任务。

在这里插入图片描述

接配置完后就可以使用定时任务了,注意要加上@Componet注解加载到spirng容器中例子如下:
@Component
public class dingshi {
    RestTemplate restTemplate = new RestTemplate();
    @Scheduled(fixedDelay = 30000)
    public void taskEndFissionWanted(){
        entityTest ent = new entityTest();
        ent.setEntryClass("FlinkTest");
        ent.setProgramArgs("{\"idList\":[1,2,3],\"startTime\":123456,\"endTime\":123456}");
        responseTest res = new responseTest();
        System.out.println(System.currentTimeMillis()+"开始执行");
        ResponseEntity<responseTest> responseTestResponseEntity = restTemplate.postForEntity("http://127.0.0.1:8081/jars/94fb0188-2155-4b90-aa20-92e244667b2d_flink-1.0-SNAPSHOT.jar/run", ent, responseTest.class);
  System.out.println(responseTestResponseEntity.getBody().getJobid());
    }
}
执行结果如图:

在这里插入图片描述

	上面的定时任务时每30秒钟执行一次逻辑代码,在spring中		@Scheduled有三种定时任务的执行方式。

2. @Scheduled有三种定时任务的执行方式,包括fixedDelay、fixedRate、corn表达式,下面就分别讲讲这三种执行方式的不同。

1.fixedDelay:指定两次任务执行的时间间隔(毫秒),此时间间隔指的是,前一次任务结束与下一个任务开始的间隔。如:@Scheduled(fixedDelay = 5*1000 ),表示第一个任务结束后,过5秒后,开始第二个任务。

2.fixedRate:指定两次任务执行的时间间隔(毫秒),此时间间隔指的是,前一个任务开始与下一个任务开始的间隔。如:@Scheduled(fixedRate= 5*1000 ),表示第一个任务开始后(第一个任务执行时间小于5秒),第一个任务开始后的第6秒,开始第二个任务。如果第一个任务执行时间大于5秒,第一个任务结束后,直接开始第二个任务。

fixedDelay与fixedRate差别可以查看图例区别:
fixedDelay非常好理解,它的间隔时间是根据上次的任务结束的时候开始计时的。比如一个方法上设置了fixedDelay=5*1000,那么当该方法某一次执行结束后,开始计算时间,当时间达到5秒,就开始再次执行该方法。
fixedRate理解起来比较麻烦,它的间隔时间是根据上次任务开始的时候计时的。比如当方法上设置了fiexdRate=5*1000,该执行该方法所花的时间是2秒,那么3秒后就会再次执行该方法。
但是这里有个坑,当任务执行时长超过设置的间隔时长,那会是什么结果呢。打个比方,比如一个任务本来只需要花2秒就能执行完成,我所设置的fixedRate=5*1000,但是因为网络问题导致这个任务花了7秒才执行完成。当任务开始时Spring就会给这个任务计时,5秒钟时候Spring就会再次调用这个任务,可是发现原来的任务还在执行,这个时候第二个任务就阻塞了(这里只考虑单线程的情况下,多线程后面再讲),甚至如果第一个任务花费的时间过长,还可能会使第三第四个任务被阻塞。被阻塞的任务就像排队的人一样,一旦前一个任务没了,它就立马执行。
通俗来讲,使用上厕所来举例,每个人的上厕所的等待时间规定为30s
	使用fixedDelay就是等到前一个人从厕所出来了,从这个人的结束时间开始,另一个人等待30s才进去,这个人进去了,下一个在门外等候。
	使用fixedRate就是前一个人进去的瞬间开始计时,如果这个人用了3秒就出来了,下一个人只用等27秒即可,如果这个人用的时间超过了30s,那么下一个人就可以直接推门进去了,看着前一个人上厕所,前一个人结束了,这个人马上就占用了厕所。如果这个人超过了60秒,那么会有两个人进来排队看这个人上厕所.如果这个人便秘,那么没过30s就会有一个人进来看望他。大概就是这个意思吧!

在这里插入图片描述

3.cron:使用表达是进行任务的执行,例如:@Scheduled(cron = "0/15 * * * * ? ")每隔15秒执行一次

cron一般是六个或七个字段,分别是:

1. Seconds (秒) 
2. Minutes (分) 
3. Hours (时) 
4. Day (每月的第几天,day-of-month) 
5. Month (月) 
6. Day (每周的第几天,day-of-week) 
7. Year (年 可选字段)
每隔字段的范围以及特殊字符

秒 :范围:0-59 
分 :范围:0-59
时 :范围:0-23
天(月) :范围:1-31,但要注意一些特别的月份2月份没有只能1-28,有些月份没有31
月 :用0-11 或用字符串 “JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV and DEC” 表示
天(周):用1-7表示(1 = 星期日)或用字符口串“SUN, MON, TUE, WED, THU, FRI and SAT”表示
年:范围:1970-2099
 
“/”:表示为“每”,如“0/10”表示每隔10分钟执行一次,“0”表示为从“0”分开始, “3/20”表示表示每隔20分钟执行一次
“?”:只用于月与周,表示不指定值
“L”:只用于月与周,5L用在月表示为每月的最后第五天天;1L用在周表示每周的最后一天;
“W”::表示有效工作日(周一到周五),只能出现在day-of-month,系统将在离指定日期的最近的有效工作日触发事件。例如:在 DayofMonth使用5W,如果5日是星期六,则将在最近的工作日:星期五,即4日触发。如果5日是星期天,则在6日(周一)触发;如果5日在星期一到星期五中的一天,则就在5日触发。另外一点,W的最近寻找不会跨过月份 
“#”:用于确定每个月第几个星期几,只能出现在DayofMonth域。例如在4#2,表示某月的第二个星期三。
“*” 代表整个时间段。
 
注意:每个元素可以是一个值(如6),一个连续区间(9-12),一个间隔时间(8-18/4)(/表示每隔4小时),一个列表(1,3,5),通配符。由于"月份中的日期"和"星期中的日期"这两个元素互斥的,必须要对其中一个设置‘?’
 
表达式实例(网上搜的,感觉例子都一样, = =):

0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
0 0/30 9-17 * * ?   朝九晚五工作时间内每半小时
0 0 12 ? * WED 表示每个星期三中午12点 
"0 0 12 * * ?" 每天中午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期间的每1分钟 
"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟 
"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟 
"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟 
"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44 
"0 15 10 ? * MON-FRI" 周一至周五的上午10:15 
"0 15 10 15 * ?" 每月15日上午10:15 
"0 15 10 L * ?" 每月最后一日的上午10:15 
"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15 
"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15 
"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15 

以上都是在单线程的情况下,能满足大部分的需求,但是如果是多线程的情况下,应该注意什么问题,还未进行研究,欢迎评论交流!!!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值