欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringBoot下使用定時(shí)任務(wù)的方式全揭秘(6種)

 更新時(shí)間:2019年02月14日 09:00:56   作者:jaybril  
這篇文章主要介紹了SpringBoot下使用定時(shí)任務(wù)的方式全揭秘(6種),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧

本文旨在用通俗的語(yǔ)言講述枯燥的知識(shí)

定時(shí)任務(wù)作為一種系統(tǒng)調(diào)度工具,在一些需要有定時(shí)作業(yè)的系統(tǒng)中應(yīng)用廣泛,如每逢某個(gè)時(shí)間點(diǎn)統(tǒng)計(jì)數(shù)據(jù)、在將來(lái)某個(gè)時(shí)刻執(zhí)行某些動(dòng)作...定時(shí)任務(wù)在主流開(kāi)發(fā)語(yǔ)言均提供相應(yīng)的API供開(kāi)發(fā)者調(diào)用,在Java中,實(shí)現(xiàn)定時(shí)任務(wù)有很多種方式,原生的方式實(shí)現(xiàn)一個(gè)完整定時(shí)任務(wù)需要由Timer、TimerTask兩個(gè)類(lèi),Timer是定時(shí)器類(lèi),用來(lái)按計(jì)劃開(kāi)啟后臺(tái)線程執(zhí)行指定任務(wù),TimerTask一個(gè)抽象類(lèi),它的子類(lèi)代表一個(gè)可以被Timer計(jì)劃的任務(wù)。除此之外,還可以用ScheduledExecutorService類(lèi)或者使用第三方j(luò)ar庫(kù)Quartz,其中Quartz是一個(gè)優(yōu)秀的定時(shí)任務(wù)框架,發(fā)展至今已經(jīng)非常成熟,以致后來(lái)其他的定時(shí)任務(wù)框架的核心思想或底層大多源于Quartz。

springboot作為Java的一種開(kāi)發(fā)框架,在springboot項(xiàng)目中實(shí)現(xiàn)定時(shí)任務(wù)不僅可以使用Java提供的原生方式,還可以使用springboot提供的定時(shí)任務(wù)API,下面,小編把Java原生和springboot所有的實(shí)現(xiàn)定時(shí)任務(wù)的方式做一個(gè)整合。

文章提綱:
1、使用線程
2、使用Timer類(lèi)
3、使用ScheduledExecutorService類(lèi)
4、使用Quartz
5、使用spring的@Scheduled注解
6、cron表達(dá)式

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

利用線程可以設(shè)定休眠時(shí)間的方式可以實(shí)現(xiàn)簡(jiǎ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類(lèi)

Timer類(lèi)允許調(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類(lèi)

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

因此,基于ScheduledExecutorService類(lèi)的定時(shí)任務(wù)類(lèi),歸根到底也是基于線程的調(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編寫(xiě)的開(kāi)源作業(yè)調(diào)度框架,為在 Java 應(yīng)用程序中進(jìn)行作業(yè)調(diào)度提供了簡(jiǎn)單卻強(qiáng)大的機(jī)制,要理解它的使用方式,需要先理解它的幾個(gè)核心概念:

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)目中了。

引入quartz依賴(lài)

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

測(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)之后多長(zhǎng)時(shí)間再執(zhí)行
  long fixedDelay() default -1;
//支持占位符形式的字符串類(lèi)型的fixedDelay
  String fixedDelayString() default "";
//上一次開(kāi)始執(zhí)行時(shí)間點(diǎn)之后多長(zhǎng)時(shí)間再執(zhí)行
  long fixedRate() default -1;
//支持占位符形式的字符串類(lèi)型的fixedRateString
  String fixedRateString() default "";
//第一次延遲多長(zhǎng)時(shí)間后再執(zhí)行  
  long initialDelay() default -1;
//支持占位符形式的字符串類(lèi)型的initialDelay
  String initialDelayString() default "";
}

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

開(kāi)啟定時(shí)任務(wù)支持

@SpringBootApplication
/**
 * 開(kāi)啟定時(shí)任務(wù)支持
 */
@EnableScheduling
public 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());
  }
}

使用

@Component
public 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è)字符串其語(yǔ)法為:

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

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

順序 取值范圍 特殊字符串范圍
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,代表每?jī)蓚€(gè)小時(shí)觸發(fā),時(shí)字段設(shè)置 2/5,代表從2時(shí)開(kāi)始每隔5小時(shí)觸發(fā)一次
L 最后值 如:日字段設(shè)置L,代表本月最后一天
W 最近工作日 如:在日字段設(shè)置13W,代表沒(méi)約13日最近的那個(gè)工作日觸發(fā)一次
# 序號(hào) 如:在周字段設(shè)置5#2,代表每月的第二個(gè)周五

示例:
每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號(hào)凌晨3點(diǎn)執(zhí)行一次:0 0 3 15 * ?
每月最后一天12點(diǎn)執(zhí)行一次:0 0 12 L * ?

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • springboot配置開(kāi)發(fā)和測(cè)試環(huán)境并添加啟動(dòng)路徑方式

    springboot配置開(kāi)發(fā)和測(cè)試環(huán)境并添加啟動(dòng)路徑方式

    這篇文章主要介紹了springboot配置開(kāi)發(fā)和測(cè)試環(huán)境并添加啟動(dòng)路徑方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Spring SseEmitter推送消息及常用方法

    Spring SseEmitter推送消息及常用方法

    SseEmitter 是 Spring Framework 提供的用于支持 Server-Sent Events(SSE)的類(lèi),它允許服務(wù)器端向客戶(hù)端推送事件流,實(shí)現(xiàn)服務(wù)器到客戶(hù)端的單向通信,這篇文章主要介紹了Spring SseEmitter推送消息,需要的朋友可以參考下
    2024-07-07
  • Java8新特性Stream的完全使用指南

    Java8新特性Stream的完全使用指南

    這篇文章主要給大家介紹了關(guān)于Java8新特性Stream的完全使用指南,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java8具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • Java中EnvironmentAware 接口的作用

    Java中EnvironmentAware 接口的作用

    本文主要介紹了Java中EnvironmentAware 接口的作用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • Java之Spring Bean 作用域和生命周期

    Java之Spring Bean 作用域和生命周期

    這篇文章主要介紹了Java Bean的作用域和生命周期,Bean 的作用域是指 Bean 在 Spring 整個(gè)框架中的某種行為模式,所謂的?命周期指的是?個(gè)對(duì)象從誕?到銷(xiāo)毀的整個(gè)?命過(guò)程,我們把這個(gè)過(guò)程就叫做?個(gè)對(duì)象的?命周期,感興趣的同學(xué)可以參考閱讀
    2023-04-04
  • idea創(chuàng)建Springboot多模塊項(xiàng)目(聚合項(xiàng)目)

    idea創(chuàng)建Springboot多模塊項(xiàng)目(聚合項(xiàng)目)

    文章詳細(xì)介紹了如何在idea創(chuàng)建Springboot多模塊項(xiàng)目(聚合項(xiàng)目),包括創(chuàng)建父工程和子工程、編輯pom.xml文件、編寫(xiě)代碼和測(cè)試,還介紹了如何處理Maven視圖中的層級(jí)關(guān)系,并展示了如何同時(shí)啟動(dòng)多個(gè)子項(xiàng)目
    2024-11-11
  • Mybatis實(shí)現(xiàn)分頁(yè)查詢(xún)的詳細(xì)流程

    Mybatis實(shí)現(xiàn)分頁(yè)查詢(xún)的詳細(xì)流程

    這篇文章主要給大家介紹了關(guān)于Mybatis實(shí)現(xiàn)分頁(yè)查詢(xún)的詳細(xì)流程,MyBatis是支持普通SQL查詢(xún),存儲(chǔ)過(guò)程和高級(jí)映射的優(yōu)秀持久層框架,需要的朋友可以參考下
    2023-08-08
  • linux系統(tǒng)下查看jdk版本、路徑及配置環(huán)境變量

    linux系統(tǒng)下查看jdk版本、路徑及配置環(huán)境變量

    在Linux系統(tǒng)中,配置JDK環(huán)境變量是非常重要的,它可以讓你在終端中直接使用Java命令,這篇文章主要給大家介紹了關(guān)于linux系統(tǒng)下查看jdk版本、路徑及配置環(huán)境變量的相關(guān)資料,需要的朋友可以參考下
    2024-01-01
  • jdbc實(shí)現(xiàn)連接和增刪改查功能

    jdbc實(shí)現(xiàn)連接和增刪改查功能

    這篇文章主要為大家詳細(xì)介紹了jdbc實(shí)現(xiàn)連接和基本的增刪改查功能,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-02-02
  • IntelliJ IDEA 15款超級(jí)牛逼插件推薦(自用,超級(jí)牛逼)

    IntelliJ IDEA 15款超級(jí)牛逼插件推薦(自用,超級(jí)牛逼)

    這篇文章主要給大家推薦介紹了IntelliJ IDEA 15款超級(jí)牛逼插件,這15款插件都是自用的,真的非常推薦,需要的朋友可以參考下
    2020-11-11

最新評(píng)論