Fork me on GitHub

Scheduling Tasks

官方文档

https://spring.io/guides/gs/scheduling-tasks/

官方文档详细介绍了@Scheduled中fixedRate,fixedDelay,cron的用法

fixedRate代表调用频率,单位为ms,如果调用频率设为5000ms,那么当你第一次调用占用2秒时等待3秒会第二次调用,当你第二次调用占用5秒时结束会立马第三次调用。

fixedDelay代表间隔时间,单位为ms,即每次调用完成时间和下次调用都相隔5000ms。

Cron表达式

cron表达式,看官网文档

cron表达式有至少6个(也可能7个)有空格分隔的时间元素,按顺序依次为:

秒(0~59) 
分钟(0~59)
小时(0~23)
天(月)(0~31,但是你需要考虑你月的天数)
月(0~11)
天(星期)(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)
年份(1970-2099)

- 区间

* 通配符

? 你不想设置那个字段

每个元素可以是一个值(6),一个连续区间(9-12),一个间隔时间(8-18/4)(/表示每隔4小时),一个列表(1,3,5),通配符。

 表达式举例

"0 15 10 * * ?"    每天早上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 15 10 ? * MON-FRI"    每个周一、周二、周三、周四、周五的10:15触发
"0 0 10,14,16 * * ?"    每天上午10点,下午2点,4点
"0 0/30 9-17 * * ?"    朝九晚五工作时间内每半小时
"0 0 12 ? * WED"    表示每个星期三中午12点 
"0 15 10 15 * ?"    每月15日上午10:15触发 
"0 15 10 L * ?"    每月最后一日的上午10:15触发 
"0 15 10 ? * 6L"    每月的最后一个星期五上午10:15触发
"0 15 10 ? * 6#3"    每月的第三个星期五上午10:15触发

“?”字符仅被用于 天(月)和 天(星期)两个子表达式,表示不指定值。"月份中的天"和"星期中的天"这两个元素互斥的,必须要对其中一个设置?.
“L” 字符仅被用于天(月)和天(星期)两个子表达式,它是单词“last”的缩写

在天(月)子表达式中,“L”表示一个月的最后一天;在天(星期)自表达式中,“L”表示一个星期的最后一天,也就是SAT。

fixedDelay验证

情况一,程序执行时间小于延迟时间

设置延迟5秒时,执行时间为3秒

    @Scheduled(fixedDelay=5000)
    public void execute() throws InterruptedException {
            System.out.println("调用时间"+CommonTool.getNowDateStr());
            Thread.sleep(3000);
    }

发现两次开始调用时间为8秒刚好为执行时间+等待时间

情况二,程序执行时间大于延迟时间

设置延迟5秒,并且方法调用时间为6秒时

    @Scheduled(fixedDelay=5000)
    public void execute() throws InterruptedException {
            System.out.println("调用时间"+CommonTool.getNowDateStr());
            Thread.sleep(6000);
    }

发现间隙为11,也为执行时间+等待时间

fixedRate验证

情况一,程序执行时间小于延迟时间

设置延迟5秒时,执行时间为3秒

发现间隔时间即为5秒 

情况二,程序执行时间大于延迟时间

设置延迟5秒,并且方法调用时间为6秒时

发现调用间隔为6秒,由此可见是单线程运行。

定时任务立即执行

@Scheduled(cron="* * * * * *")
        Thread.sleep(24*3600*1000);

多个定时器同一时间触发只有一个执行

schedule是单线程的,阻塞的,所以千万不要长时间睡眠,会影响队列里其他schedule的执行。如果想多个schedule同时进行可以在xm里面配置线程池

 

posted @ 2019-10-24 11:07  秋夜雨巷  阅读(332)  评论(0编辑  收藏  举报