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

SpringBoot 實現(xiàn)定時任務(wù)的方法詳解

 更新時間:2019年08月22日 08:30:16   作者:風(fēng)塵博客  
這篇文章主要介紹了SpringBoot 實現(xiàn)定時任務(wù)的方法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

一、定時任務(wù)實現(xiàn)的幾種方式:

Timer

這是java自帶的java.util.Timer類,這個類允許你調(diào)度一個java.util.TimerTask任務(wù)。使用這種方式可以讓你的程序按照某一個頻度執(zhí)行,但不能在指定時間運行。一般用的較少。

ScheduledExecutorService

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

Spring Task

Spring3.0以后自帶的task,可以將它看成一個輕量級的Quartz,而且使用起來比Quartz簡單許多。

Quartz

這是一個功能比較強大的的調(diào)度器,可以讓你的程序在指定時間執(zhí)行,也可以按照某一個頻度執(zhí)行,配置起來稍顯復(fù)雜。

二、基于SpringBoot的定時任務(wù)

使用SpringBoot 自帶的定時任務(wù),只需要添加相應(yīng)的注解就可以實現(xiàn)

2.1 導(dǎo)入SpringBoot啟動包

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-parent</artifactId>
  <version>2.1.1.RELEASE</version>
</dependency>

2.2 啟動類啟用定時

在啟動類上面加上@EnableScheduling即可開啟定時

@SpringBootApplication
@EnableScheduling // 開啟定時
public class SpringBootDemoTimeTaskApplication {
  private static final Logger logger = LoggerFactory.getLogger(SpringBootDemoTimeTaskApplication.class);
  public static void main(String[] args) {
    SpringApplication.run(SpringBootDemoTimeTaskApplication.class);
    logger.info("SpringBootDemoTimeTaskApplication start!");
  }
}

2.3 創(chuàng)建定時任務(wù)實現(xiàn)類SchedulerTask

@Component
public class SchedulerTask {
  private static final Logger logger = LoggerFactory.getLogger(SchedulerTask.class);
  /**
   * @Scheduled(fixedRate = 6000) :上一次開始執(zhí)行時間點之后6秒再執(zhí)行
   * @Scheduled(fixedDelay = 6000) :上一次執(zhí)行完畢時間點之后6秒再執(zhí)行
   * @Scheduled(initialDelay=1000, fixedRate=6000) :第一次延遲1秒后執(zhí)行,之后按fixedRate的規(guī)則每6秒執(zhí)行一次
   * @Scheduled(cron=""):詳見cron表達式http://www.pppet.net/
   */
  @Scheduled(fixedRate = 5000)
  public void scheduled1() {
    logger.info("=====>>>>>使用fixedRate執(zhí)行定時任務(wù)");
  }
  @Scheduled(fixedDelay = 10000)
  public void scheduled2() {
    logger.info("=====>>>>>使用fixedDelay執(zhí)行定時任務(wù)");
  }
  @Scheduled(cron="*/6 * * * * ?")
  private void scheduled3(){
    logger.info("使用cron執(zhí)行定時任務(wù)");
  }
}

運行結(jié)果:

2019-03-09 17:33:05.681 INFO 7752 --- [      main] c.v.t.SpringBootDemoTimeTaskApplication : SpringBootDemoTimeTaskApplication start!
2019-03-09 17:33:06.002 INFO 7752 --- [  scheduling-1] cn.van.task.service.SchedulerTask    : 使用cron執(zhí)行定時任務(wù)
2019-03-09 17:33:10.680 INFO 7752 --- [  scheduling-1] cn.van.task.service.SchedulerTask    : =====>>>>>使用fixedRate執(zhí)行定時任務(wù)
2019-03-09 17:33:12.003 INFO 7752 --- [  scheduling-1] cn.van.task.service.SchedulerTask    : 使用cron執(zhí)行定時任務(wù)
2019-03-09 17:33:15.676 INFO 7752 --- [  scheduling-1] cn.van.task.service.SchedulerTask    : =====>>>>>使用fixedRate執(zhí)行定時任務(wù)
2019-03-09 17:33:15.676 INFO 7752 --- [  scheduling-1] cn.van.task.service.SchedulerTask    : =====>>>>>使用fixedDelay執(zhí)行定時任務(wù)
2019-03-09 17:33:18.002 INFO 7752 --- [  scheduling-1] cn.van.task.service.SchedulerTask    : 使用cron執(zhí)行定時任務(wù)
2019-03-09 17:33:20.677 INFO 7752 --- [  scheduling-1] cn.van.task.service.SchedulerTask    : =====>>>>>使用fixedRate執(zhí)行定時任務(wù)
2019-03-09 17:33:24.002 INFO 7752 --- [  scheduling-1] cn.van.task.service.SchedulerTask    : 使用cron執(zhí)行定時任務(wù)
2019-03-09 17:33:25.680 INFO 7752 --- [  scheduling-1] cn.van.task.service.SchedulerTask    : =====>>>>>使用fixedRate執(zhí)行定時任務(wù)
2019-03-09 17:33:25.681 INFO 7752 --- [  scheduling-1] cn.van.task.service.SchedulerTask    : =====>>>>>使用fixedDelay執(zhí)行定時任務(wù)
2019-03-09 17:33:30.005 INFO 7752 --- [  scheduling-1] cn.van.task.service.SchedulerTask    : 使用cron執(zhí)行定時任務(wù)
2019-03-09 17:33:30.680 INFO 7752 --- [  scheduling-1] cn.van.task.service.SchedulerTask    : =====>>>>>使用fixedRate執(zhí)行定時任務(wù)
2019-03-09 17:33:35.680 INFO 7752 --- [  scheduling-1] cn.van.task.service.SchedulerTask    : =====>>>>>使用fixedRate執(zhí)行定時任務(wù)
2019-03-09 17:33:35.682 INFO 7752 --- [  scheduling-1] cn.van.task.service.SchedulerTask    : =====>>>>>使用fixedDelay執(zhí)行定時任務(wù)

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

在上面的定時任務(wù)中,我們在方法上使用@Scheduled注解來設(shè)置任務(wù)的執(zhí)行時間,并且使用三種屬性配置方式:

fixedRate:定義一個按一定頻率執(zhí)行的定時任務(wù)

fixedDelay:定義一個按一定頻率執(zhí)行的定時任務(wù),與上面不同的是,改屬性可以配合initialDelay, 定義該任務(wù)延遲執(zhí)行時間。

cron:通過表達式來配置任務(wù)執(zhí)行時間--在線cron表達式生成器

三、多線程執(zhí)行定時任務(wù)

SpringBoot定時任務(wù)默認(rèn)單線程,可以看到三個定時任務(wù)都已經(jīng)執(zhí)行,并且使同一個線程中(scheduling-1)串行執(zhí)行,如果只有一個定時任務(wù),這樣做肯定沒問題,當(dāng)定時任務(wù)增多,如果一個任務(wù)卡死,會導(dǎo)致其他任務(wù)也無法執(zhí)行。

3.1 多線程配置類 AsyncConfig.class

@Configuration // 表明該類是一個配置類
@EnableAsync // 開啟異步事件的支持
public class AsyncConfig {  
  @Value("${myProps.corePoolSize}")
  private int corePoolSize;
  @Value("${myProps.maxPoolSize}")
  private int maxPoolSize;
  @Value("${myProps.queueCapacity}")
  private int queueCapacity;
  @Bean
  public Executor taskExecutor() {
    ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
    executor.setCorePoolSize(corePoolSize);
    executor.setMaxPoolSize(maxPoolSize);
    executor.setQueueCapacity(queueCapacity);
    executor.initialize();
    return executor;
  }
}

3.2 配置文件application.yml中添加多線程配置

myProps:
 corePoolSize: 10
 maxPoolSize: 100
 queueCapacity: 10

3.3 在定時任務(wù)的類或者方法上添加@Async

此時,可讓每一個任務(wù)都是在不同的線程中,啟動項目,日志打印如下:

2019-03-11 15:16:54.855 INFO 10782 --- [      main] c.v.t.SpringBootDemoTimeTaskApplication : SpringBootDemoTimeTaskApplication start!
2019-03-11 15:16:55.015 INFO 10782 --- [ taskExecutor-1] cn.van.task.service.SchedulerTask    : =====>>>>>使用cron執(zhí)行定時任務(wù)-1
2019-03-11 15:17:00.002 INFO 10782 --- [ taskExecutor-2] cn.van.task.service.SchedulerTask    : =====>>>>>使用cron執(zhí)行定時任務(wù)-2
2019-03-11 15:17:00.002 INFO 10782 --- [ taskExecutor-3] cn.van.task.service.SchedulerTask    : =====>>>>>使用cron執(zhí)行定時任務(wù)-1
2019-03-11 15:17:05.003 INFO 10782 --- [ taskExecutor-4] cn.van.task.service.SchedulerTask    : =====>>>>>使用cron執(zhí)行定時任務(wù)-1
2019-03-11 15:17:06.005 INFO 10782 --- [ taskExecutor-5] cn.van.task.service.SchedulerTask    : =====>>>>>使用cron執(zhí)行定時任務(wù)-2
2019-03-11 15:17:10.004 INFO 10782 --- [ taskExecutor-6] cn.van.task.service.SchedulerTask    : =====>>>>>使用cron執(zhí)行定時任務(wù)-1
2019-03-11 15:17:12.005 INFO 10782 --- [ taskExecutor-7] cn.van.task.service.SchedulerTask    : =====>>>>>使用cron執(zhí)行定時任務(wù)-2
2019-03-11 15:17:15.006 INFO 10782 --- [ taskExecutor-8] cn.van.task.service.SchedulerTask    : =====>>>>>使用cron執(zhí)行定時任務(wù)-1
2019-03-11 15:17:18.004 INFO 10782 --- [ taskExecutor-9] cn.van.task.service.SchedulerTask    : =====>>>>>使用cron執(zhí)行定時任務(wù)-2
2019-03-11 15:17:20.004 INFO 10782 --- [taskExecutor-10] cn.van.task.service.SchedulerTask    : =====>>>>>使用cron執(zhí)行定時任務(wù)-1

日志打印證明了我的預(yù)測,至此,多線程中執(zhí)行定時任務(wù)完畢!

四、源碼及其延伸

https://github.com/vanDusty/SpringBoot-Home/tree/master/springboot-demo-list/task-demo

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

相關(guān)文章

  • 簡述JAVA中堆內(nèi)存與棧內(nèi)存的區(qū)別

    簡述JAVA中堆內(nèi)存與棧內(nèi)存的區(qū)別

    這篇文章主要介紹了JAVA中堆內(nèi)存與棧內(nèi)存的區(qū)別,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-07-07
  • mybatis-generator如何自定義注釋生成

    mybatis-generator如何自定義注釋生成

    這篇文章主要介紹了mybatis-generator如何自定義注釋生成的操作,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • java 字符串反轉(zhuǎn)的實例詳解

    java 字符串反轉(zhuǎn)的實例詳解

    這篇文章主要介紹了java 字符串反轉(zhuǎn)的實例詳解的相關(guān)資料,這里提供實現(xiàn)代碼幫助大家學(xué)習(xí)參考這部分內(nèi)容,需要的朋友可以參考下
    2017-08-08
  • 基于Spring Batch 配置重試邏輯

    基于Spring Batch 配置重試邏輯

    這篇文章主要介紹了Spring Batch 配置重試邏輯,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • Java equals()方法使用詳解及總結(jié)

    Java equals()方法使用詳解及總結(jié)

    這篇文章主要介紹了Java equals()方法使用詳解及總結(jié)的相關(guān)資料,需要的朋友可以參考下
    2017-03-03
  • SpringMVC4.3解析器HandlerMethodArgumentResolver接口源碼

    SpringMVC4.3解析器HandlerMethodArgumentResolver接口源碼

    這篇文章主要為大家介紹了SpringMVC4.3解析器HandlerMethodArgumentResolver接口源碼解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09
  • SpringAOP中的注解配置詳解

    SpringAOP中的注解配置詳解

    這篇文章主要介紹了SpringAOP中的注解配置詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • .properties文件讀取及占位符${...}替換源碼解析

    .properties文件讀取及占位符${...}替換源碼解析

    本篇文章主要介紹了.properties文件讀取及占位符${...}替換源碼解析的相關(guān)知識,具有很好的參考價值。下面跟著小編一起來看下吧
    2017-05-05
  • java實現(xiàn)事件委托模式的實例詳解

    java實現(xiàn)事件委托模式的實例詳解

    這篇文章主要介紹了java實現(xiàn)事件委托模式的實例詳解的相關(guān)資料,這里提供實例來說明如何實現(xiàn)改功能,希望能幫助到大家理解這樣的模式,需要的朋友可以參考下
    2017-08-08
  • iOS socket網(wǎng)絡(luò)編程實例詳解

    iOS socket網(wǎng)絡(luò)編程實例詳解

    socket是一個針對TCP和UDP編程的接口,你可以借助它建立TCP連接等。這篇文章主要介紹了iOS socket網(wǎng)絡(luò)編程 ,需要的朋友可以參考下
    2017-03-03

最新評論

阿克| 同德县| 武乡县| 汪清县| 固始县| 安丘市| 普洱| 左贡县| 郯城县| 永嘉县| 伊春市| 谢通门县| 汝州市| 连城县| 寿阳县| 怀集县| 杨浦区| 十堰市| 东乌珠穆沁旗| 田东县| 桦南县| 卫辉市| 龙州县| 阿拉尔市| 广东省| 虹口区| 长泰县| 天津市| 高邮市| 宝清县| 连云港市| 龙游县| 永定县| 苍南县| 兴安盟| 突泉县| 高清| 高邑县| 五常市| 大庆市| 河北区|