springboot实现定时任务@Scheduled方式
作者:平平常常一般牛
这篇文章主要介绍了springboot实现定时任务@Scheduled方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
@Scheduled
只适合处理简单的计划任务,不能处理分布式计划任务。
优势:是spring框架提供的计划任务,开发简单,执行效率比较高。
且在计划任务数量太多的时候,可能出现阻塞,崩溃,延迟启动等问题
- 启动类中加入@EnableScheduling
- 要开启定时任务的方法上加入@Scheduled
- 设置任务执行的时间间隔
@EnableScheduling
注解的作用是启用Spring的计划任务执行能力。
注意:
@EnableScheduling只应用于它的本地应用程序上下文,允许在不同级别选择性地调度bean。
@Scheduled
标记要调度的方法的注释。必须指定cron、fixedDelay或fixedRate属性中的一个。
带注释的方法必须没有参数。 它通常有一个void返回类型; 如果不是,则通过调度器调用返回值时将被忽略。
比较常用的有两种方式去设置时间间隔,fixedRate和cron表达式
第一种:设置时间间隔的方式是fixedRate属性
这种方式比较简单,只适用于对时间掌控不是很高的情况下,例如,每分钟执行一次,部分白天还是黑夜。
@Scheduled(fixedRate = 301000)
:
- 表示每30秒执行一次。
- 这个也是按照时间进制来的,1000代表是毫秒进制30代表就是30秒,若是想每小时执行一次也是可以继续16060*1000。
@Scheduled(fixedRate = 30*1000) public void he(){ System.out.println("女神吃药"+ DateFormat.getDateTimeInstance().format(new Date())); }
第二种:cron表达式
@Scheduled(cron = "* * 9-22 * * ?") public void show(){ System.out.println("女神喝水"+ DateFormat.getDateTimeInstance().format(new Date())); }
上述cron表达式代表的是:我每个月 每天 9-22时 的每分每秒都执行一次。
cron表达式的时间格式是cron= “秒 分钟 小时 天 月 星期”
- 有兴趣学习cron表达式的同学可以点击下面的链接,里面有阿里云提供的详细的教程。
- https://help.aliyun.com/knowledge_detail/64769.html
异步多线程定时任务
@Scheduled
在计划任务数量太多的时候,可能出现阻塞,崩溃,延迟启动等问题
为了解决这个问题,我们可以采用异步多线程的方式,利用多个线程来管理定时任务,不让任务丢失
- Application启动类中加入开启异步操作的注解 @EnableAsync
- 在要异步开启定时任务的方法上加入异步注解 @Async
这样就不会一个任务没有执行完毕,而阻塞另一个任务的执行
@EnableAsync
启用Spring的异步方法执行功能@Async
将方法标记为异步执行候选方法的注释。也可以在类型级别使用,在这种情况下,所有类型的方法都被认为是异步的。但是请注意,@Configuration类中声明的方法不支持 @Async 。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。