溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

SpringBoot中使用Scheduling執(zhí)行定時(shí)任務(wù)

發(fā)布時(shí)間:2020-07-09 18:34:44 來(lái)源:網(wǎng)絡(luò) 閱讀:1008 作者:專注地一哥 欄目:編程語(yǔ)言

SpringBoot自帶的 Schedule,可以將它看成一個(gè)輕量級(jí)的Quartz,而且使用起來(lái)比Quartz簡(jiǎn)單許多
以下任務(wù)都是在單線程下執(zhí)行的
第一步 創(chuàng)建SpringBoot項(xiàng)目
第二步 添加@EnableScheduling開啟定時(shí)任務(wù)
第三步 設(shè)置定時(shí)需要執(zhí)行的任務(wù)
有兩種方法設(shè)置執(zhí)行時(shí)機(jī)
第一種我們就且叫他為普通方法
1.fixedRate:會(huì)為所有任務(wù)的開始執(zhí)行時(shí)間編排一個(gè)表,假如fixedRate=5000,且第一次開始時(shí)間是10:00:00
任務(wù) 開始執(zhí)行時(shí)間
任務(wù)1 10:00:00
任務(wù)2 10:00:05
任務(wù)3 10:00:10
任務(wù)4 10:00:15
任務(wù)5 10:00:20當(dāng)執(zhí)行任務(wù)耗時(shí)小于fixedRate設(shè)置的時(shí)間時(shí),將會(huì)按照表中的開始時(shí)間執(zhí)行任務(wù),即每隔5秒會(huì)執(zhí)行一個(gè)任務(wù):
@Component
br/>當(dāng)執(zhí)行任務(wù)耗時(shí)小于fixedRate設(shè)置的時(shí)間時(shí),將會(huì)按照表中的開始時(shí)間執(zhí)行任務(wù),即每隔5秒會(huì)執(zhí)行一個(gè)任務(wù):
@Component
private static final Logger LOG = LoggerFactory.getLogger(TestScheduling.class);
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");@Scheduled(fixedRate=5000)
br/>@Scheduled(fixedRate=5000)
LOG.info("執(zhí)行時(shí)間:{}",sdf.format(new Date()));
}
}
當(dāng)執(zhí)行任務(wù)耗時(shí)大于fixedRate設(shè)置的時(shí)間時(shí),以下一張圖就很清楚的表示了(圖的出處)
解析一下:
fixedRate設(shè)置的也是為fixedRate=5000
第一個(gè)任務(wù)開始執(zhí)行時(shí)間是0:00,耗時(shí)8秒
第二個(gè)任務(wù)本應(yīng)該開始執(zhí)行時(shí)間是0:05,但是第一個(gè)任務(wù)執(zhí)行完時(shí)間已經(jīng)是0:08,所以第二個(gè)任務(wù)在第一個(gè)任務(wù)執(zhí)行完畢之后會(huì)立即執(zhí)行,耗時(shí)是3s
第三個(gè)任務(wù)本應(yīng)該開始執(zhí)行時(shí)間是0:10,但是前兩個(gè)任務(wù)執(zhí)行完畢時(shí)間已經(jīng)是0:11,所以第三個(gè)任務(wù)在第二個(gè)任務(wù)執(zhí)行完畢之后會(huì)立即執(zhí)行,耗時(shí)是6s
第四個(gè)任務(wù),也同第二、第三個(gè)任務(wù)一樣,在預(yù)計(jì)開始執(zhí)行的時(shí)間(這里第四個(gè)任務(wù)預(yù)計(jì)開始執(zhí)行時(shí)間是0:15),因?yàn)樯弦粋€(gè)任務(wù)還沒(méi)有執(zhí)行完畢,所以要等待上一個(gè)人執(zhí)行完畢之后才會(huì)執(zhí)行。
第五個(gè)任務(wù)預(yù)計(jì)開始執(zhí)行時(shí)間是0:20,而前四個(gè)任務(wù)在0:19已經(jīng)執(zhí)行完畢,需要等待1秒,到達(dá)我們預(yù)計(jì)的開始執(zhí)行時(shí)間(0:20)才會(huì)執(zhí)行第五個(gè)任務(wù)。

2.fixedDelay這個(gè)就比之前的fixedRate簡(jiǎn)單得多。如設(shè)置fixedRate=5000.下一個(gè)任務(wù)只需要盯著上一個(gè)任務(wù)的屁股(執(zhí)行完畢的時(shí)間)就行了。上一個(gè)任務(wù)執(zhí)行完畢5秒之后,下一個(gè)任務(wù)就會(huì)開始執(zhí)行
@Component
br/>這個(gè)就比之前的fixedRate簡(jiǎn)單得多。如設(shè)置fixedRate=5000.下一個(gè)任務(wù)只需要盯著上一個(gè)任務(wù)的屁股(執(zhí)行完畢的時(shí)間)就行了。上一個(gè)任務(wù)執(zhí)行完畢5秒之后,下一個(gè)任務(wù)就會(huì)開始執(zhí)行
@Component
private static final Logger LOG = LoggerFactory.getLogger(TestScheduling.class);
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");@Scheduled(fixedDelay=5000)
br/>@Scheduled(fixedDelay=5000)
LOG.info("開始執(zhí)行時(shí)間:{}",sdf.format(new Date()));
try {
Thread.sleep(8000);//讓任務(wù)執(zhí)行的耗時(shí)時(shí)間為8秒,有利于我們的觀察
} catch (InterruptedException e) {
e.printStackTrace();
}
LOG.info("執(zhí)行完畢時(shí)間:{}",sdf.format(new Date()));}
}
3.initialDelay
用于配合fixedRate和fixedDelay使用的,作用是在容器啟動(dòng)后經(jīng)過(guò)多長(zhǎng)時(shí)間才開始執(zhí)行第一次任務(wù)。
4.擴(kuò)展一下
我們先看下一下@Scheduled注解里面有什么
br/>}
}
3.initialDelay
用于配合fixedRate和fixedDelay使用的,作用是在容器啟動(dòng)后經(jīng)過(guò)多長(zhǎng)時(shí)間才開始執(zhí)行第一次任務(wù)。
4.擴(kuò)展一下
我們先看下一下@Scheduled注解里面有什么
br/>@Component
private static final Logger LOG = LoggerFactory.getLogger(TestScheduling.class);
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

@Scheduled(initialDelay = 5000,fixedDelayString = "${com.liang.scheduled:5000}")
public void myTask(){
    LOG.info("開始執(zhí)行時(shí)間:{}",sdf.format(new Date()));
    try {
        Thread.sleep(8000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    LOG.info("執(zhí)行完畢時(shí)間:{}",sdf.format(new Date()));
}

}
?:5000作用是防止application.properties沒(méi)有配置com.liang.scheduled屬性則使用默認(rèn)的5000(如果沒(méi)有寫:5000且application.properties沒(méi)有配置com.liang.scheduled屬性會(huì)報(bào)異常)
執(zhí)行結(jié)果:和我們預(yù)計(jì)的一樣,下一次開始執(zhí)行時(shí)間與上一次結(jié)束時(shí)間間隔正好是10秒。如果去掉application.properties中的com.liang.scheduled屬性,XM返傭代理www.kaifx.cn/broker/xm.html,則間隔時(shí)間是默認(rèn)的5秒,這個(gè)自行驗(yàn)證。
幾乎大部分的應(yīng)用都會(huì)有定時(shí)執(zhí)行任務(wù)的需求。使用Spring Boot的Scheduling Tasks能夠提高您的開發(fā)效率。這篇文章將介紹怎么通過(guò)Spring Boot去做調(diào)度任務(wù)。構(gòu)建工程
創(chuàng)建一個(gè)Springboot工程,在它的程序入口加上@EnableScheduling,開啟調(diào)度任務(wù)。
br/>構(gòu)建工程
創(chuàng)建一個(gè)Springboot工程,在它的程序入口加上@EnableScheduling,開啟調(diào)度任務(wù)。
br/>@EnableScheduling

public static void main(String[] args) {
    SpringApplication.run(SpringbootScheduledApplication.class, args);
}

}
創(chuàng)建定時(shí)任務(wù)
創(chuàng)建一個(gè)定時(shí)任務(wù),每過(guò)2s在控制臺(tái)打印當(dāng)前時(shí)間。

@Component
public class ScheduledTasks {
private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class);

private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

@Scheduled(fixedRate = 2000)
public void reportCurrentTime() {
    log.info("The time is : " + dateFormat.format(new Date()));
}

}

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI