SpringBoot 實現(xiàn)定時任務的方法詳解
一、定時任務實現(xiàn)的幾種方式:
Timer
這是java自帶的java.util.Timer類,這個類允許你調(diào)度一個java.util.TimerTask任務。使用這種方式可以讓你的程序按照某一個頻度執(zhí)行,但不能在指定時間運行。一般用的較少。
ScheduledExecutorService
也jdk自帶的一個類;是基于線程池設計的定時任務類,每個調(diào)度任務都會分配到線程池中的一個線程去執(zhí)行,也就是說,任務是并發(fā)執(zhí)行,互不影響。
Spring Task
Spring3.0以后自帶的task,可以將它看成一個輕量級的Quartz,而且使用起來比Quartz簡單許多。
Quartz
這是一個功能比較強大的的調(diào)度器,可以讓你的程序在指定時間執(zhí)行,也可以按照某一個頻度執(zhí)行,配置起來稍顯復雜。
二、基于SpringBoot的定時任務
使用SpringBoot 自帶的定時任務,只需要添加相應的注解就可以實現(xiàn)
2.1 導入SpringBoot啟動包
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.1.RELEASE</version> </dependency>
2.2 啟動類啟用定時
在啟動類上面加上@EnableScheduling即可開啟定時
@SpringBootApplication @EnableScheduling // 開啟定時 public class SpringBootDemoTimeTaskApplication { private static final Logger logger = LoggerFactory.getLogger(SpringBootDemoTimeTaskApplication.class); public static void main(String[] args) { SpringApplication.run(SpringBootDemoTimeTaskApplication.class); logger.info("SpringBootDemoTimeTaskApplication start!"); } }
2.3 創(chuàng)建定時任務實現(xiàn)類SchedulerTask
@Component public class SchedulerTask { private static final Logger logger = LoggerFactory.getLogger(SchedulerTask.class); /** * @Scheduled(fixedRate = 6000) :上一次開始執(zhí)行時間點之后6秒再執(zhí)行 * @Scheduled(fixedDelay = 6000) :上一次執(zhí)行完畢時間點之后6秒再執(zhí)行 * @Scheduled(initialDelay=1000, fixedRate=6000) :第一次延遲1秒后執(zhí)行,之后按fixedRate的規(guī)則每6秒執(zhí)行一次 * @Scheduled(cron=""):詳見cron表達式http://www.pppet.net/ */ @Scheduled(fixedRate = 5000) public void scheduled1() { logger.info("=====>>>>>使用fixedRate執(zhí)行定時任務"); } @Scheduled(fixedDelay = 10000) public void scheduled2() { logger.info("=====>>>>>使用fixedDelay執(zhí)行定時任務"); } @Scheduled(cron="*/6 * * * * ?") private void scheduled3(){ logger.info("使用cron執(zhí)行定時任務"); } }
運行結(jié)果:
2019-03-09 17:33:05.681 INFO 7752 --- [ main] c.v.t.SpringBootDemoTimeTaskApplication : SpringBootDemoTimeTaskApplication start! 2019-03-09 17:33:06.002 INFO 7752 --- [ scheduling-1] cn.van.task.service.SchedulerTask : 使用cron執(zhí)行定時任務 2019-03-09 17:33:10.680 INFO 7752 --- [ scheduling-1] cn.van.task.service.SchedulerTask : =====>>>>>使用fixedRate執(zhí)行定時任務 2019-03-09 17:33:12.003 INFO 7752 --- [ scheduling-1] cn.van.task.service.SchedulerTask : 使用cron執(zhí)行定時任務 2019-03-09 17:33:15.676 INFO 7752 --- [ scheduling-1] cn.van.task.service.SchedulerTask : =====>>>>>使用fixedRate執(zhí)行定時任務 2019-03-09 17:33:15.676 INFO 7752 --- [ scheduling-1] cn.van.task.service.SchedulerTask : =====>>>>>使用fixedDelay執(zhí)行定時任務 2019-03-09 17:33:18.002 INFO 7752 --- [ scheduling-1] cn.van.task.service.SchedulerTask : 使用cron執(zhí)行定時任務 2019-03-09 17:33:20.677 INFO 7752 --- [ scheduling-1] cn.van.task.service.SchedulerTask : =====>>>>>使用fixedRate執(zhí)行定時任務 2019-03-09 17:33:24.002 INFO 7752 --- [ scheduling-1] cn.van.task.service.SchedulerTask : 使用cron執(zhí)行定時任務 2019-03-09 17:33:25.680 INFO 7752 --- [ scheduling-1] cn.van.task.service.SchedulerTask : =====>>>>>使用fixedRate執(zhí)行定時任務 2019-03-09 17:33:25.681 INFO 7752 --- [ scheduling-1] cn.van.task.service.SchedulerTask : =====>>>>>使用fixedDelay執(zhí)行定時任務 2019-03-09 17:33:30.005 INFO 7752 --- [ scheduling-1] cn.van.task.service.SchedulerTask : 使用cron執(zhí)行定時任務 2019-03-09 17:33:30.680 INFO 7752 --- [ scheduling-1] cn.van.task.service.SchedulerTask : =====>>>>>使用fixedRate執(zhí)行定時任務 2019-03-09 17:33:35.680 INFO 7752 --- [ scheduling-1] cn.van.task.service.SchedulerTask : =====>>>>>使用fixedRate執(zhí)行定時任務 2019-03-09 17:33:35.682 INFO 7752 --- [ scheduling-1] cn.van.task.service.SchedulerTask : =====>>>>>使用fixedDelay執(zhí)行定時任務
2.4 執(zhí)行時間的配置
在上面的定時任務中,我們在方法上使用@Scheduled注解來設置任務的執(zhí)行時間,并且使用三種屬性配置方式:
fixedRate:定義一個按一定頻率執(zhí)行的定時任務
fixedDelay:定義一個按一定頻率執(zhí)行的定時任務,與上面不同的是,改屬性可以配合initialDelay, 定義該任務延遲執(zhí)行時間。
cron:通過表達式來配置任務執(zhí)行時間--在線cron表達式生成器
三、多線程執(zhí)行定時任務
SpringBoot定時任務默認單線程,可以看到三個定時任務都已經(jīng)執(zhí)行,并且使同一個線程中(scheduling-1)串行執(zhí)行,如果只有一個定時任務,這樣做肯定沒問題,當定時任務增多,如果一個任務卡死,會導致其他任務也無法執(zhí)行。
3.1 多線程配置類 AsyncConfig.class
@Configuration // 表明該類是一個配置類 @EnableAsync // 開啟異步事件的支持 public class AsyncConfig { @Value("${myProps.corePoolSize}") private int corePoolSize; @Value("${myProps.maxPoolSize}") private int maxPoolSize; @Value("${myProps.queueCapacity}") private int queueCapacity; @Bean public Executor taskExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(corePoolSize); executor.setMaxPoolSize(maxPoolSize); executor.setQueueCapacity(queueCapacity); executor.initialize(); return executor; } }
3.2 配置文件application.yml中添加多線程配置
myProps: corePoolSize: 10 maxPoolSize: 100 queueCapacity: 10
3.3 在定時任務的類或者方法上添加@Async
此時,可讓每一個任務都是在不同的線程中,啟動項目,日志打印如下:
2019-03-11 15:16:54.855 INFO 10782 --- [ main] c.v.t.SpringBootDemoTimeTaskApplication : SpringBootDemoTimeTaskApplication start! 2019-03-11 15:16:55.015 INFO 10782 --- [ taskExecutor-1] cn.van.task.service.SchedulerTask : =====>>>>>使用cron執(zhí)行定時任務-1 2019-03-11 15:17:00.002 INFO 10782 --- [ taskExecutor-2] cn.van.task.service.SchedulerTask : =====>>>>>使用cron執(zhí)行定時任務-2 2019-03-11 15:17:00.002 INFO 10782 --- [ taskExecutor-3] cn.van.task.service.SchedulerTask : =====>>>>>使用cron執(zhí)行定時任務-1 2019-03-11 15:17:05.003 INFO 10782 --- [ taskExecutor-4] cn.van.task.service.SchedulerTask : =====>>>>>使用cron執(zhí)行定時任務-1 2019-03-11 15:17:06.005 INFO 10782 --- [ taskExecutor-5] cn.van.task.service.SchedulerTask : =====>>>>>使用cron執(zhí)行定時任務-2 2019-03-11 15:17:10.004 INFO 10782 --- [ taskExecutor-6] cn.van.task.service.SchedulerTask : =====>>>>>使用cron執(zhí)行定時任務-1 2019-03-11 15:17:12.005 INFO 10782 --- [ taskExecutor-7] cn.van.task.service.SchedulerTask : =====>>>>>使用cron執(zhí)行定時任務-2 2019-03-11 15:17:15.006 INFO 10782 --- [ taskExecutor-8] cn.van.task.service.SchedulerTask : =====>>>>>使用cron執(zhí)行定時任務-1 2019-03-11 15:17:18.004 INFO 10782 --- [ taskExecutor-9] cn.van.task.service.SchedulerTask : =====>>>>>使用cron執(zhí)行定時任務-2 2019-03-11 15:17:20.004 INFO 10782 --- [taskExecutor-10] cn.van.task.service.SchedulerTask : =====>>>>>使用cron執(zhí)行定時任務-1
日志打印證明了我的預測,至此,多線程中執(zhí)行定時任務完畢!
四、源碼及其延伸
https://github.com/vanDusty/SpringBoot-Home/tree/master/springboot-demo-list/task-demo
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- SpringBoot實現(xiàn)定時任務和異步調(diào)用
- SpringBoot中并發(fā)定時任務的實現(xiàn)、動態(tài)定時任務的實現(xiàn)(看這一篇就夠了)推薦
- SpringBoot與Quartz集成實現(xiàn)分布式定時任務集群的代碼實例
- Springboot整個Quartz實現(xiàn)動態(tài)定時任務的示例代碼
- Quartz+Spring Boot實現(xiàn)動態(tài)管理定時任務
- spring boot整合quartz實現(xiàn)多個定時任務的方法
- SpringBoot定時任務兩種(Spring Schedule 與 Quartz 整合 )實現(xiàn)方法
相關文章
idea?compile項目正常啟動項目的時候build失敗報“找不到符號”等問題及解決方案
這篇文章主要介紹了idea?compile項目正常,啟動項目的時候build失敗,報“找不到符號”等問題,這種問題屬于lombok編譯失敗導致,可能原因是依賴jar包沒有更新到最新版本,需要的朋友可以參考下2023-10-10ElasticSearch 動態(tài)映射實戰(zhàn)詳解
這篇文章主要為大家介紹了ElasticSearch 動態(tài)映射實戰(zhàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-01-01使用Java獲取html中Select,radio多選的值方法
以下是對使用Java獲取html中Select,radio多選值的方法進行了詳細的分析介紹,需要的朋友可以過來參考下2013-08-08