SpringBoot定時任務(wù)的實現(xiàn)詳解
前言
定時任務(wù)是企業(yè)級開發(fā)中最常見的功能之一,如定時統(tǒng)計訂單數(shù)、數(shù)據(jù)庫備份、定時發(fā)送短信和郵件、定時統(tǒng)計博客訪客等。
簡單的定時任務(wù)可以直接通過Spring中的@Scheduled注解來實現(xiàn),復雜的定時任務(wù)則可以通過集成Quartz來實現(xiàn),下面分別予以介紹。
1. @Scheduled
@Scheduled是由Spring提供的定時任務(wù)注解,使用方便,配置簡單,可以解決工作中大部分的定時任務(wù)需求,使用方式如下:
1.1 創(chuàng)建工程
首先創(chuàng)建一個普通的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 開啟定時任務(wù)
在項目啟動類上添加@EnableScheduling注解開啟定時任務(wù),代碼如下:
@SpringBootApplication @EnableScheduling public class TestforeverApplication { public static void main(String[] args) { SpringApplication.run(TestforeverApplication.class, args); } }
1.3 配置定時任務(wù)
定時任務(wù)主要通過@Scheduled注解進行配置,代碼如下:
@Component public class MySchedule { // 當前任務(wù)執(zhí)行結(jié)束1秒后開啟另一個任務(wù) @Scheduled(fixedDelay = 1000) public void fixedDelay() { System.out.println("fixedDelay:"+new Date()); } // 當前任務(wù)開始執(zhí)行2秒后開啟另一個定時任務(wù) @Scheduled(fixedRate = 2000) public void fixedRate() { System.out.println("fixedRate:"+new Date()); } // 當前任務(wù)開始執(zhí)行2秒后開啟另一個定時任務(wù),并且首次延遲1秒執(zhí)行 @Scheduled(initialDelay = 1000, fixedRate = 2000) public void initialDelay() { System.out.println("initialDelay:"+new Date()); } // 使用crom 表達式,下面表示定時任務(wù)每分鐘執(zhí)行一次 @Scheduled(cron = "0 * * * * ?") public void cron() { System.out.println("cron:"+new Date()); } }
代碼解釋:
- 通過@Scheduled注解來標注一個定時任務(wù),其中fixedDelay= 1000表示在當前任務(wù)執(zhí)行結(jié)束1秒后開啟另一個任務(wù),fixedRate= 2000表示在當前任務(wù)開始執(zhí)行2秒后開啟另一個定時任務(wù),initialDelay= 1000則表示首次執(zhí)行的延遲時間。
- 在@Scheduled注解中也可以使用cron表達式,cron="0 * * * * ?"表示該定時任務(wù)每分鐘執(zhí)行一次
配置完成后,接下來啟動Spring Boot項目即可,定時任務(wù)部分打印日志如圖所示。
2. Quartz
2.1 Quartz簡介
Quartz是一個功能豐富的開源作業(yè)調(diào)度庫,它由Java寫成,可以集成在任何Java應用程序中,包括Java SE和Java EE等。使用Quartz可以創(chuàng)建簡單或者復雜的執(zhí)行計劃,它支持數(shù)據(jù)庫、集群、插件以及郵件,并且支持cron表達式,具有極高的靈活性。Spring Boot中集成Quartz和Spring 中集成Quartz比較類似,主要提供三個Bean: JobDetail、 Trigger 以及SchedulerFactory。
2.2 整合Spring Boot
首先創(chuàng)建Spring Boot項目,添加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)建兩個 Job。
2.3.1 Bean方式
Job 可以是一個普通的 JavaBean。如果是普通的 JavaBean,那么可以先添加 @Component 注解將之注冊到 Spring 容器中。
@Component public class MyFirstJob { public void sayHello() { System.out.println("MyFirstJob:sayHello:" + new Date()); } }
2.3.2 抽象類 QuartzJobBean
Job 也可以繼承抽象類 QuartzJobBean。若繼承自 QuartzJobBean,則要實現(xiàn)該類中的 executeInternal 方法,該方法在任務(wù)被調(diào)用時使用。
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
接下來創(chuàng)建 QuartzConfig 對 JobDetail 和 Trigger 進行配置,并創(chuàng)建 SchedulerFactory。
JobDetail 的配置有兩種方式:
- 第一種方式通過 MethodInvokingJobDetailFactoryBean 類配置 JobDetail,只需要指定 Job 的實例名和要調(diào)用的方法即可,注冊這用方式無法在創(chuàng)建 JobDetail 時傳遞參數(shù)。
- 第二種方式通過 JobDetailFactoryBean 來實現(xiàn),這種方式只需要指定 JobClass 即可,然后可以通過 JobDataMap 傳遞參數(shù)到 Job 中,Job 中只需要提供屬性名,并且提供一個相應的 set 方法即可接收到參數(shù)。
Trigger 有多種不同的實現(xiàn),這里展示兩種常用的 Trigger:SimpleTrigger 和 CronTrigger。
- SimpleTrigger 使用 SimpleTriggerFactoryBean 進行創(chuàng)建。在 SimpleTriggerFactoryBean 對象中,首先設(shè)置 JobDetail,接著配置任務(wù)循環(huán)次數(shù)、任務(wù)啟動延遲時間、任務(wù)的時間間隔。
- CronTrigger 使用 CronTriggerFactoryBean 進行創(chuàng)建。在 SimpleTriggerFactoryBean 對象中,則主要配置 JobDetail 和 Cron 表達式。
@Configuration public class QuartzConfig { /********** 配置兩個 JobDetail **********/ // 通過 MethodInvokingJobDetailFactoryBean 類配置 JobDetail @Bean MethodInvokingJobDetailFactoryBean jobDetail1() { MethodInvokingJobDetailFactoryBean bean = new MethodInvokingJobDetailFactoryBean(); bean.setTargetBeanName("myFirstJob"); bean.setTargetMethod("sayHello"); return bean; } // 通過 JobDetailFactoryBean 來實現(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)建兩個 Trigger **********/ // 創(chuàng)建一個 SimpleTrigger @Bean SimpleTriggerFactoryBean simpleTrigger() { SimpleTriggerFactoryBean bean = new SimpleTriggerFactoryBean(); bean.setJobDetail(jobDetail1().getObject()); // 設(shè)置 jobDetail bean.setRepeatCount(3); // 任務(wù)循環(huán)次數(shù)為3(總共會執(zhí)行4次) bean.setStartDelay(2000); // 任務(wù)啟動延遲2秒執(zhí)行 bean.setRepeatInterval(2000); // 任務(wù)的時間間隔為2秒 return bean; } // 創(chuàng)建一個 CronTrigger @Bean CronTriggerFactoryBean cronTrigger() { CronTriggerFactoryBean bean = new CronTriggerFactoryBean(); bean.setJobDetail(jobDetail2().getObject()); // 設(shè)置 jobDetail bean.setCronExpression("* * * * * ?"); // 設(shè)置 Cron 表達式 return bean; } /********** 創(chuàng)建 SchedulerFactory **********/ @Bean SchedulerFactoryBean schedulerFactory() { // 通過 SchedulerFactoryBean 創(chuàng)建 SchedulerFactor SchedulerFactoryBean bean = new SchedulerFactoryBean(); // 配置兩個 Trigger SimpleTrigger simpleTrigger = simpleTrigger().getObject(); CronTrigger cronTrigger = cronTrigger().getObject(); bean.setTriggers(simpleTrigger,cronTrigger); return bean; } }
經(jīng)過這幾步的配置,定時任務(wù)就配置成功了。接下來啟動Spring Boot項目,控制臺打印日志如圖所示。
可以看到 MyFirstJob 在重復 3 次之后便不再執(zhí)行(一共執(zhí)行 4 次),而 MySecondJob 則每秒執(zhí)行 1 次,一直執(zhí)行下去。
到此這篇關(guān)于SpringBoot定時任務(wù)的實現(xiàn)詳解的文章就介紹到這了,更多相關(guān)SpringBoot定時任務(wù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java之HashMap.values()轉(zhuǎn)List時的錯誤和正確演示
這篇文章主要介紹了Java之HashMap.values()轉(zhuǎn)List時的錯誤和正確演示,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-03-03java實現(xiàn)的日期時間轉(zhuǎn)換工具類完整示例
這篇文章主要介紹了java實現(xiàn)的日期時間轉(zhuǎn)換工具類,結(jié)合完整實例形式分析了java針對日期時間常見的轉(zhuǎn)換、計算、格式化等相關(guān)操作與封裝技巧,需要的朋友可以參考下2019-10-10新版IDEA使用Spring Initializr創(chuàng)建工程的兩種方法
這篇文章主要介紹了新版IDEA使用Spring Initializr創(chuàng)建工程(兩種方法,官方工具和IDEA),文中通過代碼示例和圖文結(jié)合的方式給大家講解的非常詳細,具有一定的參考價值,需要的朋友可以參考下2024-10-10在SSM框架中將圖片上傳到數(shù)據(jù)庫中的實現(xiàn)代碼
這篇文章主要介紹了在SSM框架中將圖片上傳到數(shù)據(jù)庫中的實現(xiàn)代碼,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03