欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot定時(shí)任務(wù)的實(shí)現(xiàn)詳解

 更新時(shí)間:2024年01月08日 10:07:23   作者:探索er  
這篇文章主要介紹了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),需要的朋友可以參考下

前言

定時(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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java之HashMap.values()轉(zhuǎn)List時(shí)的錯(cuò)誤和正確演示

    Java之HashMap.values()轉(zhuǎn)List時(shí)的錯(cuò)誤和正確演示

    這篇文章主要介紹了Java之HashMap.values()轉(zhuǎn)List時(shí)的錯(cuò)誤和正確演示,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-03-03
  • Java與Python兩種編程語(yǔ)言的比較與應(yīng)用舉例詳解

    Java與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-02
  • java 關(guān)鍵字static詳細(xì)介紹及如何使用

    java 關(guān)鍵字static詳細(xì)介紹及如何使用

    這篇文章主要介紹了java 關(guān)鍵字static詳細(xì)介紹及如何使用的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • 詳解SpringMVC中的異常處理機(jī)制

    詳解SpringMVC中的異常處理機(jī)制

    本篇文章將為大家詳細(xì)介紹一下springmvc的異常處理機(jī)制,用到了ControllerAdvice和ExceptionHandler注解,感興趣的小伙伴可以了解一下
    2022-07-07
  • Spring集成Mybatis過(guò)程詳細(xì)講解

    Spring集成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-03
  • java實(shí)現(xiàn)的日期時(shí)間轉(zhuǎn)換工具類完整示例

    java實(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
  • 如何完成spring的最小化XML配置

    如何完成spring的最小化XML配置

    這篇文章主要介紹了如何完成spring的最小化XML配置,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,,需要的朋友可以參考下
    2019-06-06
  • 一文詳解Java中的反射與new創(chuàng)建對(duì)象

    一文詳解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使用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)代碼

    這篇文章主要介紹了在SSM框架中將圖片上傳到數(shù)據(jù)庫(kù)中的實(shí)現(xiàn)代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03

最新評(píng)論