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

首頁 > 編程 > JSP > 正文

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

2024-09-05 00:18:52
字體:
來源:轉載
供稿:網友

我們在開發項目的時候,經常會出現任務延遲和周期性的問題,那么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 */@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">    <!-- 每半分鐘觸發任務 -->    <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中Spring task定時任務的深入理解,希望本篇文章能幫助到大家想要學習的知識,想要學習更多的專業知識,請收藏js.VeVb.com吧!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产女人精品视频| 2021国产精品视频| 欧美激情国产精品| 亚洲一区二区三区香蕉| 亚洲精品在线不卡| 欧美在线观看www| 国产在线观看不卡| 国产精品扒开腿做爽爽爽男男| 欧美三级免费观看| 精品久久久中文| 精品日本高清在线播放| 日日骚av一区| 日韩中文在线中文网在线观看| 色偷偷综合社区| 亚洲电影免费观看高清完整版| 青青草99啪国产免费| 777精品视频| 97在线看免费观看视频在线观看| 久久久久久久久久久免费| 欧美日韩美女在线| 狠狠色狠狠色综合日日五| 欧美激情久久久| 亚洲国产日韩欧美综合久久| 欧美性xxxxxxx| 亚洲精品国产精品国自产在线| 亚洲一区二区在线| 欧美精品videosex性欧美| 成人性生交大片免费观看嘿嘿视频| 久久精品国产亚洲| 国产亚洲欧美日韩一区二区| 色婷婷av一区二区三区久久| 久久久久久久久亚洲| 欧美一级电影免费在线观看| 午夜精品国产精品大乳美女| www.日韩.com| 欧美剧在线观看| 日韩在线国产精品| 国产精品久久色| 精品欧美一区二区三区| 国产欧美在线看| 91夜夜揉人人捏人人添红杏| 国产这里只有精品| 国产中文字幕亚洲| 欧美日韩中国免费专区在线看| 97在线免费观看| 国产99久久精品一区二区 夜夜躁日日躁| 福利视频导航一区| 日日摸夜夜添一区| 亚洲国产高清自拍| 国产精品视频自拍| 国产精品你懂得| 亚洲综合日韩在线| 国产精品精品一区二区三区午夜版| 中日韩午夜理伦电影免费| 欧美在线亚洲在线| 亚洲色图偷窥自拍| 亚洲色图50p| 亚洲国产黄色片| 成人国产精品久久久久久亚洲| 91超碰中文字幕久久精品| 一区二区三区四区在线观看视频| 国产一区二区三区直播精品电影| 2018日韩中文字幕| 日韩精品欧美国产精品忘忧草| 国产精品视频精品| 精品女同一区二区三区在线播放| 亚洲aⅴ男人的天堂在线观看| 亚洲精品国产成人| 精品女厕一区二区三区| 欧美日韩美女在线| 久久久久久久久久久成人| 亚洲天堂色网站| 亚洲成人动漫在线播放| 国产成人午夜视频网址| 欧美专区福利在线| www.欧美三级电影.com| 色爱av美腿丝袜综合粉嫩av| 国产91ⅴ在线精品免费观看| 欧美一区第一页| 国产午夜精品一区理论片飘花| 国产日韩在线一区| 欧美性jizz18性欧美| 久久亚洲国产精品| 欧美第一黄网免费网站| 色与欲影视天天看综合网| 人人爽久久涩噜噜噜网站| 91在线无精精品一区二区| 国产精品99久久久久久久久| 国内成人精品视频| 欧美国产亚洲精品久久久8v| 亚洲香蕉成人av网站在线观看| 精品成人av一区| 97香蕉久久夜色精品国产| 91经典在线视频| 国模极品一区二区三区| 久久久久久久久久久成人| 成人信息集中地欧美| 高清在线视频日韩欧美| 欧美一区三区三区高中清蜜桃| 亚洲91精品在线观看| 国产精品第一页在线| 中文字幕日韩av电影| 欧美精品激情视频| 色在人av网站天堂精品| 亚洲国产精品久久91精品| 欧美亚洲日本网站| 黄色成人在线播放| 中文字幕一区日韩电影| 精品毛片网大全| 国产91在线播放| 热久久免费视频精品| 欧美激情中文字幕乱码免费| 欧美精品久久久久久久久久| 精品中文视频在线| 成人精品久久一区二区三区| 欧美激情网友自拍| 国产精品91视频| 孩xxxx性bbbb欧美| 久久久国产一区二区| 欧美日本高清一区| 国产精品福利无圣光在线一区| 国产一区二区日韩精品欧美精品| 91久久精品国产91久久性色| 久久久视频精品| 欧美激情a在线| 日韩第一页在线| 91wwwcom在线观看| 91精品国产高清久久久久久91| 精品在线欧美视频| 国产亚洲精品美女久久久久| www.日韩不卡电影av| 亚洲精品免费一区二区三区| 亚洲自拍欧美另类| 日韩高清电影免费观看完整| 色777狠狠综合秋免鲁丝| 91精品在线观看视频| 91高清视频在线免费观看| 国产区精品在线观看| 亚洲午夜未删减在线观看| 中文国产成人精品久久一| 国产精品黄视频| 日韩av在线免费观看一区| 国产精品亚洲综合天堂夜夜| 91久久国产精品| 欧美成人亚洲成人日韩成人| 欧洲精品毛片网站| 精品国内亚洲在观看18黄| 欧美激情一区二区三级高清视频| 亚洲成人网av| 欧美专区在线视频| 久久久成人av| 91亚洲精品在线观看| 尤物yw午夜国产精品视频明星| 美女视频久久黄| 久久在线精品视频| 久久精品久久久久久| 国产午夜精品免费一区二区三区| 7m精品福利视频导航| 91久热免费在线视频| xxav国产精品美女主播| 4388成人网| 日韩av电影在线免费播放| 亚洲影院色无极综合| 亚洲精品网站在线播放gif|