SpringBoot下使用定時任務(wù)的6種方式

1勤哗、使用線程
2、使用Timer類
3挪圾、使用ScheduledExecutorService類
4、使用Quartz
5逐沙、使用spring的@Scheduled注解
6哲思、cron表達(dá)式

  1. 線程實(shí)現(xiàn)
    利用線程可以設(shè)定休眠時間的方式可以實(shí)現(xiàn)簡單的定時任務(wù)邏輯。
public static void main(String[] args){
  //定時任務(wù)間隔時間
  int sleepTime=2*1000;
  new Thread(new Runnable() {
    @Override
    public void run() {
      while (true){
        try {
          System.out.println("Thread方式執(zhí)行一次定時任務(wù)");
          //線程休眠規(guī)定時間
          Thread.sleep(sleepTime);
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
      }
    }
  }).start();
}
  1. Timer類
    Timer類允許調(diào)度一個TimerTask任務(wù)吩案。使用這種方式可以讓你的程序按照某一個頻度執(zhí)行棚赔。
public static void main(String[] args){
  int sleepTime=2*1000;
  TimerTask timerTask = new TimerTask() {
    @Override
    public void run() {
      System.out.println("Timer方式執(zhí)行一次定時任務(wù)");
    }
  };
  new Timer().schedule(timerTask,1,sleepTime);
}
  1. ScheduledExecutorService類
    ScheduledExecutorService,是基于線程池設(shè)計的定時任務(wù)類,每個調(diào)度任務(wù)都會分配到線程池中的一個線程去執(zhí)行,也就是說,任務(wù)是并發(fā)執(zhí)行,互不影響。
    因此徘郭,基于ScheduledExecutorService類的定時任務(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í)行一次定時任務(wù)");
        }
      }
  ,1,sleepTime, TimeUnit.SECONDS);
}
  1. 整合Quartz
    Quartz是一個完全由Java編寫的開源作業(yè)調(diào)度框架残揉,為在 Java 應(yīng)用程序中進(jìn)行作業(yè)調(diào)度提供了簡單卻強(qiáng)大的機(jī)制,要理解它的使用方式胧后,需要先理解它的幾個核心概念:

Job: 表示一個工作,要執(zhí)行的具體內(nèi)容抱环。此接口中只有一個方法壳快,如下:
void execute(JobExecutionContext context)
JobDetail: 表示一個具體的可執(zhí)行的調(diào)度程序,Job 是這個可執(zhí)行程調(diào)度程序所要執(zhí)行的內(nèi)容镇草,另外 JobDetail 還包含了這個任務(wù)調(diào)度的方案和策略眶痰。
Trigger: 代表一個調(diào)度參數(shù)的配置,什么時候去調(diào)梯啤。
Scheduler: 代表一個調(diào)度容器竖伯,一個調(diào)度容器中可以注冊多個 JobDetail 和Trigger。當(dāng) Trigger 與 JobDetail 組合因宇,就可以被 Scheduler 容器調(diào)度了七婴。
有了這些概念之后,我們就可以把Quartz整合到我們的springboot項(xiàng)目中了羽嫡。

引入quartz依賴

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

配置

@Configuration
public 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();
  }
}

測試

public class QuartzTest extends QuartzJobBean {
  @Override
  protected void executeInternal(JobExecutionContext jobExecutionContext){
    System.out.println("quartz執(zhí)行一次定時任務(wù) ");
  }
}
  1. 使用Scheduled注解
    @Scheduled是spring為定時任務(wù)而生的一個注解
/**
 * 開啟定時任務(wù)支持
 */
@EnableScheduling
@Component
public class ScheduledTest {
  private Logger logger = LoggerFactory.getLogger(ScheduledTest.class);
  /**
   * 每15秒執(zhí)行一次定時任務(wù)
   */
  @Scheduled(cron = "0/15 * * * * ? ")
  public void testCron(){
    logger.info("Scheduled 執(zhí)行一次定時任務(wù)");
  }
}
  1. cron表達(dá)式
    cron表達(dá)式是一個字符串其語法為:

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

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

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

通配符 代表的值 解釋
* 所有值 如:時字段為*魂爪,代表每小時都觸發(fā)
? 不指定值 如:周字段為?,代表表達(dá)式不關(guān)心是周幾
- 區(qū)間 如:時字段設(shè)置2-5艰管,代表2滓侍,3,4牲芋,5點(diǎn)鐘時都觸發(fā)
, 多個值 如:時字段設(shè)置2,3,5撩笆,代表2捺球,3,5點(diǎn)都會觸發(fā)
/ 遞增值 如:時字段設(shè)置0/2夕冲,代表每兩個小時觸發(fā)氮兵,時字段設(shè)置 2/5,代表從2時開始每隔5小時觸發(fā)一次
L 最后值 如:日字段設(shè)置L歹鱼,代表本月最后一天
W 最近工作日 如:在日字段設(shè)置13W泣栈,代表沒約13日最近的那個工作日觸發(fā)一次
# 序號 如:在周字段設(shè)置5#2,代表每月的第二個周五

示例:
每2秒執(zhí)行一次:0/5 ?
每5分鐘執(zhí)行一次:0 0/5 * ?
1分弥姻、12分南片、45分執(zhí)行一次:0 1,12,45 * ?
每天23點(diǎn)59分59秒執(zhí)行一次:59 59 23 ?
每月15號凌晨3點(diǎn)執(zhí)行一次:0 0 3 15 * ?
每月最后一天12點(diǎn)執(zhí)行一次:0 0 12 L * ?

在線Cron表達(dá)式生成器地址:http://qqe2.com/cron

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市庭敦,隨后出現(xiàn)的幾起案子疼进,更是在濱河造成了極大的恐慌,老刑警劉巖秧廉,帶你破解...
    沈念sama閱讀 219,366評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件颠悬,死亡現(xiàn)場離奇詭異,居然都是意外死亡定血,警方通過查閱死者的電腦和手機(jī)赔癌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,521評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來澜沟,“玉大人灾票,你說我怎么就攤上這事∶K洌” “怎么了刊苍?”我有些...
    開封第一講書人閱讀 165,689評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長濒析。 經(jīng)常有香客問我正什,道長,這世上最難降的妖魔是什么号杏? 我笑而不...
    開封第一講書人閱讀 58,925評論 1 295
  • 正文 為了忘掉前任婴氮,我火速辦了婚禮,結(jié)果婚禮上盾致,老公的妹妹穿的比我還像新娘主经。我一直安慰自己,他們只是感情好庭惜,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,942評論 6 392
  • 文/花漫 我一把揭開白布罩驻。 她就那樣靜靜地躺著,像睡著了一般护赊。 火紅的嫁衣襯著肌膚如雪惠遏。 梳的紋絲不亂的頭發(fā)上砾跃,一...
    開封第一講書人閱讀 51,727評論 1 305
  • 那天,我揣著相機(jī)與錄音节吮,去河邊找鬼抽高。 笑死,一個胖子當(dāng)著我的面吹牛课锌,可吹牛的內(nèi)容都是我干的厨内。 我是一名探鬼主播,決...
    沈念sama閱讀 40,447評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼渺贤,長吁一口氣:“原來是場噩夢啊……” “哼雏胃!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起志鞍,我...
    開封第一講書人閱讀 39,349評論 0 276
  • 序言:老撾萬榮一對情侶失蹤瞭亮,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后固棚,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體统翩,經(jīng)...
    沈念sama閱讀 45,820評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,990評論 3 337
  • 正文 我和宋清朗相戀三年此洲,在試婚紗的時候發(fā)現(xiàn)自己被綠了厂汗。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,127評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡呜师,死狀恐怖娶桦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情汁汗,我是刑警寧澤衷畦,帶...
    沈念sama閱讀 35,812評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站知牌,受9級特大地震影響祈争,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜角寸,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,471評論 3 331
  • 文/蒙蒙 一菩混、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧袭厂,春花似錦墨吓、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,017評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽亮曹。三九已至橄杨,卻和暖如春秘症,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背式矫。 一陣腳步聲響...
    開封第一講書人閱讀 33,142評論 1 272
  • 我被黑心中介騙來泰國打工乡摹, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人采转。 一個月前我還...
    沈念sama閱讀 48,388評論 3 373
  • 正文 我出身青樓聪廉,卻偏偏與公主長得像,于是被迫代替她去往敵國和親故慈。 傳聞我的和親對象是個殘疾皇子板熊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,066評論 2 355

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