使用说明
说明:Spring的原生Task定时任务 只支持6位的Corn表达式且相关方法不得有入参。所以在时间单位上不支持”年“的,仅支持:秒 分 时 日 月 周
SpringTask定时任务是默认单线程的!所以一旦有某一个定时任务阻塞,那么其他的定时任务将不会执行。我们需要配置一下原生任务的线程池,这样就不会或减少任务受到单线程的影响了。
SpringTask定时任务不适用于多集群部署,因为集群间无法共享任务,比如定时给张三背包发送1千万游戏币,10台服务,就会发送10次任务,所以使用有局限性,最好使用第三方定时任务框架如XXX-JOB等。
即便配置了多线程,SpringTask也不是完全解决了多任务的执行问题。配置任务线程池是处理任务类型时使用的。如果每分钟执行一次的任务A,单本次任务没执行完毕,下一分钟的任务A就不会执行,相当于跳过了。
如果需要指定异步线程池 请参考:https://www.zanglikun.com/8723.html 不过,使用了异步线程池的任务,也一样会发生跳任务的情况发生,而且指定的异步任务,也会发生指定的线程池的线程抢不过默认的Task线程池的情况的!不过只要有线程干活,其他也就无所谓了。下文代码可参考:
// 请自己配置一个线程池!指定name为asyncServiceExecutor,或参考https://www.zanglikun.com/8723.html
@SneakyThrows
@Async("asyncServiceExecutor")
@Scheduled(cron = "0/1 * * * * ? ")
public void hell1(){
Thread.sleep(5_000);
System.out.println(Thread.currentThread().getName()+" A执行了 "+new DateTime().toString());
}
@SneakyThrows
@Async("asyncServiceExecutor")
@Scheduled(cron = "0/1 * * * * ? ")
public void hell2(){
Thread.sleep(5_000);
System.out.println(Thread.currentThread().getName()+" B执行了 "+new DateTime().toString());
}
注意:Springboot 在周的表达上与常规的corn表达式不合适
建议指定周几使用:SUN, MON, TUE, WED, THU, FRI, SAT 代替数字!
如果你是周日执行,常规的Corn表达式周末是1,但是生效的是0
同时:测试的时候,需要提前修改日期。Jrebel似乎不起作用,测试请自己主动重启服务。
正文:操作步骤
1、启动类里面使用@EnableScheduling 注解开启功能,自动扫描
# 启动类上的注解
@EnableScheduling
2、配置任务多线程异步
你可以在启动类上添加,也可以自己配置
// SpringTask定时器的配置
@Bean
public TaskScheduler taskScheduler() {
ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
taskScheduler.setPoolSize(15);
// 任务线程的前缀名
taskScheduler.setThreadNamePrefix("SpringTask-");
// 线程池关闭时等待所有任务完成
taskScheduler.setWaitForTasksToCompleteOnShutdown(true);
taskScheduler.initialize();
return taskScheduler;
}
3、在要设置定时任务的方法上添加注解,并指定cron表达式即可
# 方法上的 注解
@Scheduled(cron = "0 0 0-2 * * ?")
定时任务这初级代码就完成了。
Corn表达式不会写,直接下面,鼠标点点就能生成
Corn表达式在线生成:https://www.bejson.com/othertools/cron/ 如果失效了,直接百度搜索 ”corn在线生成“ 即可
Corn表达式实战
单位:秒 分 时 日 月 周 年
序号:1 2 3 4 5 6 7
注意:
周的内容是 周日是1 周一是2 ... 周六是7
? 只能用在日和周上面 大意是:不指定的意思。因为“日”有2个属性,月的日号 与 周的周号
* 表示任意时间
- 表示区间 如果在分的单位上为 1-10 那么表示在1分、2分...10分种内都会执行
, 表示或者 如果在分的单位上为 1,10 那么表示在1分、10分钟的时候执行
空格 表示单位间隔 秒后面跟一个空格在紧跟一个分 依次类推
在线生成,可以查看下次执行时间,方便我们确定我们的准确性
完结!
第三方平台不会及时更新本文最新内容。如果发现本文资料不全,可访问本人的Java博客搜索:标题关键字。以获取最新全部资料 ❤
评论(0)