7钞钙、SpringBoot幾種定時(shí)任務(wù)的實(shí)現(xiàn)

  • Timer:這是java自帶的java.util.Timer類,這個(gè)類允許你調(diào)度一個(gè)java.util.TimerTask任務(wù)刊侯。使用這種方式可以讓你的程序按照某一個(gè)頻度執(zhí)行章办,但不能在指定時(shí)間運(yùn)行。一般用的較少滨彻。
  • ScheduledExecutorService:也jdk自帶的一個(gè)類藕届;是基于線程池設(shè)計(jì)的定時(shí)任務(wù)類,每個(gè)調(diào)度任務(wù)都會(huì)分配到線程池中的一個(gè)線程去執(zhí)行,也就是說,任務(wù)是并發(fā)執(zhí)行,互不影響。
  • Spring Task:Spring3.0以后自帶的task疮绷,可以將它看成一個(gè)輕量級(jí)的Quartz翰舌,而且使用起來比Quartz簡單許多。
  • Quartz:這是一個(gè)功能比較強(qiáng)大的的調(diào)度器冬骚,可以讓你的程序在指定時(shí)間執(zhí)行,也可以按照某一個(gè)頻度執(zhí)行懂算,配置起來稍顯復(fù)雜只冻。

Timer方法

public class TestTimer {
    public static void main(String[] args) {
        TimerTask timerTask = new TimerTask() {
            @Override
            public void run() {
                System.out.println("task  run:"+ new Date());
            }
        };
        Timer timer = new Timer();
        //安排指定的任務(wù)在指定的時(shí)間開始進(jìn)行重復(fù)的固定延遲執(zhí)行。這里是每3秒執(zhí)行一次
        timer.schedule(timerTask,10,3000);
    }
}

使用ScheduledExecutorService

該方法跟Timer方法類似计技,可直接看demo

public class TestScheduledExecutorService {
    public static void main(String[] args) {
        ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
        // 參數(shù):1喜德、任務(wù)體 2、首次執(zhí)行的延時(shí)時(shí)間
        //      3垮媒、任務(wù)執(zhí)行間隔 4舍悯、間隔時(shí)間單位
        service.scheduleAtFixedRate(()->System.out.println("task ScheduledExecutorService "+new Date()), 0, 3, TimeUnit.SECONDS);
    }
}

使用SpringTask

  • 首先新建項(xiàng)目,添加依賴
<dependencies>
  <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>
  <dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
  </dependency>
  <dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
  </dependency>
</dependencies>
  • 創(chuàng)建任務(wù)類
@Slf4j
@Component
public class ScheduledService {
    @Scheduled(cron = "0/5 * * * * *")
    public void scheduled(){
        log.info("=====>>>>>使用cron  {}",System.currentTimeMillis());
    }
    @Scheduled(fixedRate = 5000)
    public void scheduled1() {
        log.info("=====>>>>>使用fixedRate{}", System.currentTimeMillis());
    }
    @Scheduled(fixedDelay = 5000)
    public void scheduled2() {
        log.info("=====>>>>>fixedDelay{}",System.currentTimeMillis());
    }
}
  • 在主類上使用@EnableScheduling注解開啟對(duì)定時(shí)任務(wù)的支持睡雇,然后啟動(dòng)項(xiàng)目

可以看到三個(gè)定時(shí)任務(wù)都已經(jīng)執(zhí)行萌衬,并且使同一個(gè)線程中串行執(zhí)行,如果只有一個(gè)定時(shí)任務(wù)它抱,這樣做肯定沒問題秕豫,當(dāng)定時(shí)任務(wù)增多,如果一個(gè)任務(wù)卡死观蓄,會(huì)導(dǎo)致其他任務(wù)也無法執(zhí)行混移。

多線程執(zhí)行

在傳統(tǒng)的Spring項(xiàng)目中,我們可以在xml配置文件添加task的配置侮穿,而在SpringBoot項(xiàng)目中一般使用config配置類的方式添加配置歌径,所以新建一個(gè)AsyncConfig類

@Configuration
@EnableAsync
public class AsyncConfig {
     /*
    此處成員變量應(yīng)該使用@Value從配置中讀取
     */
    private int corePoolSize = 10;
    private int maxPoolSize = 200;
    private int queueCapacity = 10;
    @Bean
    public Executor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(corePoolSize);
        executor.setMaxPoolSize(maxPoolSize);
        executor.setQueueCapacity(queueCapacity);
        executor.initialize();
        return executor;
    }
}

@Configuration:表明該類是一個(gè)配置類
@EnableAsync:開啟異步事件的支持

然后在定時(shí)任務(wù)的類或者方法上添加@Async 。最后重啟項(xiàng)目亲茅,每一個(gè)任務(wù)都是在不同的線程中

執(zhí)行時(shí)間的配置

在上面的定時(shí)任務(wù)中回铛,我們?cè)诜椒ㄉ鲜褂聾Scheduled注解來設(shè)置任務(wù)的執(zhí)行時(shí)間金矛,并且使用三種屬性配置方式:

  • fixedRate:定義一個(gè)按一定頻率執(zhí)行的定時(shí)任務(wù)
  • fixedDelay:定義一個(gè)按一定頻率執(zhí)行的定時(shí)任務(wù),與上面不同的是勺届,改屬性可以配合initialDelay驶俊, 定義該任務(wù)延遲執(zhí)行時(shí)間。
  • cron:通過表達(dá)式來配置任務(wù)執(zhí)行時(shí)間
    cron表達(dá)式詳解
    在線cron表達(dá)式生成:http://qqe2.com/cron/index

整合Quartz

  • 添加依賴
    如果SpringBoot版本是2.0.0以后的免姿,則在spring-boot-starter中已經(jīng)包含了quart的依賴饼酿,則可以直接使用spring-boot-starter-quartz依賴:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-quartz</artifactId>
</dependency>

如果是1.5.9則要使用以下添加依賴:

<dependency>
  <groupId>org.quartz-scheduler</groupId>
  <artifactId>quartz</artifactId>
  <version>2.3.0</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context-support</artifactId>
</dependency>
  • 創(chuàng)建任務(wù)類TestQuartz,該類主要是繼承了QuartzJobBean
public class TestQuartz extends QuartzJobBean {
    /**
     * 執(zhí)行定時(shí)任務(wù)
     * @param jobExecutionContext
     * @throws JobExecutionException
     */
    @Override
    protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("quartz task "+new Date());
    }
}
  • 創(chuàng)建配置類QuartzConfig
@Configuration
public class QuartzConfig {
    @Bean
    public JobDetail teatQuartzDetail(){
        return JobBuilder.newJob(TestQuartz.class).withIdentity("testQuartz").storeDurably().build();
    }

    @Bean
    public Trigger testQuartzTrigger(){
        SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule()
                .withIntervalInSeconds(10)  //設(shè)置時(shí)間周期單位秒
                .repeatForever();
        return TriggerBuilder.newTrigger().forJob(teatQuartzDetail())
                .withIdentity("testQuartz")
                .withSchedule(scheduleBuilder)
                .build();
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末胚膊,一起剝皮案震驚了整個(gè)濱河市故俐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌紊婉,老刑警劉巖药版,帶你破解...
    沈念sama閱讀 222,000評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異喻犁,居然都是意外死亡槽片,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門肢础,熙熙樓的掌柜王于貴愁眉苦臉地迎上來还栓,“玉大人,你說我怎么就攤上這事传轰∈:校” “怎么了?”我有些...
    開封第一講書人閱讀 168,561評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵慨蛙,是天一觀的道長辽聊。 經(jīng)常有香客問我,道長期贫,這世上最難降的妖魔是什么跟匆? 我笑而不...
    開封第一講書人閱讀 59,782評(píng)論 1 298
  • 正文 為了忘掉前任,我火速辦了婚禮唯灵,結(jié)果婚禮上贾铝,老公的妹妹穿的比我還像新娘。我一直安慰自己埠帕,他們只是感情好垢揩,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著敛瓷,像睡著了一般叁巨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上呐籽,一...
    開封第一講書人閱讀 52,394評(píng)論 1 310
  • 那天锋勺,我揣著相機(jī)與錄音蚀瘸,去河邊找鬼。 笑死庶橱,一個(gè)胖子當(dāng)著我的面吹牛贮勃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播苏章,決...
    沈念sama閱讀 40,952評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼寂嘉,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了枫绅?” 一聲冷哼從身側(cè)響起泉孩,我...
    開封第一講書人閱讀 39,852評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎并淋,沒想到半個(gè)月后寓搬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡县耽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評(píng)論 3 341
  • 正文 我和宋清朗相戀三年句喷,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片酬诀。...
    茶點(diǎn)故事閱讀 40,615評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡脏嚷,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出瞒御,到底是詐尸還是另有隱情,我是刑警寧澤神郊,帶...
    沈念sama閱讀 36,303評(píng)論 5 350
  • 正文 年R本政府宣布肴裙,位于F島的核電站,受9級(jí)特大地震影響涌乳,放射性物質(zhì)發(fā)生泄漏蜻懦。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評(píng)論 3 334
  • 文/蒙蒙 一夕晓、第九天 我趴在偏房一處隱蔽的房頂上張望宛乃。 院中可真熱鬧,春花似錦蒸辆、人聲如沸征炼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽谆奥。三九已至,卻和暖如春拂玻,著一層夾襖步出監(jiān)牢的瞬間酸些,已是汗流浹背宰译。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留魄懂,地道東北人沿侈。 一個(gè)月前我還...
    沈念sama閱讀 49,041評(píng)論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像市栗,于是被迫代替她去往敵國和親缀拭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容