SpringBoot定時(shí)任務(wù)的實(shí)現(xiàn)詳解
前言
定時(shí)任務(wù)是企業(yè)級(jí)開(kāi)發(fā)中最常見(jiàn)的功能之一,如定時(shí)統(tǒng)計(jì)訂單數(shù)、數(shù)據(jù)庫(kù)備份、定時(shí)發(fā)送短信和郵件、定時(shí)統(tǒng)計(jì)博客訪客等。
簡(jiǎn)單的定時(shí)任務(wù)可以直接通過(guò)Spring中的@Scheduled注解來(lái)實(shí)現(xiàn),復(fù)雜的定時(shí)任務(wù)則可以通過(guò)集成Quartz來(lái)實(shí)現(xiàn),下面分別予以介紹。
1. @Scheduled
@Scheduled是由Spring提供的定時(shí)任務(wù)注解,使用方便,配置簡(jiǎn)單,可以解決工作中大部分的定時(shí)任務(wù)需求,使用方式如下:
1.1 創(chuàng)建工程
首先創(chuàng)建一個(gè)普通的Spring Boot Web工程,添加Web依賴即可,代碼如下:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency>
1.2 開(kāi)啟定時(shí)任務(wù)
在項(xiàng)目啟動(dòng)類上添加@EnableScheduling注解開(kāi)啟定時(shí)任務(wù),代碼如下:
@SpringBootApplication @EnableScheduling public class TestforeverApplication { public static void main(String[] args) { SpringApplication.run(TestforeverApplication.class, args); } }
1.3 配置定時(shí)任務(wù)
定時(shí)任務(wù)主要通過(guò)@Scheduled注解進(jìn)行配置,代碼如下:
@Component public class MySchedule { // 當(dāng)前任務(wù)執(zhí)行結(jié)束1秒后開(kāi)啟另一個(gè)任務(wù) @Scheduled(fixedDelay = 1000) public void fixedDelay() { System.out.println("fixedDelay:"+new Date()); } // 當(dāng)前任務(wù)開(kāi)始執(zhí)行2秒后開(kāi)啟另一個(gè)定時(shí)任務(wù) @Scheduled(fixedRate = 2000) public void fixedRate() { System.out.println("fixedRate:"+new Date()); } // 當(dāng)前任務(wù)開(kāi)始執(zhí)行2秒后開(kāi)啟另一個(gè)定時(shí)任務(wù),并且首次延遲1秒執(zhí)行 @Scheduled(initialDelay = 1000, fixedRate = 2000) public void initialDelay() { System.out.println("initialDelay:"+new Date()); } // 使用crom 表達(dá)式,下面表示定時(shí)任務(wù)每分鐘執(zhí)行一次 @Scheduled(cron = "0 * * * * ?") public void cron() { System.out.println("cron:"+new Date()); } }
代碼解釋:
- 通過(guò)@Scheduled注解來(lái)標(biāo)注一個(gè)定時(shí)任務(wù),其中fixedDelay= 1000表示在當(dāng)前任務(wù)執(zhí)行結(jié)束1秒后開(kāi)啟另一個(gè)任務(wù),fixedRate= 2000表示在當(dāng)前任務(wù)開(kāi)始執(zhí)行2秒后開(kāi)啟另一個(gè)定時(shí)任務(wù),initialDelay= 1000則表示首次執(zhí)行的延遲時(shí)間。
- 在@Scheduled注解中也可以使用cron表達(dá)式,cron="0 * * * * ?"表示該定時(shí)任務(wù)每分鐘執(zhí)行一次
配置完成后,接下來(lái)啟動(dòng)Spring Boot項(xiàng)目即可,定時(shí)任務(wù)部分打印日志如圖所示。
2. Quartz
2.1 Quartz簡(jiǎn)介
Quartz是一個(gè)功能豐富的開(kāi)源作業(yè)調(diào)度庫(kù),它由Java寫成,可以集成在任何Java應(yīng)用程序中,包括Java SE和Java EE等。使用Quartz可以創(chuàng)建簡(jiǎn)單或者復(fù)雜的執(zhí)行計(jì)劃,它支持?jǐn)?shù)據(jù)庫(kù)、集群、插件以及郵件,并且支持cron表達(dá)式,具有極高的靈活性。Spring Boot中集成Quartz和Spring 中集成Quartz比較類似,主要提供三個(gè)Bean: JobDetail、 Trigger 以及SchedulerFactory。
2.2 整合Spring Boot
首先創(chuàng)建Spring Boot項(xiàng)目,添加Quartz依賴,代碼如下:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-quartz</artifactId> </dependency>
2.3 創(chuàng)建Job
接著我們使用不同的方式創(chuàng)建兩個(gè) Job。
2.3.1 Bean方式
Job 可以是一個(gè)普通的 JavaBean。如果是普通的 JavaBean,那么可以先添加 @Component 注解將之注冊(cè)到 Spring 容器中。
@Component public class MyFirstJob { public void sayHello() { System.out.println("MyFirstJob:sayHello:" + new Date()); } }
2.3.2 抽象類 QuartzJobBean
Job 也可以繼承抽象類 QuartzJobBean。若繼承自 QuartzJobBean,則要實(shí)現(xiàn)該類中的 executeInternal 方法,該方法在任務(wù)被調(diào)用時(shí)使用。
public class MySecondJob extends QuartzJobBean { private String name; public void setName(String name) { this.name = name; } @Override protected void executeInternal(JobExecutionContext context) { System.out.println("hello:" + name + ":" + new Date()); } }
2.4 提供 Quartz 相關(guān)配置 Bean
接下來(lái)創(chuàng)建 QuartzConfig 對(duì) JobDetail 和 Trigger 進(jìn)行配置,并創(chuàng)建 SchedulerFactory。
JobDetail 的配置有兩種方式:
- 第一種方式通過(guò) MethodInvokingJobDetailFactoryBean 類配置 JobDetail,只需要指定 Job 的實(shí)例名和要調(diào)用的方法即可,注冊(cè)這用方式無(wú)法在創(chuàng)建 JobDetail 時(shí)傳遞參數(shù)。
- 第二種方式通過(guò) JobDetailFactoryBean 來(lái)實(shí)現(xiàn),這種方式只需要指定 JobClass 即可,然后可以通過(guò) JobDataMap 傳遞參數(shù)到 Job 中,Job 中只需要提供屬性名,并且提供一個(gè)相應(yīng)的 set 方法即可接收到參數(shù)。
Trigger 有多種不同的實(shí)現(xiàn),這里展示兩種常用的 Trigger:SimpleTrigger 和 CronTrigger。
- SimpleTrigger 使用 SimpleTriggerFactoryBean 進(jìn)行創(chuàng)建。在 SimpleTriggerFactoryBean 對(duì)象中,首先設(shè)置 JobDetail,接著配置任務(wù)循環(huán)次數(shù)、任務(wù)啟動(dòng)延遲時(shí)間、任務(wù)的時(shí)間間隔。
- CronTrigger 使用 CronTriggerFactoryBean 進(jìn)行創(chuàng)建。在 SimpleTriggerFactoryBean 對(duì)象中,則主要配置 JobDetail 和 Cron 表達(dá)式。
@Configuration public class QuartzConfig { /********** 配置兩個(gè) JobDetail **********/ // 通過(guò) MethodInvokingJobDetailFactoryBean 類配置 JobDetail @Bean MethodInvokingJobDetailFactoryBean jobDetail1() { MethodInvokingJobDetailFactoryBean bean = new MethodInvokingJobDetailFactoryBean(); bean.setTargetBeanName("myFirstJob"); bean.setTargetMethod("sayHello"); return bean; } // 通過(guò) JobDetailFactoryBean 來(lái)實(shí)現(xiàn) JobDetail @Bean JobDetailFactoryBean jobDetail2() { JobDetailFactoryBean bean = new JobDetailFactoryBean(); bean.setJobClass(MySecondJob.class); JobDataMap jobDataMap = new JobDataMap(); jobDataMap.put("name","sang"); bean.setJobDataMap(jobDataMap); bean.setDurability(true); return bean; } /********** 創(chuàng)建兩個(gè) Trigger **********/ // 創(chuàng)建一個(gè) SimpleTrigger @Bean SimpleTriggerFactoryBean simpleTrigger() { SimpleTriggerFactoryBean bean = new SimpleTriggerFactoryBean(); bean.setJobDetail(jobDetail1().getObject()); // 設(shè)置 jobDetail bean.setRepeatCount(3); // 任務(wù)循環(huán)次數(shù)為3(總共會(huì)執(zhí)行4次) bean.setStartDelay(2000); // 任務(wù)啟動(dòng)延遲2秒執(zhí)行 bean.setRepeatInterval(2000); // 任務(wù)的時(shí)間間隔為2秒 return bean; } // 創(chuàng)建一個(gè) CronTrigger @Bean CronTriggerFactoryBean cronTrigger() { CronTriggerFactoryBean bean = new CronTriggerFactoryBean(); bean.setJobDetail(jobDetail2().getObject()); // 設(shè)置 jobDetail bean.setCronExpression("* * * * * ?"); // 設(shè)置 Cron 表達(dá)式 return bean; } /********** 創(chuàng)建 SchedulerFactory **********/ @Bean SchedulerFactoryBean schedulerFactory() { // 通過(guò) SchedulerFactoryBean 創(chuàng)建 SchedulerFactor SchedulerFactoryBean bean = new SchedulerFactoryBean(); // 配置兩個(gè) Trigger SimpleTrigger simpleTrigger = simpleTrigger().getObject(); CronTrigger cronTrigger = cronTrigger().getObject(); bean.setTriggers(simpleTrigger,cronTrigger); return bean; } }
經(jīng)過(guò)這幾步的配置,定時(shí)任務(wù)就配置成功了。接下來(lái)啟動(dòng)Spring Boot項(xiàng)目,控制臺(tái)打印日志如圖所示。
可以看到 MyFirstJob 在重復(fù) 3 次之后便不再執(zhí)行(一共執(zhí)行 4 次),而 MySecondJob 則每秒執(zhí)行 1 次,一直執(zhí)行下去。
到此這篇關(guān)于SpringBoot定時(shí)任務(wù)的實(shí)現(xiàn)詳解的文章就介紹到這了,更多相關(guān)SpringBoot定時(shí)任務(wù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 利用SpringBoot解決多個(gè)定時(shí)任務(wù)阻塞的問(wèn)題
- SpringBoot中定時(shí)任務(wù)的使用方法解析
- Springboot實(shí)現(xiàn)定時(shí)任務(wù)的4種方式舉例詳解
- Springboot項(xiàng)目中定時(shí)任務(wù)的四種實(shí)現(xiàn)方式詳解
- SpringBoot實(shí)現(xiàn)動(dòng)態(tài)增刪啟停定時(shí)任務(wù)的方式
- 一文帶你掌握SpringBoot中常見(jiàn)定時(shí)任務(wù)的實(shí)現(xiàn)
- SpringBoot之解決多個(gè)定時(shí)任務(wù)阻塞的問(wèn)題
- SpringBoot創(chuàng)建定時(shí)任務(wù)的示例詳解
- SpringBoot自定義定時(shí)任務(wù)的實(shí)現(xiàn)示例
相關(guān)文章
Java之HashMap.values()轉(zhuǎn)List時(shí)的錯(cuò)誤和正確演示
這篇文章主要介紹了Java之HashMap.values()轉(zhuǎn)List時(shí)的錯(cuò)誤和正確演示,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-03-03Java與Python兩種編程語(yǔ)言的比較與應(yīng)用舉例詳解
這篇文章主要介紹了Java與Python兩種編程語(yǔ)言比較與應(yīng)用的相關(guān)資料,Java和Python各有特點(diǎn),Java適用于企業(yè)級(jí)應(yīng)用開(kāi)發(fā),Python則在數(shù)據(jù)科學(xué)和機(jī)器學(xué)習(xí)領(lǐng)域占優(yōu)勢(shì),兩者在語(yǔ)法、應(yīng)用領(lǐng)域、性能、開(kāi)發(fā)效率等方面存在差異,需要的朋友可以參考下2025-02-02java 關(guān)鍵字static詳細(xì)介紹及如何使用
這篇文章主要介紹了java 關(guān)鍵字static詳細(xì)介紹及如何使用的相關(guān)資料,需要的朋友可以參考下2017-03-03Spring集成Mybatis過(guò)程詳細(xì)講解
mybatis-plus是一個(gè)Mybatis的增強(qiáng)工具,在Mybatis的基礎(chǔ)上只做增強(qiáng)不做改變,為簡(jiǎn)化開(kāi)發(fā)、提高效率而生,下面這篇文章主要給大家介紹了關(guān)于SpringBoot整合Mybatis-plus案例及用法實(shí)例的相關(guān)資料,需要的朋友可以參考下2023-03-03java實(shí)現(xiàn)的日期時(shí)間轉(zhuǎn)換工具類完整示例
這篇文章主要介紹了java實(shí)現(xiàn)的日期時(shí)間轉(zhuǎn)換工具類,結(jié)合完整實(shí)例形式分析了java針對(duì)日期時(shí)間常見(jiàn)的轉(zhuǎn)換、計(jì)算、格式化等相關(guān)操作與封裝技巧,需要的朋友可以參考下2019-10-10一文詳解Java中的反射與new創(chuàng)建對(duì)象
Java中的反射(Reflection)和使用new關(guān)鍵字創(chuàng)建對(duì)象是兩種不同的對(duì)象創(chuàng)建方式,各有優(yōu)缺點(diǎn)和適用場(chǎng)景,本文小編給大家詳細(xì)介紹了Java中的反射與new創(chuàng)建對(duì)象,感興趣的小伙伴跟著小編一起來(lái)看看吧2024-07-07新版IDEA使用Spring Initializr創(chuàng)建工程的兩種方法
這篇文章主要介紹了新版IDEA使用Spring Initializr創(chuàng)建工程(兩種方法,官方工具和IDEA),文中通過(guò)代碼示例和圖文結(jié)合的方式給大家講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2024-10-10在SSM框架中將圖片上傳到數(shù)據(jù)庫(kù)中的實(shí)現(xiàn)代碼
這篇文章主要介紹了在SSM框架中將圖片上傳到數(shù)據(jù)庫(kù)中的實(shí)現(xiàn)代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03