博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
SpringBoot定时任务
阅读量:3986 次
发布时间:2019-05-24

本文共 3758 字,大约阅读时间需要 12 分钟。

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

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

在这里插入图片描述

接配置完后就可以使用定时任务了,注意要加上@Componet注解加载到spirng容器中例子如下:
@Componentpublic 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
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

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

转载地址:http://baxui.baihongyu.com/

你可能感兴趣的文章
简单Linux C线程池
查看>>
内存池
查看>>
ALSA howto
查看>>
gpio matrix keypad linux driver
查看>>
Qt5 mouseless 测试
查看>>
qt5 mouseless 多种部件切换带焦点高亮显示
查看>>
udev和mdev hotplug事件
查看>>
And that’s what the lowest level of the Libevent API does for you
查看>>
webbench源码分析
查看>>
httpd源码分析
查看>>
192.168.1.1/24 什么含义
查看>>
输入设备节点自动生成
查看>>
dynamic generate command line parameters for qt embedded application
查看>>
opencv test code-1
查看>>
烟台地铁路线图 Yantai Subway
查看>>
eclipse 导入先前存在的项目
查看>>
GNU hello代码分析
查看>>
Qt继电器控制板代码
查看>>
imx6 项目的按键驱动程序
查看>>
busybox passwd修改密码
查看>>