SpringBoot-3種定時(shí)任務(wù)

一剑辫、序言

  • 靜態(tài)定時(shí)任務(wù):基于注解方式(@Scheduled)
  • 動(dòng)態(tài)定時(shí)任務(wù):基于接口方式(SchedulingConfigurer)

  • 多線程定時(shí)任務(wù):基于注解(@Async)

二嚎研、靜態(tài)定時(shí)任務(wù)

1.在啟動(dòng)類SpringBootApplication加注解@EnableScheduling

啟動(dòng)類注解

2.task代碼如下:


@Configuration
@EnableScheduling
public class StaticTask {

    @Scheduled(cron ="0/5 * * * * ?")
    public void taskTest(){
              System.out.println("task靜態(tài)定時(shí)任務(wù)開始執(zhí)行"+ LocalDateTime.now());
      }
}

3.用處:多用于項(xiàng)目啟動(dòng)后就不做修改塑荒,不對定時(shí)時(shí)間做修改

三、動(dòng)態(tài)定時(shí)任務(wù)

  • 基于接口的定時(shí)任務(wù):SchedulingConfigurer火邓,在項(xiàng)目中最多使用,cron表達(dá)式在mysql數(shù)據(jù)庫中存儲,人為動(dòng)態(tài)控制任務(wù)執(zhí)行時(shí)間間隔泉蝌。

實(shí)現(xiàn)如下:

1.導(dǎo)入相對應(yīng)的pom.xml

       <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--mybatis起步依賴-->
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.2</version>
        </dependency>
        <!--MYSQL依賴包-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
      <!--druid數(shù)據(jù)庫連接池起步依賴-->
       <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.16</version>
        </dependency>

2.application.yml配置文件
自行修改數(shù)據(jù)庫配置

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&useSSL=false
      username: root
      password: 123456
      driver-class-name: com.mysql.jdbc.Driver
      initial-size: 5
      min-idle: 5
      max-active: 20
      max-wait: 60000

3.數(shù)據(jù)庫sql

DROP DATABASE IF EXISTS `test`;
CREATE DATABASE `test`;
USE `test`;
DROP TABLE IF EXISTS `tb_cron`;
CREATE TABLE `tb_cron`  (
  `cron_id` varchar(30) NOT NULL PRIMARY KEY,
  `cron` varchar(30) NOT NULL  
);
INSERT INTO `tb_cron` VALUES ('1', '0/5 * * * * ?');

4.代碼實(shí)現(xiàn)

@Configuration
@EnableScheduling
public class DynamicTask implements SchedulingConfigurer {
    //初始化cron表達(dá)式
    public static String cron;
    //注入mapper
    @Autowire
    private CronMapper cronMapper;

    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
        Cron cronObject = cronMapper.selectByPrimaryKey("1");
        //cron表達(dá)式
        cron = cronObject.getCron();
        //任務(wù)線程
        Runnable task =new Runnable() {
            @Override
            public void run() {
                  System.out.println("task動(dòng)態(tài)定時(shí)任務(wù)開始執(zhí)行"+ LocalDateTime.now());
            }
        };
        //觸發(fā)器
        Trigger trigger =new Trigger() {
          @Override
            public DatenextExecutionTime(TriggerContext triggerContext) {
                //查詢cron表達(dá)式
                cron =cronMapper.selectByPrimaryKey("1").getCron();
                CronTrigger cronTrigger =new CronTrigger(cron);
                Date nextExecuionTime = cronTrigger.nextExecutionTime(triggerContext);
                return nextExecuionTime;
            }
        };
        scheduledTaskRegistrar.addTriggerTask(task,trigger);
    }
}

5.實(shí)現(xiàn)效果


動(dòng)態(tài)定時(shí)任務(wù)效果圖

四、多線程定時(shí)任務(wù)

1.基于Async注解實(shí)現(xiàn)多任務(wù)線程

@Configuration
@EnableScheduling
@EnableAsync
public class MultiThreadTask {

      @Scheduled(cron ="0/2 * * * * ?")
      @Async
      public void test1(){
            System.out.println("第一個(gè)定時(shí)任務(wù)開始 : " + LocalDateTime.now().toLocalTime() +"線程 : " +                 Thread.currentThread().getName());
    }

      @Scheduled(cron ="0/3 * * * * ?")
      @Async
      public void test2(){
            System.out.println("第二個(gè)定時(shí)任務(wù)開始 : " + LocalDateTime.now().toLocalTime() +"線程 : " + Thread.currentThread().getName());
    }
}

2.實(shí)現(xiàn)效果


多線程定時(shí)任務(wù)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末揩晴,一起剝皮案震驚了整個(gè)濱河市勋陪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌文狱,老刑警劉巖粥鞋,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異瞄崇,居然都是意外死亡呻粹,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門苏研,熙熙樓的掌柜王于貴愁眉苦臉地迎上來等浊,“玉大人,你說我怎么就攤上這事摹蘑〕镅啵” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵衅鹿,是天一觀的道長撒踪。 經(jīng)常有香客問我,道長大渤,這世上最難降的妖魔是什么制妄? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮泵三,結(jié)果婚禮上耕捞,老公的妹妹穿的比我還像新娘衔掸。我一直安慰自己,他們只是感情好俺抽,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布敞映。 她就那樣靜靜地躺著,像睡著了一般磷斧。 火紅的嫁衣襯著肌膚如雪振愿。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天瞳抓,我揣著相機(jī)與錄音埃疫,去河邊找鬼。 笑死孩哑,一個(gè)胖子當(dāng)著我的面吹牛栓霜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播横蜒,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼胳蛮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了丛晌?” 一聲冷哼從身側(cè)響起仅炊,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎澎蛛,沒想到半個(gè)月后抚垄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡谋逻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年呆馁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毁兆。...
    茶點(diǎn)故事閱讀 40,102評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡浙滤,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出气堕,到底是詐尸還是另有隱情纺腊,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布茎芭,位于F島的核電站揖膜,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏梅桩。R本人自食惡果不足惜次氨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望摘投。 院中可真熱鬧煮寡,春花似錦、人聲如沸犀呼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽外臂。三九已至坐儿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間宋光,已是汗流浹背貌矿。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留罪佳,地道東北人逛漫。 一個(gè)月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像赘艳,于是被迫代替她去往敵國和親酌毡。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評論 2 355

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