亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JSP > 正文

java 中Spring task定時(shí)任務(wù)的深入理解

2024-09-05 00:23:23
字體:
供稿:網(wǎng)友

java 中Spring task定時(shí)任務(wù)的深入理解

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

其實(shí),官方文檔已經(jīng)介紹地足夠詳細(xì),只不過都是英文版,所以為了更好地理解并使用spring task,首先會(huì)對(duì)spring task的實(shí)現(xiàn)原理做一個(gè)簡單的介紹,然后通過實(shí)際代碼演示spring task是如何使用的。這里會(huì)涉及到一個(gè)很重要的知識(shí)點(diǎn):cron表達(dá)式。

TaskExecutor和TaskScheduler

TaskExecutor是spring task的第一個(gè)抽象,它很自然讓人聯(lián)想到j(luò)dk中concurrent包下的Executor,實(shí)際上TaskExecutor就是為區(qū)別于Executor才引入的,而引入TaskExecutor的目的就是為定時(shí)任務(wù)的執(zhí)行提供線程池的支持,那么,問題來了,為什么spring不直接使用jdk自帶的Executor呢?TaskExecutor源碼如下?

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

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

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

在spring 4.x中已經(jīng)不支持7個(gè)參數(shù)的cronin表達(dá)式了,要求必須是6個(gè)參數(shù)(具體哪個(gè)參數(shù)后面會(huì)說)。cron表達(dá)式的格式如下:

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

比如下面這個(gè)cron表達(dá)式:

// 表達(dá)的含義是:每半分鐘觸發(fā)一次任務(wù)30 * * * * ?

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

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

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

Spring,task,java,定時(shí)任務(wù)

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

實(shí)戰(zhàn)

創(chuàng)建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>

開發(fā)需要執(zhí)行定時(shí)任務(wù)的方法:

package com.rhwayfun.task;import org.springframework.stereotype.Component;import java.time.LocalDateTime;/** * @author ZhongCB * @date 2016年09月10日 14:30 * @description */@Componentpublic 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">    <!-- 每半分鐘觸發(fā)任務(wù) -->    <task:scheduled ref="app" method="execute1" cron="30 * * * * ?"/>    <!-- 每小時(shí)的10分30秒觸發(fā)任務(wù) -->    <task:scheduled ref="app" method="execute2" cron="30 10 * * * ?"/>    <!-- 每天1點(diǎn)10分30秒觸發(fā)任務(wù) -->    <task:scheduled ref="app" method="execute3" cron="30 10 1 * * ?"/>    <!-- 每月20號(hào)的1點(diǎn)10分30秒觸發(fā)任務(wù) -->    <task:scheduled ref="app" method="execute4" cron="30 10 1 20 * ?"/>    <!-- 每年10月20號(hào)的1點(diǎn)10分30秒觸發(fā)任務(wù) -->    <task:scheduled ref="app" method="execute5" cron="30 10 1 20 10 ?"/>    <!-- 每15秒、30秒、45秒時(shí)觸發(fā)任務(wù) -->    <task:scheduled ref="app" method="execute6" cron="15,30,45 * * * * ?"/>    <!-- 15秒到45秒每隔1秒觸發(fā)任務(wù) -->    <task:scheduled ref="app" method="execute7" cron="15-45 * * * * ?"/>    <!-- 每分鐘的每15秒時(shí)任務(wù)任務(wù),每隔5秒觸發(fā)一次 -->    <task:scheduled ref="app" method="execute8" cron="15/5 * * * * ?"/>    <!-- 每分鐘的15到30秒之間開始觸發(fā),每隔5秒觸發(fā)一次 -->    <task:scheduled ref="app" method="execute9" cron="15-30/5 * * * * ?"/>    <!-- 每小時(shí)的0分0秒開始觸發(fā),每隔3分鐘觸發(fā)一次 -->    <task:scheduled ref="app" method="execute10" cron="0 0/3 * * * ?"/>    <!-- 星期一到星期五的10點(diǎn)15分0秒觸發(fā)任務(wù) -->    <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");  }}

運(yùn)行測試代碼,控制臺(tái)會(huì)定時(shí)輸出每個(gè)定時(shí)任務(wù)的日志信息,說明測試通過。

小插曲

由于項(xiàng)目使用jdk 1.8進(jìn)行開發(fā),所以初始的時(shí)候每次pom文件發(fā)生修改,編譯器的版本又變成了jdk 1.5,后面發(fā)現(xiàn)需要在pom文件中添加build便簽?zāi)遣糠植拍軐⒛J(rèn)的編譯器進(jìn)行修改。也算一個(gè)小收獲了。

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


注:相關(guān)教程知識(shí)閱讀請(qǐng)移步到JSP教程頻道。
發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
中文在线手机av| 91久久国产综合久久91精品网站| 国产精品探花视频| 日韩欧美电影一区| 精品国产乱码久久久久久蜜柚| 久久久久久久久丰满| 日韩中文字幕在线视频观看| 日本少妇高潮喷水xxxxxxx| 欧美日韩黄色网| 亚洲精品欧美| 亚洲久久久久久| 欧美激情手机在线视频| 亚洲欧美色一区| 男女啪啪免费视频网站| 一区二区三区视频国产日韩| 日韩新的三级电影| 国产97色在线 | 日韩| 黄色美女视频在线观看| 国产精品成人免费一区久久羞羞| 色网址在线观看| 亚洲精品午夜国产va久久成人| 妺妺窝人体色www聚色窝仙踪| 最新av免费在线观看| 福利精品在线| 天堂网一区二区三区| 国产综合av在线| 日韩在线免费观看视频| 欧美知名女优| 天天搞夜夜操| 国产黄色麻豆视频| 亚洲成人av在线影院| 黄色视屏免费在线观看| 免费成人深夜夜行网站| 99精品美女| 精产国品一二三区| 日韩视频免费播放| 欧美xxxxbbbb在线播放| 在线一级成人| 国产麻豆入在线观看| 在线免费一区二区| 精品久久久三级| 2023国产精品视频| 朝桐光av在线一区二区三区| 亚洲人亚洲人色久| 美女黄色丝袜一区| 欧美午夜久久| 日本精品黄色| 欧美日韩视频在线一区二区观看视频| 免费毛片aaaaaa| 天堂√最新版中文在线| 国产在线一二区| 国产精品久久免费看| 欧美videos极品另类| zzijzzij亚洲日本少妇熟睡| 久久嫩草精品久久久精品| 久久精品视频免费看| 天堂资源在线亚洲视频| 综合免费一区二区三区| 四虎影在永久在线观看| 黄网视频在线观看| 一二美女精品欧洲| 制服丝袜专区在线| 精品人妻伦一区二区三区久久| 欧美国产极品| 国产99久久久国产精品成人免费| 在线看片你懂的| www.av免费| 成人久久18免费网站漫画| 日本亚州欧洲精品不卡| 欧美日韩破处| 中文字幕av在线免费观看| 国产在线观看a| 91www在线观看| 国产欧美一区二区| 日日夜夜精品视频| 国产中文字幕免费观看| 亚洲视频中文字幕在线观看| free性欧洲69| 成年午夜在线| 91theporn国产在线观看| 91久久伊人青青碰碰婷婷| av中文在线资源库| 久久久久亚洲av无码专区首jn| 国产亚洲第一的欧洲日产| 首页国产欧美久久| 欧美综合在线视频观看| 中文在线不卡视频| 视频一区二区三区在线| 亚洲国产精品欧美久久| 888av在线| 高清一区二区三区视频| 精品久久电影| 欧美视频精品| ady日本映画久久精品一区二区| 国产欧美日韩免费观看| 日本成人黄色| 天堂av资源在线观看| 午夜精品视频一区二区三区在线看| 中文字幕一二三四区| 欧美在线首页| 精品日本高清在线播放| 亚洲一卡二卡三卡四卡无卡久久| 先锋影音av资源站| 中文字幕中文字幕在线中心一区| 成人三级av在线| 国内精品久久久久国产盗摄免费观看完整版| 久久精品国产亚洲av麻豆色欲| 91精东传媒理伦片在线观看| youjizz欧美| fc2ppv完全颜出在线播放| 美女流白浆视频| 三级黄色在线观看| 亚洲一区成人| 久久综合加勒比| www.国产成人| 欧美 中文字幕| 久久精品亚洲一区二区三区浴池| 亚洲va码欧洲m码| 精品久久久久久亚洲综合网站| 性欧美长视频| 国产精品久久久久久亚洲调教| 欧美tickling挠脚心丨vk| 国产嫩草影院久久久久| 奇米777国产一区国产二区| 99热在线免费观看| 91精品人妻一区二区三区四区| 国产精品99久久久久久久久久久久| 亚洲女人18毛片水真多| 国产亚洲精品美女久久久| 欧美在线首页| 国产一区二区精品久久| 亚洲精品69| 啊啊啊好爽视频| 五十路熟女丰满大屁股| 又紧又大又爽精品一区二区| 青娱乐国产在线视频| 亚洲天堂1区| 麻豆精品国产免费| 91精品国产色综合久久久蜜香臀| 国产免费一区二区三区在线能观看| 国产午夜福利精品| 国产一二三四区在线| 一级视频在线免费观看| 亚洲成人av一区| 免费国产a级片| 无码任你躁久久久久久老妇| 污污动漫在线观看| 日韩国产欧美精品一区二区三区| 99久久精品一区| 天堂在线观看| 人善交video高清| 精品丰满少妇一区二区三区| 久久久久久久久免费看无码| 国产啊啊啊视频在线观看| 91玉足脚交白嫩脚丫| 国产乱码精品一区二区| 日本一区二区三区四区| **女人18毛片一区二区| 欧美日韩亚洲一二三| 美女被人操视频在线观看| 亚洲精品久久久成人| 91麻豆精品国产自产在线观看一区| 精品国产乱码久久久久久免费| 免费在线观看污视频| 亚洲小说欧美另类社区| 久久久久久久久蜜桃| 致1999电视剧免费观看策驰影院| av毛片在线免费看| 菠萝蜜视频网站入口| 18禁男女爽爽爽午夜网站免费| 久久美女性网| 成人在线国产精品| 91 在线视频观看| 三级网在线观看| 欧美性猛交bbbbb精品| 亚洲tv在线观看| av在线播放天堂| 7777kkk亚洲综合欧美网站| 日韩中文视频免费在线观看| 成人欧美一区二区| 久久精品国产成人精品| 欧美一区自拍| 在线看片第一页欧美| 麻豆成人小视频| 亚洲第一区视频| 91尤物国产福利在线观看| 欧美一区二区三区的| 首页综合国产亚洲丝袜| av在线女优影院| 91精品国产综合久久久久久蜜臀| 毛片中文在线观看| 美女福利视频在线| 久久三级福利| 天天影院图片亚洲| 另类天堂av| 日韩欧美一级片| 亚洲午夜电影在线| 国产毛片aaa| 黄色一级免费| 丰满岳乱妇一区二区三区| 色婷婷狠狠综合| 色呦哟—国产精品| 欧美精品videossex88| 国内精品久久久久久中文字幕| 日本一区二区三区视频在线观看| 亚洲午夜小视频| 99久久99久久精品国产| 欧美日韩极品在线观看一区| 国产精品一区二区久久久久| 日韩一区二区在线播放| 久久久国产精品久久久| 99999精品视频| www成人在线观看| 日本黄色免费网站| 影音先锋欧美激情| 少妇大叫太大太粗太爽了a片小说| 国产精品伦理一区| 警花av一区二区三区| 国产在线一区二区三区四区| 在线看的av| 日本ー区在线视频| 天天槽夜夜槽| 日韩av电影免费在线| 国产有码在线| 少妇一级淫片免费放播放| 在线看片中文字幕| 美女被爆操网站| 国产亚洲福利一区| av日韩在线免费| 97夜夜澡人人双人人人喊| 日韩综合视频在线观看| 国产在线精品一区二区夜色| caoporn国产精品免费视频| 免费av一区二区| 18岁成人毛片| 国产在线观看一区二区| 欧美图片一区二区| 中文字幕欧美一区二区| 国产精品高潮呻吟久久av野狼| 欧美日韩不卡在线| 欧美日韩综合高清一区二区| 日本.亚洲电影| 成人国产一区二区| 国产探花一区二区三区| av网站在线免费观看| 伊人在我在线看导航| 91|九色|视频| 97国产一区二区精品久久呦| rebdb初裸写真在线观看| 毛片在线播放视频| 亚洲影视九九影院在线观看| 日本一区二区三区四区在线观看| 精品久久久久久久久久久久久久| 视频在线观看国产精品| 欧美高清中文字幕| 依依成人综合视频| 国产极品视频| 九九视频精品在线观看| 欧美制服第一页| www.操操操| 亚洲国产精品久久91精品| 人人澡人人透人人爽| 美女被爆操网站| 国产精品丝袜一区二区| 精品人妻无码中文字幕18禁| 天堂成人在线视频| 日本精品一区在线观看| 销魂美女一区二区三区视频在线| 91精品国产免费久久久久久| 久久精品国产精品亚洲综合| 国产精品第9页| 亚洲字幕成人中文在线观看| 日韩精品一区二区三区在线视频| 五月天综合激情| 欧美 激情 在线| 日本不卡一区二区三区四区| 在线视频日本亚洲性| av在线天堂| 欧美综合视频在线观看| 少妇人妻大乳在线视频| 国产一区日韩一区| 三级av在线播放| 亚洲第一精品在线| www.色偷偷.com| 亚洲一区观看| 欧美zzoo| 欧美自拍电影| 亚洲国产精品t66y| 亚洲人成精品久久久| 国产亚洲无码精品| 韩国黄色一级大片| 久久久久国产一区二区| 国产黄色一区二区| 欧美人妻精品一区二区三区| 91成人抖音| 在线观看亚洲成人| 婷婷亚洲综合| 国产亚洲一区二区三区| 国产成人精品无码高潮| 国产福利一区视频| 欧美大胆a视频| 国产精品成人无码| av动漫免费看| 日本欧美一区二区三区不卡视频| 粉嫩喷白浆久久| 最新真实国产在线视频| 国产喷水吹潮视频www| 中文欧美日本在线资源| 欧美熟妇另类久久久久久不卡| 国精品产品一区| 超级碰碰视频| 亚洲经典一区二区| 久久久久噜噜噜亚洲熟女综合| 久久夜精品香蕉| 欧美无乱码久久久免费午夜一区| 成人av在线一区二区三区| 久久亚洲精品国产精品紫薇| 欧美一级久久久久久久大片| 日韩欧美亚洲精品| 午夜精品区一区二区三| 24小时免费看片在线观看| 777av视频| 在线观看视频你懂的| 日韩一区欧美| 在线观看毛片av| 亚洲少妇中文在线| 青青在线视频观看| 999这里只有精品|