中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在SpringBoot中實現一個定時任務

發布時間:2021-04-19 17:51:04 來源:億速云 閱讀:186 作者:Leah 欄目:編程語言

本篇文章為大家展示了如何在SpringBoot中實現一個定時任務,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

一、定時任務實現的幾種方式:

Timer

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

ScheduledExecutorService

也jdk自帶的一個類;是基于線程池設計的定時任務類,每個調度任務都會分配到線程池中的一個線程去執行,也就是說,任務是并發執行,互不影響。

Spring Task

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

Quartz

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

二、基于SpringBoot的定時任務

使用SpringBoot 自帶的定時任務,只需要添加相應的注解就可以實現

2.1 導入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 創建定時任務實現類SchedulerTask

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

運行結果:

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執行定時任務
2019-03-09 17:33:10.680 INFO 7752 --- [  scheduling-1] cn.van.task.service.SchedulerTask    : =====>>>>>使用fixedRate執行定時任務
2019-03-09 17:33:12.003 INFO 7752 --- [  scheduling-1] cn.van.task.service.SchedulerTask    : 使用cron執行定時任務
2019-03-09 17:33:15.676 INFO 7752 --- [  scheduling-1] cn.van.task.service.SchedulerTask    : =====>>>>>使用fixedRate執行定時任務
2019-03-09 17:33:15.676 INFO 7752 --- [  scheduling-1] cn.van.task.service.SchedulerTask    : =====>>>>>使用fixedDelay執行定時任務
2019-03-09 17:33:18.002 INFO 7752 --- [  scheduling-1] cn.van.task.service.SchedulerTask    : 使用cron執行定時任務
2019-03-09 17:33:20.677 INFO 7752 --- [  scheduling-1] cn.van.task.service.SchedulerTask    : =====>>>>>使用fixedRate執行定時任務
2019-03-09 17:33:24.002 INFO 7752 --- [  scheduling-1] cn.van.task.service.SchedulerTask    : 使用cron執行定時任務
2019-03-09 17:33:25.680 INFO 7752 --- [  scheduling-1] cn.van.task.service.SchedulerTask    : =====>>>>>使用fixedRate執行定時任務
2019-03-09 17:33:25.681 INFO 7752 --- [  scheduling-1] cn.van.task.service.SchedulerTask    : =====>>>>>使用fixedDelay執行定時任務
2019-03-09 17:33:30.005 INFO 7752 --- [  scheduling-1] cn.van.task.service.SchedulerTask    : 使用cron執行定時任務
2019-03-09 17:33:30.680 INFO 7752 --- [  scheduling-1] cn.van.task.service.SchedulerTask    : =====>>>>>使用fixedRate執行定時任務
2019-03-09 17:33:35.680 INFO 7752 --- [  scheduling-1] cn.van.task.service.SchedulerTask    : =====>>>>>使用fixedRate執行定時任務
2019-03-09 17:33:35.682 INFO 7752 --- [  scheduling-1] cn.van.task.service.SchedulerTask    : =====>>>>>使用fixedDelay執行定時任務

2.4 執行時間的配置

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

fixedRate:定義一個按一定頻率執行的定時任務

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

cron:通過表達式來配置任務執行時間--在線cron表達式生成器

三、多線程執行定時任務

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

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 在定時任務的類或者方法上添加@Async

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

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執行定時任務-1
2019-03-11 15:17:00.002 INFO 10782 --- [ taskExecutor-2] cn.van.task.service.SchedulerTask    : =====>>>>>使用cron執行定時任務-2
2019-03-11 15:17:00.002 INFO 10782 --- [ taskExecutor-3] cn.van.task.service.SchedulerTask    : =====>>>>>使用cron執行定時任務-1
2019-03-11 15:17:05.003 INFO 10782 --- [ taskExecutor-4] cn.van.task.service.SchedulerTask    : =====>>>>>使用cron執行定時任務-1
2019-03-11 15:17:06.005 INFO 10782 --- [ taskExecutor-5] cn.van.task.service.SchedulerTask    : =====>>>>>使用cron執行定時任務-2
2019-03-11 15:17:10.004 INFO 10782 --- [ taskExecutor-6] cn.van.task.service.SchedulerTask    : =====>>>>>使用cron執行定時任務-1
2019-03-11 15:17:12.005 INFO 10782 --- [ taskExecutor-7] cn.van.task.service.SchedulerTask    : =====>>>>>使用cron執行定時任務-2
2019-03-11 15:17:15.006 INFO 10782 --- [ taskExecutor-8] cn.van.task.service.SchedulerTask    : =====>>>>>使用cron執行定時任務-1
2019-03-11 15:17:18.004 INFO 10782 --- [ taskExecutor-9] cn.van.task.service.SchedulerTask    : =====>>>>>使用cron執行定時任務-2
2019-03-11 15:17:20.004 INFO 10782 --- [taskExecutor-10] cn.van.task.service.SchedulerTask    : =====>>>>>使用cron執行定時任務-1

上述內容就是如何在SpringBoot中實現一個定時任務,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

寿宁县| 洞口县| 达孜县| 上高县| 长乐市| 溧阳市| 平泉县| 湘西| 布拖县| 若尔盖县| 铅山县| 天台县| 东乡族自治县| 岑溪市| 兖州市| 宝坻区| 阿拉尔市| 虞城县| 高雄县| 睢宁县| 绥宁县| 沾益县| 澄迈县| 大名县| 阳高县| 手机| 河曲县| 固安县| 吕梁市| 绥化市| 安丘市| 巴彦县| 乌兰察布市| 莒南县| 农安县| 泰来县| 太白县| 确山县| 沧州市| 綦江县| 天津市|