SpringBoot中怎么使用定時(shí)任務(wù)

本篇文章為大家展示了SpringBoot中怎么使用定時(shí)任務(wù),內(nèi)容簡明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

創(chuàng)新互聯(lián)專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于網(wǎng)站設(shè)計(jì)制作、成都做網(wǎng)站、北碚網(wǎng)絡(luò)推廣、小程序定制開發(fā)、北碚網(wǎng)絡(luò)營銷、北碚企業(yè)策劃、北碚品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)為所有大學(xué)生創(chuàng)業(yè)者提供北碚建站搭建服務(wù),24小時(shí)服務(wù)熱線:13518219792,官方網(wǎng)址:muchs.cn

1. 線程實(shí)現(xiàn)

利用線程可以設(shè)定休眠時(shí)間的方式可以實(shí)現(xiàn)簡單的定時(shí)任務(wù)邏輯。

    public static void main(String[] args){        //定時(shí)任務(wù)間隔時(shí)間
        int sleepTime=2*1000;        new Thread(new Runnable() {            @Override
            public void run() {                while (true){                    try {
                        System.out.println("Thread方式執(zhí)行一次定時(shí)任務(wù)");                        //線程休眠規(guī)定時(shí)間
                        Thread.sleep(sleepTime);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }

2. Timer類

Timer類允許調(diào)度一個(gè)TimerTask任務(wù)。使用這種方式可以讓你的程序按照某一個(gè)頻度執(zhí)行。

    public static void main(String[] args){        int sleepTime=2*1000;
        TimerTask timerTask = new TimerTask() {            @Override
            public void run() {
                System.out.println("Timer方式執(zhí)行一次定時(shí)任務(wù)");
            }
        };        new Timer().schedule(timerTask,1,sleepTime);
    }

3. ScheduledExecutorService類

ScheduledExecutorService,是基于線程池設(shè)計(jì)的定時(shí)任務(wù)類,每個(gè)調(diào)度任務(wù)都會(huì)分配到線程池中的一個(gè)線程去執(zhí)行,也就是說,任務(wù)是并發(fā)執(zhí)行,互不影響。
因此,基于ScheduledExecutorService類的定時(shí)任務(wù)類,歸根到底也是基于線程的調(diào)度實(shí)現(xiàn)的。

    public static void main(String[] args){        int sleepTime=2*1000;
        ScheduledExecutorService scheduledExecutor = Executors.newSingleThreadScheduledExecutor();
        scheduledExecutor.scheduleAtFixedRate(                new Runnable() {                    @Override
                    public void run() {
                        System.out.println("ScheduledExecutorService方式執(zhí)行一次定時(shí)任務(wù)");
                    }
                }
        ,1,sleepTime, TimeUnit.SECONDS);
    }

4. 整合Quartz

Quartz是一個(gè)完全由Java編寫的開源作業(yè)調(diào)度框架,為在 Java 應(yīng)用程序中進(jìn)行作業(yè)調(diào)度提供了簡單卻強(qiáng)大的機(jī)制,要理解它的使用方式,需要先理解它的幾個(gè)核心概念:

  1. Job: 表示一個(gè)工作,要執(zhí)行的具體內(nèi)容。此接口中只有一個(gè)方法,如下:

void execute(JobExecutionContext context)

  1. JobDetail: 表示一個(gè)具體的可執(zhí)行的調(diào)度程序,Job 是這個(gè)可執(zhí)行程調(diào)度程序所要執(zhí)行的內(nèi)容,另外 JobDetail 還包含了這個(gè)任務(wù)調(diào)度的方案和策略。

  2. Trigger: 代表一個(gè)調(diào)度參數(shù)的配置,什么時(shí)候去調(diào)。

  3. Scheduler: 代表一個(gè)調(diào)度容器,一個(gè)調(diào)度容器中可以注冊(cè)多個(gè) JobDetail 和Trigger。當(dāng) Trigger 與 JobDetail 組合,就可以被 Scheduler 容器調(diào)度了。

有了這些概念之后,我們就可以把Quartz整合到我們的springboot項(xiàng)目中了。

  1. 引入quartz依賴

<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-quartz</artifactId></dependency>
  1. 配置

@Configurationpublic class QuartzConfig {    @Bean
    public JobDetail quartzDetail(){        return JobBuilder.newJob(QuartzTest.class).withIdentity("QuartzTest").storeDurably().build();
    }    @Bean
    public SimpleTrigger quartzTrigger(){
        SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInSeconds(10)
                .repeatForever();        return TriggerBuilder.newTrigger().forJob(quartzDetail())
                .withIdentity("QuartzTest")
                .withSchedule(scheduleBuilder)
                .build();
    }
}
  1. 測(cè)試

public class QuartzTest extends QuartzJobBean {    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext){
        System.out.println("quartz執(zhí)行一次定時(shí)任務(wù) ");
    }
}

5. 使用Scheduled注解

@Scheduled是spring為定時(shí)任務(wù)而生的一個(gè)注解,查看注解的源碼:

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})@Retention(RetentionPolicy.RUNTIME)@Documented@Repeatable(Schedules.class)public @interface Scheduled {//cron表達(dá)式
    String cron() default "";//接收一個(gè)java.util.TimeZone#ID。
    String zone() default "";//上一次執(zhí)行完畢時(shí)間點(diǎn)之后多長時(shí)間再執(zhí)行
    long fixedDelay() default -1;//支持占位符形式的字符串類型的fixedDelay
    String fixedDelayString() default "";//上一次開始執(zhí)行時(shí)間點(diǎn)之后多長時(shí)間再執(zhí)行
    long fixedRate() default -1;//支持占位符形式的字符串類型的fixedRateString
    String fixedRateString() default "";//第一次延遲多長時(shí)間后再執(zhí)行    
    long initialDelay() default -1;//支持占位符形式的字符串類型的initialDelay
    String initialDelayString() default "";
}

可以看出:Scheduled注解中的參數(shù)用來設(shè)置“定時(shí)”動(dòng)作,通常情況下,比較常用的參數(shù)是cron(),這意味著我們需要學(xué)會(huì)一些cron表達(dá)式相關(guān)的語法,但由于內(nèi)容較多,篇幅較長,在這里暫不鋪開講解,我們把cron語法相關(guān)放到文章最后,在此先講解如何用Scheduled注解來實(shí)現(xiàn)定時(shí)任務(wù)。

  1. 開啟定時(shí)任務(wù)支持

@SpringBootApplication/**
 * 開啟定時(shí)任務(wù)支持
 */@EnableSchedulingpublic class TestApplication  extends SpringBootServletInitializer {    public static void main(String[] args) {
        SpringApplication.run(TestApplication.class, args);
    }    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder builder) {        return builder.sources(this.getClass());
    }
}
  1. 使用

@Componentpublic class ScheduledTest {    private Logger logger = LoggerFactory.getLogger(ScheduledTest.class);    /**
     * 每15秒執(zhí)行一次定時(shí)任務(wù)
     */
    @Scheduled(cron = "0/15 * * * * ? ")    public void testCron(){
        logger.info("Scheduled 執(zhí)行一次定時(shí)任務(wù)");
    }
}

6. cron表達(dá)式

cron表達(dá)式是一個(gè)字符串其語法為:

[秒] [分] [小時(shí)] [日] [月] [周] [年]

其中[年]為非必填項(xiàng),因此通常cron表達(dá)式通常由6或7部分內(nèi)容組成,內(nèi)容的取值為數(shù)字或者一些cron表達(dá)式約定的特殊字符,這些特殊字符稱為“通配符”,每一個(gè)通配符分別代指一種值。cron表達(dá)式可以用這樣的表格來表示:

順序取值范圍特殊字符串范圍
0~60, - * /
0-60, - * /
時(shí)0-23, - * /
1-31, - * /
1-12 / JAN-DEC, - * ? / L W
1-7 / SUN-SAT, - * ? / L #
年(可省略)1970-2099, - * /

其中通配符的解釋以及作用如下:

通配符代表的值解釋
*所有值如:時(shí)字段為*,代表每小時(shí)都觸發(fā)
?不指定值如:周字段為?,代表表達(dá)式不關(guān)心是周幾
-區(qū)間如:時(shí)字段設(shè)置2-5,代表2,3,4,5點(diǎn)鐘時(shí)都觸發(fā)
,多個(gè)值如:時(shí)字段設(shè)置2,3,5,代表2,3,5點(diǎn)都會(huì)觸發(fā)
/遞增值如:時(shí)字段設(shè)置0/2,代表每兩個(gè)小時(shí)觸發(fā),時(shí)字段設(shè)置 2/5,代表從2時(shí)開始每隔5小時(shí)觸發(fā)一次
L最后值如:日字段設(shè)置L,代表本月最后一天
W最近工作日如:在日字段設(shè)置13W,代表沒約13日最近的那個(gè)工作日觸發(fā)一次
#序號(hào)如:在周字段設(shè)置5#2,代表每月的第二個(gè)周五

上述內(nèi)容就是SpringBoot中怎么使用定時(shí)任務(wù),你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

網(wǎng)頁名稱:SpringBoot中怎么使用定時(shí)任務(wù)
文章URL:http://muchs.cn/article30/gedopo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)建站、網(wǎng)站建設(shè)、ChatGPT、網(wǎng)站營銷域名注冊(cè)、做網(wǎng)站

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都seo排名網(wǎng)站優(yōu)化