最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

本文旨在用通俗的語言講述枯燥的知識

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

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

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

1. 線程實現

利用線程可以設定休眠時間的方式可以實現簡單的定時任務邏輯。

  public static void main(String[] args){
    //定時任務間隔時間
    int sleepTime=2*1000;
    new Thread(new Runnable() {
      @Override
      public void run() {
        while (true){
          try {
            System.out.println("Thread方式執(zhí)行一次定時任務");
            //線程休眠規(guī)定時間
            Thread.sleep(sleepTime);
          } catch (InterruptedException e) {
            e.printStackTrace();
          }
        }
      }
    }).start();
  }

2. Timer類

Timer類允許調度一個TimerTask任務。使用這種方式可以讓你的程序按照某一個頻度執(zhí)行。

  public static void main(String[] args){
    int sleepTime=2*1000;
    TimerTask timerTask = new TimerTask() {
      @Override
      public void run() {
        System.out.println("Timer方式執(zhí)行一次定時任務");
      }
    };
    new Timer().schedule(timerTask,1,sleepTime);
  }

3. ScheduledExecutorService類

ScheduledExecutorService,是基于線程池設計的定時任務類,每個調度任務都會分配到線程池中的一個線程去執(zhí)行,也就是說,任務是并發(fā)執(zhí)行,互不影響。

因此,基于ScheduledExecutorService類的定時任務類,歸根到底也是基于線程的調度實現的。

  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í)行一次定時任務");
          }
        }
    ,1,sleepTime, TimeUnit.SECONDS);
  }

4. 整合Quartz

Quartz是一個完全由Java編寫的開源作業(yè)調度框架,為在 Java 應用程序中進行作業(yè)調度提供了簡單卻強大的機制,要理解它的使用方式,需要先理解它的幾個核心概念:

Job: 表示一個工作,要執(zhí)行的具體內容。此接口中只有一個方法,如下:
void execute(JobExecutionContext context)

  1. JobDetail: 表示一個具體的可執(zhí)行的調度程序,Job 是這個可執(zhí)行程調度程序所要執(zhí)行的內容,另外 JobDetail 還包含了這個任務調度的方案和策略。
  2. Trigger: 代表一個調度參數的配置,什么時候去調。
  3. Scheduler: 代表一個調度容器,一個調度容器中可以注冊多個 JobDetail 和Trigger。當 Trigger 與 JobDetail 組合,就可以被 Scheduler 容器調度了。

有了這些概念之后,我們就可以把Quartz整合到我們的springboot項目中了。

引入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í)行一次定時任務 ");
  }
}

5. 使用Scheduled注解

@Scheduled是spring為定時任務而生的一個注解,查看注解的源碼:

@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Schedules.class)
public @interface Scheduled {
//cron表達式
  String cron() default "";
//接收一個java.util.TimeZone#ID。
  String zone() default "";
//上一次執(zhí)行完畢時間點之后多長時間再執(zhí)行
  long fixedDelay() default -1;
//支持占位符形式的字符串類型的fixedDelay
  String fixedDelayString() default "";
//上一次開始執(zhí)行時間點之后多長時間再執(zhí)行
  long fixedRate() default -1;
//支持占位符形式的字符串類型的fixedRateString
  String fixedRateString() default "";
//第一次延遲多長時間后再執(zhí)行  
  long initialDelay() default -1;
//支持占位符形式的字符串類型的initialDelay
  String initialDelayString() default "";
}

可以看出:Scheduled注解中的參數用來設置“定時”動作,通常情況下,比較常用的參數是cron(),這意味著我們需要學會一些cron表達式相關的語法,但由于內容較多,篇幅較長,在這里暫不鋪開講解,我們把cron語法相關放到文章最后,在此先講解如何用Scheduled注解來實現定時任務。

開啟定時任務支持

@SpringBootApplication
/**
 * 開啟定時任務支持
 */
@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í)行一次定時任務
   */
  @Scheduled(cron = "0/15 * * * * ? ")
  public void testCron(){
    logger.info("Scheduled 執(zhí)行一次定時任務");
  }
}

6. cron表達式

cron表達式是一個字符串其語法為:

[秒] [分] [小時] [日] [月] [周] [年]

其中[年]為非必填項,因此通常cron表達式通常由6或7部分內容組成,內容的取值為數字或者一些cron表達式約定的特殊字符,這些特殊字符稱為“通配符”,每一個通配符分別代指一種值。cron表達式可以用這樣的表格來表示:

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

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

通配符 代表的值 解釋
* 所有值 如:時字段為*,代表每小時都觸發(fā)
? 不指定值 如:周字段為?,代表表達式不關心是周幾
- 區(qū)間 如:時字段設置2-5,代表2,3,4,5點鐘時都觸發(fā)
, 多個值 如:時字段設置2,3,5,代表2,3,5點都會觸發(fā)
/ 遞增值 如:時字段設置0/2,代表每兩個小時觸發(fā),時字段設置 2/5,代表從2時開始每隔5小時觸發(fā)一次
L 最后值 如:日字段設置L,代表本月最后一天
W 最近工作日 如:在日字段設置13W,代表沒約13日最近的那個工作日觸發(fā)一次
# 序號 如:在周字段設置5#2,代表每月的第二個周五

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

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • Flask實現異步非阻塞請求功能實例解析

    Flask實現異步非阻塞請求功能實例解析

    這篇文章主要介紹了Flask實現異步非阻塞請求功能實例解析,分享了相關代碼示例,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下
    2018-02-02
  • Java中常用數據類型的輸入輸出詳解

    Java中常用數據類型的輸入輸出詳解

    本文主要介紹了Java中幾個常用的數據類型是如何輸入和輸出的,例如:Char型、int型、double型、數組、字符串等,對我們學習java有一定的幫助,感興趣的小伙伴可以跟隨小編一起學習學習
    2021-12-12
  • 淺談java獲取服務器基本信息

    淺談java獲取服務器基本信息

    這篇文章主要介紹了java獲取服務器基本信息,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-03-03
  • Guava Cache的使用簡介

    Guava Cache的使用簡介

    這篇文章主要介紹了Guava Cache的使用簡介,幫助大家更好的理解和學習使用Guava Cache,感興趣的朋友可以了解下
    2021-03-03
  • springboot指定profiles啟動失敗問題及解決

    springboot指定profiles啟動失敗問題及解決

    這篇文章主要介紹了springboot指定profiles啟動失敗問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-04-04
  • java學習筆記之馬踏棋盤算法

    java學習筆記之馬踏棋盤算法

    這篇文章主要為大家詳細介紹了java學習筆記之馬踏棋盤算法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-02-02
  • Micronaut框架的簡單使用介紹

    Micronaut框架的簡單使用介紹

    這篇文章主要介紹了Micronaut框架的簡單使用介紹,幫助大家更好的理解和學習使用Micronaut,感興趣的朋友可以了解下
    2021-04-04
  • Java中RabbitMQ消息隊列的交換機詳解

    Java中RabbitMQ消息隊列的交換機詳解

    這篇文章主要介紹了Java中的RabbitMQ交換機詳解,消息隊列是指利用高效可靠的消息傳遞機制進行與平臺無關的數據交流,并基于數據通信來進行分布式系統(tǒng)的集成,是在消息的傳輸過程中保存消息的容器,需要的朋友可以參考下
    2023-07-07
  • SpringCloud Gateway動態(tài)轉發(fā)后端服務實現過程講解

    SpringCloud Gateway動態(tài)轉發(fā)后端服務實現過程講解

    這篇文章主要介紹了SpringCloud Gateway動態(tài)轉發(fā)后端服務實現過程,簡單的路由轉發(fā)可以通過SpringCloudGateway的配置文件實現,在一些業(yè)務場景種,會需要動態(tài)替換路由配置中的后端服務地址,單純靠配置文件無法滿足這種需求
    2023-03-03
  • Java?Float?保留小數位精度的實現

    Java?Float?保留小數位精度的實現

    這篇文章主要介紹了Java?Float?保留小數位精度的實現方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-12-12

最新評論

瑞金市| 宕昌县| 枣庄市| 昌平区| 佛学| 柏乡县| 芜湖县| 万年县| 衡南县| 从化市| 新营市| 武威市| 大兴区| 林周县| 巧家县| 庆阳市| 桐柏县| 木兰县| 鄯善县| 华容县| 正蓝旗| 封开县| 太谷县| 天峨县| 河东区| 鲁山县| 汪清县| 信阳市| 城步| 南陵县| 扶绥县| 行唐县| 浙江省| 铁岭市| 星子县| 泸定县| 玛纳斯县| 瑞金市| 老河口市| 金秀| 望奎县|