婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > java 中Spring task定時任務的深入理解

java 中Spring task定時任務的深入理解

熱門標簽:潤滑油銷售電銷機器人 海外圖書館地圖標注點 自繪地圖標注數據 外呼系統使用方法 電銷機器人免培訓 給地圖標注得傭金 如何看懂地圖標注點 電話機器人需要使用網絡嗎 南通通訊外呼系統產品介紹

java 中Spring task定時任務的深入理解

在工作中有用到spring task作為定時任務的處理,spring通過接口TaskExecutor和TaskScheduler這兩個接口的方式為異步定時任務提供了一種抽象。這就意味著spring容許你使用其他的定時任務框架,當然spring自身也提供了一種定時任務的實現:spring task。spring task支持線程池,可以高效處理許多不同的定時任務。同時,spring還支持使用Java自帶的Timer定時器和Quartz定時框架。限于篇幅,這里將只介紹spring task的使用。

其實,官方文檔已經介紹地足夠詳細,只不過都是英文版,所以為了更好地理解并使用spring task,首先會對spring task的實現原理做一個簡單的介紹,然后通過實際代碼演示spring task是如何使用的。這里會涉及到一個很重要的知識點:cron表達式。

TaskExecutor和TaskScheduler

TaskExecutor是spring task的第一個抽象,它很自然讓人聯想到jdk中concurrent包下的Executor,實際上TaskExecutor就是為區別于Executor才引入的,而引入TaskExecutor的目的就是為定時任務的執行提供線程池的支持,那么,問題來了,為什么spring不直接使用jdk自帶的Executor呢?TaskExecutor源碼如下?

public interface TaskExecutor extends Executor {
  void execute(Runnable var1);
}

那么,答案很顯然,TaskExecutor提供的線程池支持也是基于jdk自帶的Executor的。用法于Executor沒有什么不同。

TaskScheduler是spring task的第二個抽象,那么從字面的意義看,TaskScheduler就是為了提供定時任務的支持咯。TaskScheduler需要傳入一個Runnable的任務做為參數,并指定需要周期執行的時間或者觸發器,這樣Runnable任務就可以周期性執行了。傳入時間很好理解,有意思的是傳入一個觸發器(Trigger)的情況,因為這里需要使用cron表達式去觸發一個定時任務,所以有必要先了解下cron表達式的使用。

在spring 4.x中已經不支持7個參數的cronin表達式了,要求必須是6個參數(具體哪個參數后面會說)。cron表達式的格式如下:

{秒} {分} {時} {日期(具體哪天)} {月} {星期}
  • 秒:必填項,允許的值范圍是0-59,支持的特殊符號包括
  • , - * /,,表示特定的某一秒才會觸發任務,-表示一段時間內會觸發任務,*表示每一秒都會觸發,/表示從哪一個時刻開始,每隔多長時間觸發一次任務。
  • 分:必填項,允許的值范圍是0-59,支持的特殊符號和秒一樣,含義類推
  • 時:必填項,允許的值范圍是0-23,支持的特殊符號和秒一樣,含義類推
  • 日期:必填項,允許的值范圍是1-31,支持的特殊符號相比秒多了?,表示與{星期}互斥,即意味著若明確指定{星期}觸發,則表示{日期}無意義,以免引起沖突和混亂。
  • 月:必填項,允許的值范圍是1-12(JAN-DEC),支持的特殊符號與秒一樣,含義類推
  • 星期:必填項,允許值范圍是1~7 (SUN-SAT),1代表星期天(一星期的第一天),以此類推,7代表星期六,支持的符號相比秒多了?,表達的含義是與{日期}互斥,即意味著若明確指定{日期}觸發,則表示{星期}無意義。

比如下面這個cron表達式:

// 表達的含義是:每半分鐘觸發一次任務
30 * * * * ?

spring提供了一個CronTrigger,通過傳入一個Runnable任務和CronTrigger,就可以使用cron表達式去指定定時任務了,是不是非常方面。實際上,在工程實踐上,cron表達式也是使用很多的。實際上,是執行了下面的代碼:

scheduler.schedule(task, new CronTrigger("30 * * * * ?"));

TaskScheduler抽象的好處是讓需要執行定時任務的代碼不需要指定特定的定時框架(比如Timer和Quartz)。TaskScheduler的更簡單的實現是ThreadPoolTaskScheduler,它實際上代理一個jdk中的SchedulingTaskExecutor,并且也實現了TaskExecutor接口,所以需要經常執行定時任務的場景可以使用這個實現(Spring推薦)。我們再來看一下TaskExecutor和TaskScheduler的類繼承關系:

通常而言,使用spring task實現定時任務有兩種方式:注解和xml配置文件。這里使用xml配置文件的方式加以說明。

實戰

創建Maven工程,pom.xml:

?xml version="1.0" encoding="UTF-8"?>
project xmlns="http://maven.apache.org/POM/4.0.0"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  modelVersion>4.0.0/modelVersion>

  groupId>com.rhwayfun/groupId>
  artifactId>sring-task-demo/artifactId>
  version>1.0-SNAPSHOT/version>

  dependencies>
    dependency>
      groupId>org.springframework/groupId>
      artifactId>spring-context/artifactId>
      version>4.2.4.RELEASE/version>
    /dependency>
  /dependencies>

  build>
    plugins>
      plugin>
        groupId>org.apache.maven.plugins/groupId>
        artifactId>maven-compiler-plugin/artifactId>
        version>3.5.1/version>
        configuration>
          source>1.8/source>
          target>1.8/target>
        /configuration>
      /plugin>
    /plugins>
  /build>
/project>

開發需要執行定時任務的方法:

package com.rhwayfun.task;

import org.springframework.stereotype.Component;

import java.time.LocalDateTime;

/**
 * @author ZhongCB
 * @date 2016年09月10日 14:30
 * @description
 */
@Component
public class App {

  public void execute1(){
    System.out.printf("Task: %s, Current time: %s\n", 1, LocalDateTime.now());
  }

  public void execute2(){
    System.out.printf("Task: %s, Current time: %s\n", 2, LocalDateTime.now());
  }

  public void execute3(){
    System.out.printf("Task: %s, Current time: %s\n", 3, LocalDateTime.now());
  }

  public void execute4(){
    System.out.printf("Task: %s, Current time: %s\n", 4, LocalDateTime.now());
  }

  public void execute5(){
    System.out.printf("Task: %s, Current time: %s\n", 5, LocalDateTime.now());
  }

  public void execute6(){
    System.out.printf("Task: %s, Current time: %s\n", 6, LocalDateTime.now());
  }

  public void execute7(){
    System.out.printf("Task: %s, Current time: %s\n", 7, LocalDateTime.now());
  }

  public void execute8(){
    System.out.printf("Task: %s, Current time: %s\n", 8, LocalDateTime.now());
  }

  public void execute9(){
    System.out.printf("Task: %s, Current time: %s\n", 9, LocalDateTime.now());
  }

  public void execute10(){
    System.out.printf("Task: %s, Current time: %s\n", 10, LocalDateTime.now());
  }

  public void execute11(){
    System.out.printf("Task: %s, Current time: %s\n", 11, LocalDateTime.now());
  }

}

spring配置文件如下:

?xml version="1.0" encoding="UTF-8"?>
beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:task="http://www.springframework.org/schema/task"
    xsi:schemaLocation="
      http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd
      http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd
      http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.1.xsd">

  !-- 配置注解掃描 -->
  context:component-scan base-package="com.rhwayfun.task"/>

  task:scheduler id="taskScheduler" pool-size="100" />

  task:scheduled-tasks scheduler="taskScheduler">
    !-- 每半分鐘觸發任務 -->
    task:scheduled ref="app" method="execute1" cron="30 * * * * ?"/>
    !-- 每小時的10分30秒觸發任務 -->
    task:scheduled ref="app" method="execute2" cron="30 10 * * * ?"/>
    !-- 每天1點10分30秒觸發任務 -->
    task:scheduled ref="app" method="execute3" cron="30 10 1 * * ?"/>
    !-- 每月20號的1點10分30秒觸發任務 -->
    task:scheduled ref="app" method="execute4" cron="30 10 1 20 * ?"/>
    !-- 每年10月20號的1點10分30秒觸發任務 -->
    task:scheduled ref="app" method="execute5" cron="30 10 1 20 10 ?"/>
    !-- 每15秒、30秒、45秒時觸發任務 -->
    task:scheduled ref="app" method="execute6" cron="15,30,45 * * * * ?"/>
    !-- 15秒到45秒每隔1秒觸發任務 -->
    task:scheduled ref="app" method="execute7" cron="15-45 * * * * ?"/>
    !-- 每分鐘的每15秒時任務任務,每隔5秒觸發一次 -->
    task:scheduled ref="app" method="execute8" cron="15/5 * * * * ?"/>
    !-- 每分鐘的15到30秒之間開始觸發,每隔5秒觸發一次 -->
    task:scheduled ref="app" method="execute9" cron="15-30/5 * * * * ?"/>
    !-- 每小時的0分0秒開始觸發,每隔3分鐘觸發一次 -->
    task:scheduled ref="app" method="execute10" cron="0 0/3 * * * ?"/>
    !-- 星期一到星期五的10點15分0秒觸發任務 -->
    task:scheduled ref="app" method="execute11" cron="0 15 10 ? * MON-FRI"/>
  /task:scheduled-tasks>

/beans>

編寫測試代碼:

package com.rhwayfun.task;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author ZhongCB
 * @date 2016年09月10日 14:55
 * @description
 */
public class AppTest {

  public static void main(String[] args) {
    ApplicationContext context = new ClassPathXmlApplicationContext("classpath:/app-context-task.xml");
  }
}

運行測試代碼,控制臺會定時輸出每個定時任務的日志信息,說明測試通過。

小插曲

由于項目使用jdk 1.8進行開發,所以初始的時候每次pom文件發生修改,編譯器的版本又變成了jdk 1.5,后面發現需要在pom文件中添加build便簽那部分才能將默認的編譯器進行修改。也算一個小收獲了。

如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

您可能感興趣的文章:
  • Java之SpringBoot定時任務案例講解
  • Java下SpringBoot創建定時任務詳解
  • java Quartz定時器任務與Spring task定時的幾種實現方法
  • 最流行的java后臺框架spring quartz定時任務
  • Java spring定時任務詳解

標簽:貸款邀約 廣州 樂山 黃石 內江 南京 大連 銅川

巨人網絡通訊聲明:本文標題《java 中Spring task定時任務的深入理解》,本文關鍵詞  java,中,Spring,task,定時,任務,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《java 中Spring task定時任務的深入理解》相關的同類信息!
  • 本頁收集關于java 中Spring task定時任務的深入理解的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    亚洲精品国产a久久久久久| 久久综合久久综合久久| 五月综合激情网| 久久综合久久综合九色| 欧美大度的电影原声| 成人少妇影院yyyy| 麻豆国产精品官网| 国产专区欧美精品| 国产在线播放一区| 制服丝袜中文字幕亚洲| 亚洲一级二级在线| 国产欧美一区视频| 成人av免费在线播放| 日韩一区二区三区四区五区六区| 国产亚洲成av人在线观看导航 | 欧美久久久久久久久| 欧美人与z0zoxxxx视频| 国产成人综合在线| 有坂深雪av一区二区精品| 午夜精品福利久久久| 高清av一区二区| 成人午夜视频福利| 色哟哟在线观看一区二区三区| 欧美丰满少妇xxxbbb| 久久久久99精品国产片| 亚洲成人资源网| 一本色道久久综合精品竹菊| 26uuu久久天堂性欧美| 色婷婷狠狠综合| 丁香婷婷综合色啪| 欧美大尺度电影在线| 丝袜美腿成人在线| 日韩电影网1区2区| 成人h动漫精品| 欧美不卡激情三级在线观看| 国产精品久久影院| 国产盗摄一区二区| 欧美综合一区二区| 日韩天堂在线观看| 一区二区三区自拍| 国产美女娇喘av呻吟久久 | 国产又粗又猛又爽又黄91精品| www.av精品| 日本一区二区久久| 亚洲三级在线免费观看| 亚洲第一在线综合网站| 久久久99免费| 欧美又粗又大又爽| 欧美三日本三级三级在线播放| 一区二区三区欧美在线观看| ww亚洲ww在线观看国产| av不卡在线观看| 亚洲品质自拍视频| 久久新电视剧免费观看| 欧美日韩一区三区| 91麻豆自制传媒国产之光| 国产精品久久久久久亚洲毛片 | 亚洲乱码国产乱码精品精98午夜| 一本色道久久综合精品竹菊| 懂色av中文一区二区三区 | 国产精品一二三四| 欧美第一区第二区| 日韩一区二区三区高清免费看看| 91黄色在线观看| 青青草国产精品亚洲专区无| 国产日韩欧美精品电影三级在线 | 91免费版在线| 国产在线精品一区二区夜色| 久久久国产精品麻豆 | 亚洲精品视频在线| 亚洲国产一区二区三区| 亚洲欧美另类综合偷拍| 亚洲成人第一页| 亚洲蜜臀av乱码久久精品蜜桃| 亚洲色图在线视频| 中文字幕一区二区视频| 久久亚洲私人国产精品va媚药| 高清不卡一二三区| 亚洲一区二区三区在线看| 精品视频色一区| 99精品视频一区| 国产精品久久久久影视| 精品国产乱码久久久久久久久| 成人一级片在线观看| 国内精品伊人久久久久影院对白| 中文字幕一区二区三区在线不卡| 97se亚洲国产综合在线| 色欧美片视频在线观看| 激情综合网av| 国产精一品亚洲二区在线视频| 日韩中文字幕一区二区三区| 亚洲国产视频网站| 日韩专区中文字幕一区二区| 亚洲精品福利视频网站| 日产欧产美韩系列久久99| 日韩av成人高清| 不卡区在线中文字幕| 91久久久免费一区二区| 欧美剧在线免费观看网站| 成人欧美一区二区三区| 一区二区三区四区在线免费观看| 成人黄页在线观看| 久久这里只精品最新地址| 成人黄色在线视频| 亚洲美女精品一区| 色婷婷亚洲精品| 亚洲成人福利片| 精品盗摄一区二区三区| 国模冰冰炮一区二区| 国产无一区二区| 日韩成人一级片| 精品久久久久久综合日本欧美| 久久国产日韩欧美精品| 91麻豆精品国产91久久久资源速度 | 日韩一级免费一区| 色94色欧美sute亚洲13| 久久久亚洲午夜电影| 亚洲综合999| 97se亚洲国产综合在线| a4yy欧美一区二区三区| |精品福利一区二区三区| 国产九色sp调教91| 日韩视频在线永久播放| 蜜臀av性久久久久蜜臀av麻豆| 8x8x8国产精品| 图片区小说区区亚洲影院| 久久午夜羞羞影院免费观看| 成人av网址在线| 首页亚洲欧美制服丝腿| 91视频国产观看| 久久久国产午夜精品| 毛片一区二区三区| 亚洲一区免费观看| 亚洲色图.com| 欧美国产97人人爽人人喊| 欧美成人r级一区二区三区| 欧美日韩高清一区二区| 97久久超碰国产精品| 免费观看30秒视频久久| 亚洲色图视频网| 中文字幕色av一区二区三区| 97精品电影院| 精品一区二区精品| 精品国产制服丝袜高跟| 欧美日韩一卡二卡三卡| 爽好久久久欧美精品| 午夜精品福利一区二区蜜股av | 精品在线播放午夜| 五月开心婷婷久久| 国产精品久久毛片av大全日韩| 亚洲国产精品v| 成人av在线资源网| 美女网站在线免费欧美精品| 亚洲欧美激情小说另类| 亚洲日本一区二区| 综合自拍亚洲综合图不卡区| 日本一区二区成人在线| 亚洲精品免费在线| 亚洲国产成人av网| 精品一区二区免费在线观看| 高清在线观看日韩| 91福利小视频| 欧美综合亚洲图片综合区| 91精品国产综合久久久久久| 久久久激情视频| 欧美日韩一区精品| 日韩三级电影网址| 欧美日韩精品一区二区三区蜜桃| 日韩欧美一二三四区| 欧美激情一区二区三区蜜桃视频 | 午夜精品一区二区三区免费视频 | 91在线精品一区二区三区| 一区二区三区四区精品在线视频| 欧美精品一区二区三区一线天视频| 日韩欧美在线一区二区三区| |精品福利一区二区三区| 亚洲成人黄色小说| 国产经典欧美精品| 久色婷婷小香蕉久久| 99免费精品视频| 国产精品国产三级国产三级人妇| 日韩免费视频一区| 最好看的中文字幕久久| 一卡二卡三卡日韩欧美| 无吗不卡中文字幕| 国产成人免费av在线| 久久蜜桃av一区精品变态类天堂 | 国产一区二区三区四| 久久精品综合网| 一区二区三区在线播| 久久av资源站| 91亚洲资源网| 欧美人xxxx| 中文字幕中文在线不卡住| 久久国产精品色| 欧美日韩国产bt| 麻豆精品视频在线| 日韩一区二区三区四区| 三级欧美在线一区| 亚洲精品一区二区三区99|