日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring 定时任务的几种实现

發布時間:2023/12/18 javascript 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring 定时任务的几种实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。

近日項目開發中需要執行一些定時任務,比如需要在每天凌晨時候,分析一次前一天的日志信息,借此機會整理了一下定時任務的幾種實現方式,由于項目采用spring框架,所以我都將結合spring框架來介紹。

一.分類

  • 從實現的技術上來分類,目前主要有三種技術(或者說有三種產品):

  • Java自帶的java.util.Timer類,這個類允許你調度一個java.util.TimerTask任務。使用這種方式可以讓你的程序按照某一個頻度執行,但不能在指定時間運行。一般用的較少,這篇文章將不做詳細介紹。
  • 使用Quartz,這是一個功能比較強大的的調度器,可以讓你的程序在指定時間執行,也可以按照某一個頻度執行,配置起來稍顯復雜,稍后會詳細介紹。
  • Spring3.0以后自帶的task,可以將它看成一個輕量級的Quartz,而且使用起來比Quartz簡單許多,稍后會介紹。
    • 從作業類的繼承方式來講,可以分為兩類:

  • 作業類需要繼承自特定的作業類基類,如Quartz中需要繼承自org.springframework.scheduling.quartz.QuartzJobBean;java.util.Timer中需要繼承自java.util.TimerTask。
  • 作業類即普通的java類,不需要繼承自任何基類。
  • 注:個人推薦使用第二種方式,因為這樣所以的類都是普通類,不需要事先區別對待。

    ?

    • 從任務調度的觸發時機來分,這里主要是針對作業使用的觸發器,主要有以下兩種:

  • 每隔指定時間則觸發一次,在Quartz中對應的觸發器為:org.springframework.scheduling.quartz.SimpleTriggerBean
  • 每到指定時間則觸發一次,在Quartz中對應的調度器為:org.springframework.scheduling.quartz.CronTriggerBean
  • 注:并非每種任務都可以使用這兩種觸發器,如java.util.TimerTask任務就只能使用第一種。Quartz和spring task都可以支持這兩種觸發條件。

    ?

    二.用法說明

    詳細介紹每種任務調度工具的使用方式,包括Quartz和spring task兩種。

    Quartz

    第一種,作業類繼承自特定的基類:org.springframework.scheduling.quartz.QuartzJobBean。

    第一步:定義作業類

    Java代碼??

  • import?org.quartz.JobExecutionContext;??
  • import?org.quartz.JobExecutionException;??
  • import?org.springframework.scheduling.quartz.QuartzJobBean;??
  • public?class?Job1?extends?QuartzJobBean?{??
  • ??
  • private?int?timeout;??
  • private?static?int?i?=?0;??
  • //調度工廠實例化后,經過timeout時間開始執行調度??
  • public?void?setTimeout(int?timeout)?{??
  • this.timeout?=?timeout;??
  • }??
  • ??
  • /**?
  • *?要調度的具體任務?
  • */??
  • @Override??
  • protected?void?executeInternal(JobExecutionContext?context)??
  • throws?JobExecutionException?{??
  • ??System.out.println("定時任務執行中…");??
  • }??
  • }??
  • ?第二步:spring配置文件中配置作業類JobDetailBean

    Xml代碼??

  • <bean?name="job1"?class="org.springframework.scheduling.quartz.JobDetailBean">??
  • <property?name="jobClass"?value="com.gy.Job1"?/>??
  • <property?name="jobDataAsMap">??
  • <map>??
  • <entry?key="timeout"?value="0"?/>??
  • </map>??
  • </property>??
  • </bean>??
  • ?說明:org.springframework.scheduling.quartz.JobDetailBean有兩個屬性,jobClass屬性即我們在java代碼中定義的任務類,jobDataAsMap屬性即該任務類中需要注入的屬性值。

    第三步:配置作業調度的觸發方式(觸發器)

    Quartz的作業觸發器有兩種,分別是

    org.springframework.scheduling.quartz.SimpleTriggerBean

    org.springframework.scheduling.quartz.CronTriggerBean

    第一種SimpleTriggerBean,只支持按照一定頻度調用任務,如每隔30分鐘運行一次。

    配置方式如下:

    Xml代碼??

  • <bean?id="simpleTrigger"?class="org.springframework.scheduling.quartz.SimpleTriggerBean">??
  • <property?name="jobDetail"?ref="job1"?/>??
  • <property?name="startDelay"?value="0"?/><!--?調度工廠實例化后,經過0秒開始執行調度?-->??
  • <property?name="repeatInterval"?value="2000"?/><!--?每2秒調度一次?-->??
  • </bean>??
  • 第二種CronTriggerBean,支持到指定時間運行一次,如每天12:00運行一次等。

    配置方式如下:

    Xml代碼??

  • <bean?id="cronTrigger"?class="org.springframework.scheduling.quartz.CronTriggerBean">??
  • <property?name="jobDetail"?ref="job1"?/>??
  • <!—每天12:00運行一次?-->??
  • <property?name="cronExpression"?value="0?0?12?*?*??"?/>??
  • </bean>??
  • ?關于cronExpression表達式的語法參見附錄。

    第四步:配置調度工廠?

    Xml代碼??

  • <bean?class="org.springframework.scheduling.quartz.SchedulerFactoryBean">??
  • <property?name="triggers">??
  • <list>??
  • <ref?bean="cronTrigger"?/>??
  • </list>??
  • </property>??
  • </bean>??
  • ?說明:該參數指定的就是之前配置的觸發器的名字。

    第五步:啟動你的應用即可,即將工程部署至tomcat或其他容器。

    ?

    第二種,作業類不繼承特定基類。

    Spring能夠支持這種方式,歸功于兩個類:

    org.springframework.scheduling.timer.MethodInvokingTimerTaskFactoryBean

    org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean

    這兩個類分別對應spring支持的兩種實現任務調度的方式,即前文提到到java自帶的timer task方式和Quartz方式。這里我只寫MethodInvokingJobDetailFactoryBean的用法,使用該類的好處是,我們的任務類不再需要繼承自任何類,而是普通的pojo。

    第一步:編寫任務類

    Java代碼??

  • public?class?Job2?{??
  • public?void?doJob2()?{??
  • System.out.println("不繼承QuartzJobBean方式-調度進行中...");??
  • }??
  • }??
  • ?可以看出,這就是一個普通的類,并且有一個方法。

    第二步:配置作業類

    Xml代碼??

  • <bean?id="job2"??
  • class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">??
  • <property?name="targetObject">??
  • <bean?class="com.gy.Job2"?/>??
  • </property>??
  • <property?name="targetMethod"?value="doJob2"?/>??
  • <property?name="concurrent"?value="false"?/><!--?作業不并發調度?-->??
  • </bean>??
  • ?說明:這一步是關鍵步驟,聲明一個MethodInvokingJobDetailFactoryBean,有兩個關鍵屬性:targetObject指定任務類,targetMethod指定運行的方法。往下的步驟就與方法一相同了,為了完整,同樣貼出。

    第三步:配置作業調度的觸發方式(觸發器)

    Quartz的作業觸發器有兩種,分別是

    org.springframework.scheduling.quartz.SimpleTriggerBean

    org.springframework.scheduling.quartz.CronTriggerBean

    第一種SimpleTriggerBean,只支持按照一定頻度調用任務,如每隔30分鐘運行一次。

    配置方式如下:

    Xml代碼??

  • <bean?id="simpleTrigger"?class="org.springframework.scheduling.quartz.SimpleTriggerBean">??
  • <property?name="jobDetail"?ref="job2"?/>??
  • <property?name="startDelay"?value="0"?/><!--?調度工廠實例化后,經過0秒開始執行調度?-->??
  • <property?name="repeatInterval"?value="2000"?/><!--?每2秒調度一次?-->??
  • </bean>??
  • ?第二種CronTriggerBean,支持到指定時間運行一次,如每天12:00運行一次等。

    配置方式如下:

    Xml代碼??

  • <bean?id="cronTrigger"?class="org.springframework.scheduling.quartz.CronTriggerBean">??
  • <property?name="jobDetail"?ref="job2"?/>??
  • <!—每天12:00運行一次?-->??
  • <property?name="cronExpression"?value="0?0?12?*?*??"?/>??
  • </bean>??
  • 以上兩種調度方式根據實際情況,任選一種即可。

    第四步:配置調度工廠?

    Xml代碼??

  • <bean?class="org.springframework.scheduling.quartz.SchedulerFactoryBean">??
  • <property?name="triggers">??
  • <list>??
  • <ref?bean="cronTrigger"?/>??
  • </list>??
  • </property>??
  • </bean>??
  • 說明:該參數指定的就是之前配置的觸發器的名字。

    第五步:啟動你的應用即可,即將工程部署至tomcat或其他容器。

    ?

    到此,spring中Quartz的基本配置就介紹完了,當然了,使用之前,要導入相應的spring的包與Quartz的包,這些就不消多說了。

    其實可以看出Quartz的配置看上去還是挺復雜的,沒有辦法,因為Quartz其實是個重量級的工具,如果我們只是想簡單的執行幾個簡單的定時任務,有沒有更簡單的工具,有!

    請看我第下文Spring task的介紹。

    ?

    Spring-Task

    上節介紹了在Spring 中使用Quartz,本文介紹Spring3.0以后自主開發的定時任務工具,spring task,可以將它比作一個輕量級的Quartz,而且使用起來很簡單,除spring相關的包外不需要額外的包,而且支持注解和配置文件兩種

    形式,下面將分別介紹這兩種方式。

    第一種:配置文件方式

    第一步:編寫作業類

    即普通的pojo,如下:

    Java代碼??

  • import?org.springframework.stereotype.Service;??
  • @Service??
  • public?class?TaskJob?{??
  • ??????
  • ????public?void?job1()?{??
  • ????????System.out.println(“任務進行中。。。”);??
  • ????}??
  • }??
  • ?第二步:在spring配置文件頭中添加命名空間及描述

    Xml代碼??

  • <beans?xmlns="http://www.springframework.org/schema/beans"??
  • ????xmlns:task="http://www.springframework.org/schema/task"???
  • ????。。。。。。??
  • ????xsi:schemaLocation="http://www.springframework.org/schema/task?http://www.springframework.org/schema/task/spring-task-3.0.xsd">??
  • ?第三步:spring配置文件中設置具體的任務

    Xml代碼??

  • ?<task:scheduled-tasks>???
  • ????????<task:scheduled?ref="taskJob"?method="job1"?cron="0?*?*?*?*??"/>???
  • </task:scheduled-tasks>??
  • ??
  • <context:component-scan?base-package="?com.gy.mytask?"?/>??
  • 說明:ref參數指定的即任務類,method指定的即需要運行的方法,cron及cronExpression表達式,具體寫法這里不介紹了,詳情見上篇文章附錄。

    <context:component-scan base-package="com.gy.mytask" />這個配置不消多說了,spring掃描注解用的。

    到這里配置就完成了,是不是很簡單。

    第二種:使用注解形式

    也許我們不想每寫一個任務類還要在xml文件中配置下,我們可以使用注解@Scheduled,我們看看源文件中該注解的定義:

    Java代碼??

  • @Target({java.lang.annotation.ElementType.METHOD,?java.lang.annotation.ElementType.ANNOTATION_TYPE})??
  • @Retention(RetentionPolicy.RUNTIME)??
  • @Documented??
  • public?@interface?Scheduled??
  • {??
  • ??public?abstract?String?cron();??
  • ??
  • ??public?abstract?long?fixedDelay();??
  • ??
  • ??public?abstract?long?fixedRate();??
  • }??
  • ?可以看出該注解有三個方法或者叫參數,分別表示的意思是:

    cron:指定cron表達式

    fixedDelay:官方文檔解釋:An interval-based trigger where the interval is measured from the completion time of the previous task. The time unit value is measured in milliseconds.即表示從上一個任務完成開始到下一個任務開始的間隔,單位是毫秒。

    fixedRate:官方文檔解釋:An interval-based trigger where the interval is measured from the start time of the previous task. The time unit value is measured in milliseconds.即從上一個任務開始到下一個任務開始的間隔,單位是毫秒。

    ?

    下面我來配置一下。

    第一步:編寫pojo

    Java代碼??

  • import?org.springframework.scheduling.annotation.Scheduled;????
  • import?org.springframework.stereotype.Component;??
  • ??
  • @Component(“taskJob”)??
  • public?class?TaskJob?{??
  • ????@Scheduled(cron?=?"0?0?3?*?*??")??
  • ????public?void?job1()?{??
  • ????????System.out.println(“任務進行中。。。”);??
  • ????}??
  • }??
  • ?第二步:添加task相關的配置:

    Xml代碼??

  • <beans?xmlns="http://www.springframework.org/schema/beans"??
  • ????xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"?xmlns:aop="http://www.springframework.org/schema/aop"??
  • ????xmlns:context="http://www.springframework.org/schema/context"??
  • ????xmlns:tx="http://www.springframework.org/schema/tx"??
  • ????xmlns:task="http://www.springframework.org/schema/task"??
  • ????xsi:schemaLocation="??
  • ????????http://www.springframework.org/schema/beans?http://www.springframework.org/schema/beans/spring-beans-3.0.xsd??
  • ????????http://www.springframework.org/schema/aop?http://www.springframework.org/schema/aop/spring-aop-3.0.xsd??
  • ????????http://www.springframework.org/schema/context???
  • http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd??
  • ????????http://www.springframework.org/schema/tx?http://www.springframework.org/schema/tx/spring-tx-3.0.xsd??
  • ????????http://www.springframework.org/schema/task?http://www.springframework.org/schema/task/spring-task-3.0.xsd"??
  • ????default-lazy-init="false">??
  • ??
  • ??
  • ????<context:annotation-config?/>??
  • ????<!—spring掃描注解的配置???-->??
  • ????<context:component-scan?base-package="com.gy.mytask"?/>??
  • ??????
  • <!—開啟這個配置,spring才能識別@Scheduled注解???-->??
  • ????<task:annotation-driven?scheduler="qbScheduler"?mode="proxy"/>??
  • ????<task:scheduler?id="qbScheduler"?pool-size="10"/>??
  • 說明:理論上只需要加上<task:annotation-driven />這句配置就可以了,這些參數都不是必須的。

    ?

    ?Ok配置完畢,當然spring task還有很多參數,我就不一一解釋了,具體參考xsd文檔http://www.springframework.org/schema/task/spring-task-3.0.xsd。

    附錄:

    cronExpression的配置說明,具體使用以及參數請百度google

    字段 ? 允許值 ? 允許的特殊字符

    秒 ? ?0-59 ? ?, - * /

    分 ? ?0-59 ? ?, - * /

    小時 ? ?0-23 ? ?, - * /

    日期 ? ?1-31 ? ?, - * ? / L W C

    月份 ? ?1-12 或者 JAN-DEC ? ?, - * /

    星期 ? ?1-7 或者 SUN-SAT ? ?, - * ? / L C #

    年(可選) ? ?留空, 1970-2099 ? ?, - * /?

    - 區間 ?

    * 通配符 ?

    ? 你不想設置那個字段

    下面只例出幾個式子

    ?

    ?

    ?CRON表達式詳解 見另一頁博客:http://blog.csdn.net/jiangyu1013/article/details/54405859

    CRON表達式 ? ?含義?

    "0 0 12 * * ?" ? ?每天中午十二點觸發?

    "0 15 10 ? * *" ? ?每天早上10:15觸發?

    "0 15 10 * * ?" ? ?每天早上10:15觸發?

    "0 15 10 * * ? *" ? ?每天早上10:15觸發?

    "0 15 10 * * ? 2005" ? ?2005年的每天早上10:15觸發?

    "0 * 14 * * ?" ? ?每天從下午2點開始到2點59分每分鐘一次觸發?

    "0 0/5 14 * * ?" ? ?每天從下午2點開始到2:55分結束每5分鐘一次觸發?

    "0 0/5 14,18 * * ?" ? ?每天的下午2點至2:55和6點至6點55分兩個時間段內每5分鐘一次觸發?

    "0 0-5 14 * * ?" ? ?每天14:00至14:05每分鐘一次觸發?

    "0 10,44 14 ? 3 WED" ? ?三月的每周三的14:10和14:44觸發?

    "0 15 10 ? * MON-FRI" ? ?每個周一、周二、周三、周四、周五的10:15觸發?

    ?

    轉自:http://gong1208.iteye.com/blog/1773177

    ?

    總結

    以上是生活随笔為你收集整理的Spring 定时任务的几种实现的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 欧美精品日韩少妇 | 国产最新在线观看 | 日韩喷潮 | 久久性感美女视频 | 91亚洲欧美 | 99re在线精品 | 嫩草嫩草嫩草嫩草嫩草嫩草 | 成人性生交大片免费看vrv66 | 成人无码av片在线观看 | 天天干天天色天天射 | 91视频国产精品 | 少妇人妻综合久久中文字幕 | 亚洲精品久久久久av无码 | 日韩成人精品一区二区 | 国产精品日日做人人爱 | 中国黄色小视频 | 亚洲春色在线观看 | 欧美日韩在线视频一区 | 亚洲精品国产精品国自产网站 | jizz日本在线| 中文在线资源天堂 | 美女被爆操网站 | 免费观看视频一区二区 | 啪啪免费网 | 欧美啪啪一区二区 | 国产精品三区四区 | 吊侵犯の奶水授乳羞羞漫画 | 男女毛片视频 | av官网| 色老头在线一区二区三区 | 91精品国产91久久久久久黑人 | 亚洲精品成人 | 开心成人激情 | 老地方在线观看免费动漫 | 天天插天天干天天操 | 中文字幕中文字幕 | 欧美少妇b| 亚洲free性xxxx护士白浆 | 免费在线小视频 | 九色婷婷 | 原创真实夫妻啪啪av | 狠狠成人 | 免费在线观看av的网站 | 午夜视频免费 | 欧美美女爱爱视频 | 嫩模一区二区三区 | 好吊妞精品| 不卡中文字幕在线观看 | 在线a免费| 欧洲精品在线观看 | 毛片亚洲av无码精品国产午夜 | 激情午夜视频 | 亚洲欧美日韩成人在线 | 女人18毛片水真多 | 综合精品久久久 | 强侵犯の奶水授乳羞羞漫虐 | 麻豆成人在线观看 | 在线观看精品视频 | 狼人伊人av | 激情六月| 韩国性猛交╳xxx乱大交 | 亚洲乱人伦 | 超碰在线进入 | 欧美情侣性视频 | 国产真实乱在线更新 | 国产福利在线观看视频 | 美女试爆场恐怖电影在线观看 | 成人拍拍视频 | 亚洲精品久久久乳夜夜欧美 | 精品黄色一级片 | 久久亚洲AV无码专区成人国产 | 精品久久99 | 日本大尺度做爰呻吟 | 美国免费高清电影在线观看 | 亚洲电影中文字幕 | 少妇一级淫片aaaaaaa | 婷婷色一区二区三区 | 涩涩的视频在线观看 | 欧美人妻精品一区二区免费看 | 欧美成人国产va精品日本一级 | 欧美熟妇精品久久久久久 | 久久久欧美精品sm网站 | 激情aaa| 校园春色在线观看 | 欧美成人国产va精品日本一级 | 欧美日韩中字 | 一区二区在线视频 | 偷偷久久 | 蜜桃91丨九色丨蝌蚪91桃色 | 日本一区二区人妻 | 精品成人中文无码专区 | 伊人影视大全 | 国产三级网站 | 自拍偷拍国内 | 中文字幕在线网站 | 色屋永久 | 久久视频在线观看 | 一二三四区视频 | 黄色一级影片 |