溫馨提示×

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

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

詳解SpringBoot Schedule配置

發(fā)布時(shí)間:2020-10-19 16:50:35 來源:腳本之家 閱讀:213 作者:slimer 欄目:編程語言

1. 定時(shí)任務(wù)實(shí)現(xiàn)方式

定時(shí)任務(wù)實(shí)現(xiàn)方式:

  1. Java自帶的java.util.Timer類,這個(gè)類允許你調(diào)度一個(gè)java.util.TimerTask任務(wù)。使用這種方式可以讓你的程序按照某一個(gè)頻度執(zhí)行,但不能在指定時(shí)間運(yùn)行。一般用的較少,這篇文章將不做詳細(xì)介紹。
  2. 使用Quartz,這是一個(gè)功能比較強(qiáng)大的的調(diào)度器,可以讓你的程序在指定時(shí)間執(zhí)行,也可以按照某一個(gè)頻度執(zhí)行,配置起來稍顯復(fù)雜,有空介紹。
  3. SpringBoot自帶的Scheduled,可以將它看成一個(gè)輕量級(jí)的Quartz,而且使用起來比Quartz簡(jiǎn)單許多,本文主要介紹。

定時(shí)任務(wù)執(zhí)行方式:

  1. 單線程(串行)
  2. 多線程(并行)

2. 創(chuàng)建定時(shí)任務(wù)

package com.autonavi.task.test;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.scheduling.annotation.Scheduled;

import org.springframework.stereotype.Component;

import com.autonavi.task.ScheduledTasks;

@Component

public class ScheduledTest {

  private static final Logger logger = LoggerFactory.getLogger(ScheduledTasks.class); 

  @Scheduled(cron="0 0/2 * * * ?") 

  public void executeFileDownLoadTask() { 

    // 間隔2分鐘,執(zhí)行任務(wù)   

    Thread current = Thread.currentThread(); 

    System.out.println("定時(shí)任務(wù)1:"+current.getId());

    logger.info("ScheduledTest.executeFileDownLoadTask 定時(shí)任務(wù)1:"+current.getId()+ ",name:"+current.getName());

  }

} 

@Scheduled 注解用于標(biāo)注這個(gè)方法是一個(gè)定時(shí)任務(wù)的方法,有多種配置可選。cron支持cron表達(dá)式,指定任務(wù)在特定時(shí)間執(zhí)行;fixedRate以特定頻率執(zhí)行任務(wù);fixedRateString以string的形式配置執(zhí)行頻率。

3. 啟動(dòng)定時(shí)任務(wù)

@SpringBootApplication

@EnableScheduling

public class App { 

  private static final Logger logger = LoggerFactory.getLogger(App.class); 

  public static void main(String[] args) {

    SpringApplication.run(App.class, args);   

    logger.info("start");            

  }  

} 

其中 @EnableScheduling 注解的作用是發(fā)現(xiàn)注解@Scheduled的任務(wù)并后臺(tái)執(zhí)行。

Springboot本身默認(rèn)的執(zhí)行方式是串行執(zhí)行,也就是說無論有多少task,都是一個(gè)線程串行執(zhí)行,并行需手動(dòng)配置

4. 并行任務(wù)

繼承SchedulingConfigurer類并重寫其方法即可,如下:

@Configuration

@EnableScheduling

public class ScheduleConfig implements SchedulingConfigurer {

  @Override

  public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {

    taskRegistrar.setScheduler(taskExecutor());

  } 

  @Bean(destroyMethod="shutdown")

  public Executor taskExecutor() {

    return Executors.newScheduledThreadPool(100);

  }

} 

再次執(zhí)行之前的那個(gè)Demo,會(huì)欣然發(fā)現(xiàn)已經(jīng)是并行執(zhí)行了!   

5. 異步并行任務(wù)

import org.springframework.scheduling.TaskScheduler;

import org.springframework.scheduling.annotation.AsyncConfigurer;

import org.springframework.scheduling.annotation.EnableAsync;

import org.springframework.scheduling.annotation.EnableScheduling;

import org.springframework.scheduling.annotation.SchedulingConfigurer;

import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;

import org.springframework.scheduling.config.ScheduledTaskRegistrar;

 

@Configuration

@EnableScheduling

@EnableAsync(

mode = AdviceMode.PROXY, proxyTargetClass = false,

order = Ordered.HIGHEST_PRECEDENCE

)

@ComponentScan(

basePackages = "hello"

)

public class RootContextConfiguration implements

AsyncConfigurer, SchedulingConfigurer {

@Bean

public ThreadPoolTaskScheduler taskScheduler()

{

ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();

scheduler.setPoolSize(20);

scheduler.setThreadNamePrefix("task-");

scheduler.setAwaitTerminationSeconds(60);

scheduler.setWaitForTasksToCompleteOnShutdown(true);

return scheduler;

}

 

@Override

public Executor getAsyncExecutor()

{

Executor executor = this.taskScheduler();

return executor;

}

 

@Override

public void configureTasks(ScheduledTaskRegistrar registrar)

{

TaskScheduler scheduler = this.taskScheduler();

registrar.setTaskScheduler(scheduler);

}

} 

在啟動(dòng)的main方法加入額外配置:

@SpringBootApplication

public class Application { 

  public static void main(String[] args) throws Exception {

   AnnotationConfigApplicationContext rootContext =

   new AnnotationConfigApplicationContext();

 

  rootContext.register(RootContextConfiguration.class);

  rootContext.refresh();

  }

} 

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

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI