中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

怎么在SpringBoot中使用定時任務(wù)

本篇文章給大家分享的是有關(guān)怎么在SpringBoot中使用定時任務(wù),小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。

創(chuàng)新互聯(lián)公司服務(wù)緊隨時代發(fā)展步伐,進(jìn)行技術(shù)革新和技術(shù)進(jìn)步,經(jīng)過10余年的發(fā)展和積累,已經(jīng)匯集了一批資深網(wǎng)站策劃師、設(shè)計(jì)師、專業(yè)的網(wǎng)站實(shí)施團(tuán)隊(duì)以及高素質(zhì)售后服務(wù)人員,并且完全形成了一套成熟的業(yè)務(wù)流程,能夠完全依照客戶要求對網(wǎng)站進(jìn)行成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、建設(shè)、維護(hù)、更新和改版,實(shí)現(xiàn)客戶網(wǎng)站對外宣傳展示的首要目的,并為客戶企業(yè)品牌互聯(lián)網(wǎng)化提供全面的解決方案。

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

利用線程可以設(shè)定休眠時間的方式可以實(shí)現(xiàn)簡單的定時任務(wù)邏輯。

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

2. Timer類

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

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

3. ScheduledExecutorService類

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

因此,基于ScheduledExecutorService類的定時任務(wù)類,歸根到底也是基于線程的調(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í)行一次定時任務(wù)");
          }
        }
    ,1,sleepTime, TimeUnit.SECONDS);
  }

4. 整合Quartz

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

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

  1. JobDetail: 表示一個具體的可執(zhí)行的調(diào)度程序,Job 是這個可執(zhí)行程調(diào)度程序所要執(zhí)行的內(nèi)容,另外 JobDetail 還包含了這個任務(wù)調(diào)度的方案和策略。

  2. Trigger: 代表一個調(diào)度參數(shù)的配置,什么時候去調(diào)。

  3. Scheduler: 代表一個調(diào)度容器,一個調(diào)度容器中可以注冊多個 JobDetail 和Trigger。當(dāng) Trigger 與 JobDetail 組合,就可以被 Scheduler 容器調(diào)度了。

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

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

5. 使用Scheduled注解

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

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

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

開啟定時任務(wù)支持

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

6. cron表達(dá)式

cron表達(dá)式是一個字符串其語法為:

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

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

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

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

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

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

以上就是怎么在SpringBoot中使用定時任務(wù),小編相信有部分知識點(diǎn)可能是我們?nèi)粘9ぷ鲿姷交蛴玫降摹OM隳芡ㄟ^這篇文章學(xué)到更多知識。更多詳情敬請關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

分享文章:怎么在SpringBoot中使用定時任務(wù)
轉(zhuǎn)載來源:http://www.rwnh.cn/article48/psjohp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、商城網(wǎng)站、小程序開發(fā)電子商務(wù)、營銷型網(wǎng)站建設(shè)、品牌網(wǎng)站制作

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站
綦江县| 故城县| 巴塘县| 兴国县| 江永县| 博客| 山东| 怀宁县| 淳安县| 乌鲁木齐市| 江油市| 杭锦后旗| 翁源县| 塔城市| 资兴市| 册亨县| 运城市| 扎赉特旗| 庐江县| 当雄县| 青神县| 南阳市| 新化县| 芦山县| 清镇市| 日喀则市| 阜宁县| 涿鹿县| 井研县| 岳阳市| 柘荣县| 汝州市| 汨罗市| 广西| 呼伦贝尔市| 习水县| 平定县| 鹤峰县| 雷波县| 错那县| 泗阳县|