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

SpringBoot定時(shí)調(diào)度之Timer與Quartz詳解

 更新時(shí)間:2023年06月18日 11:19:12   作者:莫念Program  
Java?中常用的定時(shí)調(diào)度框架有以下幾種:Timer、ScheduledExecutorService、Spring?Task和Quartz,本文主要來(lái)和大家講講他們的具體使用,需要的可以參考一下

Java 中常用的定時(shí)調(diào)度框架有以下幾種:

  • Timer:Java 標(biāo)準(zhǔn)庫(kù)中提供的一個(gè)定時(shí)調(diào)度工具,可以在指定的時(shí)間點(diǎn)或時(shí)間間隔內(nèi)執(zhí)行任務(wù)。Timer 的缺點(diǎn)是不支持并發(fā)執(zhí)行和錯(cuò)誤處理機(jī)制較弱。
  • ScheduledExecutorService:Java 標(biāo)準(zhǔn)庫(kù)中提供的另一個(gè)定時(shí)調(diào)度工具,也可以在指定的時(shí)間點(diǎn)或時(shí)間間隔內(nèi)執(zhí)行任務(wù)。與 Timer 相比,ScheduledExecutorService 支持并發(fā)執(zhí)行和錯(cuò)誤處理機(jī)制較強(qiáng)。
  • Spring Task:Spring 框架中提供的一個(gè)定時(shí)調(diào)度工具,可以用于執(zhí)行定時(shí)任務(wù)、異步任務(wù)等。Spring Task 支持多種時(shí)間表達(dá)式、動(dòng)態(tài)調(diào)整和錯(cuò)誤處理機(jī)制。
  • Quartz:一個(gè)用于定時(shí)調(diào)度的開(kāi)源框架,可以在指定的時(shí)間點(diǎn)或時(shí)間間隔內(nèi)自動(dòng)執(zhí)行任務(wù)。Quartz 支持多種配置方式和調(diào)度策略,功能豐富、靈活性高、易于集成并且可靠性較高。

Timer

Timer 是 Java 標(biāo)準(zhǔn)庫(kù)中提供的一個(gè)定時(shí)調(diào)度工具,可以在指定的時(shí)間點(diǎn)或時(shí)間間隔內(nèi)執(zhí)行任務(wù)。Timer 提供了多種調(diào)度方式和執(zhí)行策略,可以用于管理簡(jiǎn)單的定時(shí)任務(wù)。

Timer 使用 TimerTask 類來(lái)表示要執(zhí)行的任務(wù),TimerTask 是一個(gè)抽象類,需要繼承并實(shí)現(xiàn) run() 方法來(lái)定義具體的任務(wù)邏輯。Timer 還提供了多種調(diào)度方式,包括定時(shí)調(diào)度、周期性調(diào)度等。

以下是一個(gè)簡(jiǎn)單的 Timer 示例:

import java.util.Timer;
import java.util.TimerTask;
public class MyTask extends TimerTask {
    public void run() {
        System.out.println("定時(shí)任務(wù)執(zhí)行了!");
    }
    public static void main(String[] args) {
        Timer timer = new Timer();
        MyTask task = new MyTask();
        timer.schedule(task, 5000); // 5秒后執(zhí)行任務(wù)
    }
}

在上述代碼中,我們定義了一個(gè)名為 MyTask 的 TimerTask 類,并在其中實(shí)現(xiàn)了 run() 方法來(lái)定義具體的任務(wù)邏輯。然后,在 main() 方法中創(chuàng)建了一個(gè) Timer 實(shí)例,并使用 schedule() 方法來(lái)指定任務(wù)的執(zhí)行時(shí)間和執(zhí)行方式。

需要注意的是,Timer 的缺點(diǎn)是不支持并發(fā)執(zhí)行和錯(cuò)誤處理機(jī)制較弱。如果需要實(shí)現(xiàn)復(fù)雜的定時(shí)任務(wù),可以考慮使用其它的定時(shí)調(diào)度框架,例如 Quartz、ScheduledExecutorService 等。

ScheduledExecutorService

ScheduledExecutorService 基于 Executor 框架,使用 ThreadPoolExecutor 來(lái)實(shí)現(xiàn)任務(wù)的執(zhí)行和管理。

好的,下面是一個(gè)使用 ScheduledExecutorService 實(shí)現(xiàn)每天凌晨1點(diǎn)執(zhí)行任務(wù)的示例:

import java.time.LocalTime;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class MyTask implements Runnable {
    public void run() {
        System.out.println("定時(shí)任務(wù)執(zhí)行了!當(dāng)前時(shí)間:" + LocalTime.now());
    }
    public static void main(String[] args) {
        ScheduledExecutorService executor = Executors.newScheduledThreadPool(1);
        MyTask task = new MyTask();
        long initialDelay = calculateInitialDelay();
        executor.scheduleAtFixedRate(task, initialDelay, 24, TimeUnit.HOURS); // 每天凌晨1點(diǎn)執(zhí)行任務(wù)
    }
    private static long calculateInitialDelay() {
        LocalTime now = LocalTime.now();
        LocalTime target = LocalTime.of(1, 0, 0); // 目標(biāo)執(zhí)行時(shí)間為每天凌晨1點(diǎn)
        if (now.isBefore(target)) {
            return Duration.between(now, target).toMillis();
        } else {
            return Duration.between(now, target.plusDays(1)).toMillis();
        }
    }
}

在上述代碼中,我們定義了一個(gè)名為 MyTask 的 Runnable 類,并在其中實(shí)現(xiàn)了 run() 方法來(lái)定義具體的任務(wù)邏輯。然后,在 main() 方法中創(chuàng)建了一個(gè) ScheduledExecutorService 實(shí)例,并使用 scheduleAtFixedRate() 方法來(lái)指定任務(wù)的執(zhí)行時(shí)間和執(zhí)行方式。

為了實(shí)現(xiàn)每天凌晨1點(diǎn)執(zhí)行任務(wù),我們先定義了一個(gè) calculateInitialDelay() 方法來(lái)計(jì)算任務(wù)的初始延遲時(shí)間。該方法會(huì)根據(jù)當(dāng)前時(shí)間和目標(biāo)執(zhí)行時(shí)間計(jì)算出初始延遲時(shí)間,如果當(dāng)前時(shí)間早于目標(biāo)執(zhí)行時(shí)間,則將初始延遲時(shí)間設(shè)置為兩者時(shí)間差,否則將初始延遲時(shí)間設(shè)置為兩者時(shí)間差加上一天的時(shí)間差。

最后,我們使用 scheduleAtFixedRate() 方法來(lái)指定任務(wù)的執(zhí)行時(shí)間和執(zhí)行周期,其中 initialDelay 參數(shù)為初始延遲時(shí)間,period 參數(shù)為執(zhí)行周期,這里是每24小時(shí)執(zhí)行一次。

需要注意的是,為了獲取當(dāng)前時(shí)間和計(jì)算時(shí)間差,我們使用了 Java 8 中的 LocalDate、LocalTime 和 Duration 類。如果使用的是 Java 7 或更早的版本,可以使用 Date、Calendar 等類來(lái)代替。

Spring Task

Spring Task(也稱為 Spring Scheduler)是 Spring 框架中提供的定時(shí)任務(wù)框架,可以在指定的時(shí)間點(diǎn)或時(shí)間間隔內(nèi)執(zhí)行任務(wù)。Spring Task 封裝了 Java 標(biāo)準(zhǔn)庫(kù)中的 Timer 和ScheduledExecutorService,提供了更加簡(jiǎn)單和方便的定時(shí)任務(wù)管理方式。

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Component
public class MyTask {
    @Scheduled(cron = "0 0 1 * * ?") // 每天凌晨1點(diǎn)執(zhí)行任務(wù)
    public void execute() {
        System.out.println("定時(shí)任務(wù)執(zhí)行了!當(dāng)前時(shí)間:" + new Date());
    }
}

在上述代碼中,我們定義了一個(gè)名為 MyTask 的類,并在其中使用 @Scheduled 注解來(lái)指定任務(wù)的執(zhí)行時(shí)間和執(zhí)行方式。這里使用了 cron 表達(dá)式來(lái)指定每天凌晨1點(diǎn)執(zhí)行任務(wù)。

@Scheduled注解支持多種參數(shù)設(shè)置,例如:

  • fixedRate:表示每隔多少毫秒執(zhí)行一次。
  • fixedDelay:表示延遲多少毫秒后執(zhí)行。
  • initialDelay:表示啟動(dòng)延遲多少毫秒后執(zhí)行第一次。
  • cron:使用Cron表達(dá)式來(lái)指定執(zhí)行時(shí)間,例如“0 0 12 * * ?”表示每天中午12點(diǎn)執(zhí)行。

需要注意的是,@Scheduled注解只能用于Spring容器中的Bean中,因此需要將使用該注解的類標(biāo)注為@Component或其他的Spring組件注解。

cron表達(dá)式

任務(wù)執(zhí)行時(shí)間cron 表達(dá)式
每分鐘執(zhí)行一次0 * * * * ?
每小時(shí)的第30分鐘執(zhí)行一次0 30 * * * ?
每天的凌晨1點(diǎn)執(zhí)行一次0 0 1 * * ?
每周的周日凌晨1點(diǎn)執(zhí)行一次0 0 1 ? * SUN
每月的1號(hào)凌晨1點(diǎn)執(zhí)行一次0 0 1 1 * ?
每年的1月1日凌晨1點(diǎn)執(zhí)行一次0 0 1 1 1 ?
每天上午10點(diǎn)和下午2點(diǎn)執(zhí)行一次0 0 10,14 * * ?
每天的上午10點(diǎn)到11點(diǎn)之間每隔30秒執(zhí)行一次0/30 10-11 * * * ?
每天的上午10點(diǎn)到11點(diǎn)之間每隔5分鐘的1、6、11、16、21、26、31、36、41、46、51、56秒執(zhí)行1,6,11,16,21,26,31,36,41,46,51,56 10-11 * * * ?

另外,如果想要快速生成 cron 表達(dá)式,可以使用在線 cron 表達(dá)式生成器,例如 cron.qqe2.com/ cron 表達(dá)式。

@EnableScheduling

使用@Scheduled需要@EnableScheduling 配合,默認(rèn) spring-boot-actuator 包會(huì)帶上@EnableScheduling  注解,從而給人一種默認(rèn)開(kāi)啟定時(shí)任務(wù)的錯(cuò)覺(jué)。移除對(duì)應(yīng)包之后,如果用戶沒(méi)有在自己項(xiàng)目中帶上 @EnableScheduling  注解,則定時(shí)任務(wù)不會(huì)生效。

Quartz

Quartz 使用 Job 和 Trigger 兩個(gè)核心概念來(lái)管理任務(wù)。Job 表示要執(zhí)行的任務(wù),Trigger 表示任務(wù)的觸發(fā)器,即任務(wù)執(zhí)行的時(shí)間條件。Quartz 還提供了多種調(diào)度器和監(jiān)聽(tīng)器,可以實(shí)現(xiàn)更加復(fù)雜的任務(wù)調(diào)度和任務(wù)管理。

以下是一個(gè)簡(jiǎn)單的 Quartz 示例:

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
public class MyJob implements Job {
    public void execute(JobExecutionContext context) throws JobExecutionException {
        System.out.println("定時(shí)任務(wù)執(zhí)行了!當(dāng)前時(shí)間:" + new Date());
    }
    public static void main(String[] args) throws SchedulerException {
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
        JobDetail job = JobBuilder.newJob(MyJob.class).withIdentity("myJob", "group1").build();
        Trigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1")
                .startAt(DateBuilder.todayAt(1, 0, 0)).withSchedule(SimpleScheduleBuilder.repeatHourlyForever())
                .build();
        scheduler.scheduleJob(job, trigger);
        scheduler.start();
    }
}

在上述代碼中,我們定義了一個(gè)名為 MyJob 的 Job 類,并在其中實(shí)現(xiàn)了 execute() 方法來(lái)定義具體的任務(wù)邏輯。然后,在 main() 方法中創(chuàng)建了一個(gè) Scheduler 實(shí)例,并使用 JobBuilder 和 TriggerBuilder 來(lái)定義任務(wù)和觸發(fā)器。這里我們使用 SimpleScheduleBuilder 來(lái)指定任務(wù)的執(zhí)行間隔,即每小時(shí)執(zhí)行一次。

Quartz 還支持多種觸發(fā)器類型和調(diào)度器類型,例如 CronTrigger、CalendarIntervalTrigger、JobStoreTX 等,可以根據(jù)具體的需求進(jìn)行選擇和配置。

以上就是SpringBoot定時(shí)調(diào)度之Timer與Quartz詳解的詳細(xì)內(nèi)容,更多關(guān)于SpringBoot定時(shí)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java基于jdbc實(shí)現(xiàn)簡(jiǎn)單學(xué)生管理系統(tǒng)

    java基于jdbc實(shí)現(xiàn)簡(jiǎn)單學(xué)生管理系統(tǒng)

    本文主要主要介紹了java連接mysql數(shù)據(jù)庫(kù)的一個(gè)簡(jiǎn)單學(xué)生系統(tǒng),通過(guò)jdbc連接數(shù)據(jù)庫(kù)。文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-10-10
  • Java集合中的CopyOnWriteArrayList使用詳解

    Java集合中的CopyOnWriteArrayList使用詳解

    這篇文章主要介紹了Java集合中的CopyOnWriteArrayList使用詳解,CopyOnWriteArrayList是ArrayList的線程安全版本,從他的名字可以推測(cè),CopyOnWriteArrayList是在有寫操作的時(shí)候會(huì)copy一份數(shù)據(jù),然后寫完再設(shè)置成新的數(shù)據(jù),需要的朋友可以參考下
    2023-12-12
  • Spring實(shí)戰(zhàn)之使用Expression接口進(jìn)行表達(dá)式求值操作示例

    Spring實(shí)戰(zhàn)之使用Expression接口進(jìn)行表達(dá)式求值操作示例

    這篇文章主要介紹了Spring實(shí)戰(zhàn)之使用Expression接口進(jìn)行表達(dá)式求值操作,結(jié)合實(shí)例形式分析了Spring操作Expression接口實(shí)現(xiàn)表達(dá)式運(yùn)算的操作技巧與相關(guān)注意事項(xiàng),需要的朋友可以參考下
    2019-12-12
  • 在SpringBoot中無(wú)縫整合Dubbo的實(shí)現(xiàn)過(guò)程

    在SpringBoot中無(wú)縫整合Dubbo的實(shí)現(xiàn)過(guò)程

    微服務(wù)架構(gòu)已經(jīng)成為現(xiàn)代應(yīng)用開(kāi)發(fā)的熱門趨勢(shì),而Dubbo作為一款強(qiáng)大的分布式服務(wù)框架,與Spring?Boot的結(jié)合是構(gòu)建高性能微服務(wù)應(yīng)用的理想選擇,本文將詳細(xì)介紹如何在SpringBoot中無(wú)縫整合Dubbo,需要的朋友可以參考下
    2024-01-01
  • 踩坑批量更新sql報(bào)錯(cuò),實(shí)際sql能夠正常執(zhí)行的問(wèn)題

    踩坑批量更新sql報(bào)錯(cuò),實(shí)際sql能夠正常執(zhí)行的問(wèn)題

    在項(xiàng)目工程遷移過(guò)程中,遇到了一個(gè)批量更新接口在新工程中報(bào)錯(cuò)的問(wèn)題,通過(guò)分析,排除了代碼錯(cuò)誤的可能,最終發(fā)現(xiàn)是由于數(shù)據(jù)庫(kù)連接配置不當(dāng)導(dǎo)致的,在jdbc連接字符串中加入allowMultiQueries=true參數(shù)后,問(wèn)題得以解決,這個(gè)參數(shù)的作用是允許SQL批量執(zhí)行
    2022-12-12
  • jstack和線程dump實(shí)例解析

    jstack和線程dump實(shí)例解析

    這篇文章主要介紹了jstack和線程dump實(shí)例解析,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-01-01
  • Java 輸入流中的read(byte[] b)方法詳解

    Java 輸入流中的read(byte[] b)方法詳解

    這篇文章主要介紹了Java 輸入流中的read(byte[] b)方法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-01-01
  • 在springboot中使用攔截器的步驟詳解

    在springboot中使用攔截器的步驟詳解

    攔截器Interceptor,是SpringMVC中的核心內(nèi)容,在SpringBoot中使用Interceptor,同時(shí)采用全注解開(kāi)發(fā),這篇文章主要介紹了在springboot中使用攔截器的步驟,需要的朋友可以參考下
    2022-01-01
  • 關(guān)于JSqlparser使用攻略(高效的SQL解析工具)

    關(guān)于JSqlparser使用攻略(高效的SQL解析工具)

    這篇文章主要介紹了關(guān)于JSqlparser使用攻略(高效的SQL解析工具),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • Java中類的定義與實(shí)例化詳解

    Java中類的定義與實(shí)例化詳解

    這篇文章主要給大家介紹了關(guān)于Java中類的定義與實(shí)例化的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11

最新評(píng)論