" />

最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

springboot整合quartz實現定時任務示例

 更新時間:2017年04月14日 14:54:15   作者:大招無限  
spring支持多種定時任務的實現。我們來介紹下使用spring的定時器和使用quartz定時器,具有一定的參考價值,感興趣的小伙伴們可以參考一下。

在做項目時有時候會有定時器任務的功能,比如某某時間應該做什么,多少秒應該怎么樣之類的。

spring支持多種定時任務的實現。我們來介紹下使用spring的定時器和使用quartz定時器

1.我們使用spring-boot作為基礎框架,其理念為零配置文件,所有的配置都是基于注解和bean的方式。

2.使用spring的定時器:

spring自帶支持定時器的任務實現。其可通過簡單配置來使用到簡單的定時任務。

沒了,沒錯,使用spring的定時任務就這么簡單,其中有幾個比較重要的注解:

@Scheduled(fixedRate = 1000 * 30)  定義某個定時任務。

3.使用quartz實現定時任務。

Quartz設計者做了一個設計選擇來從調度分離開作業(yè)。Quartz中的觸發(fā)器用來告訴調度程序作業(yè)什么時候觸發(fā)??蚣芴峁┝艘话延|發(fā)器類型,但兩個最常用的是SimpleTrigger和CronTrigger。SimpleTrigger為需要簡單打火調度而設計。典型地,如果你需要在給定的時間和重復次數或者兩次打火之間等待的秒數打火一個作業(yè),那么SimpleTrigger適合你。另一方面,如果你有許多復雜的作業(yè)調度,那么或許需要CronTrigger。

CronTrigger是基于Calendar-like調度的。當你需要在除星期六和星期天外的每天上午10點半執(zhí)行作業(yè)時,那么應該使用CronTrigger。正如它的名字所暗示的那樣,CronTrigger是基于Unix克隆表達式的。

使用quartz說使用的maven依賴。    

<dependency>
  <groupId>org.quartz-scheduler</groupId>
  <artifactId>quartz</artifactId>
  <version>1.8.4</version>
</dependency>

由于我們使用的是spring-boot框架,其目的是做到零配置文件,所以我們不使用xml文件的配置文件來定義一個定時器,而是使用向spring容器bean的方式。

向spring容器暴露所必須的bean

@Configuration
public class SchedledConfiguration {

  // 配置中設定了
  // ① targetMethod: 指定需要定時執(zhí)行scheduleInfoAction中的simpleJobTest()方法
  // ② concurrent:對于相同的JobDetail,當指定多個Trigger時, 很可能第一個job完成之前,
  // 第二個job就開始了。指定concurrent設為false,多個job不會并發(fā)運行,第二個job將不會在第一個job完成之前開始。
  // ③ cronExpression:0/10 * * * * ?表示每10秒執(zhí)行一次,具體可參考附表。
  // ④ triggers:通過再添加其他的ref元素可在list中放置多個觸發(fā)器。 scheduleInfoAction中的simpleJobTest()方法
  @Bean(name = "detailFactoryBean")
  public MethodInvokingJobDetailFactoryBean detailFactoryBean(ScheduledTasks scheduledTasks){
    MethodInvokingJobDetailFactoryBean bean = new MethodInvokingJobDetailFactoryBean ();
    bean.setTargetObject (scheduledTasks);
    bean.setTargetMethod ("reportCurrentByCron");
    bean.setConcurrent (false);
    return bean;
  }

  @Bean(name = "cronTriggerBean")
  public CronTriggerBean cronTriggerBean(MethodInvokingJobDetailFactoryBean detailFactoryBean){
    CronTriggerBean tigger = new CronTriggerBean ();
    tigger.setJobDetail (detailFactoryBean.getObject ());
    try {
      tigger.setCronExpression ("0/5 * * * * ? ");//每5秒執(zhí)行一次
    } catch (ParseException e) {
      e.printStackTrace ();
    }
    return tigger;

  }

  @Bean
  public SchedulerFactoryBean schedulerFactory(CronTriggerBean[] cronTriggerBean){
    SchedulerFactoryBean bean = new SchedulerFactoryBean ();
    System.err.println (cronTriggerBean[0]);
    bean.setTriggers (cronTriggerBean);
    return bean;
  }
}

MethodInvokingJobDetailFactoryBean:此工廠主要用來制作一個jobDetail,即制作一個任務。由于我們所做的定時任務根本上講其實就是執(zhí)行一個方法。所以用這個工廠比較方便。

注意:其setTargetObject所設置的是一個對象而不是一個類。

CronTriggerBean:定義一個觸發(fā)器。

注意:setCronExpression:是一個表達式,如果此表達式不合規(guī)范,即會拋出異常。

SchedulerFactoryBean:主要的管理的工廠,這是最主要的一個bean。quartz通過這個工廠來進行對各觸發(fā)器的管理。

4.對quartz的封裝

由上面代碼可以看出來,此處我們設置的是一個固定的cronExpression,那么,做為項目中使用的話,我們一般是需要其動態(tài)設置比如從數據庫中取出來。

其實做法也很簡單,我們只需要定義一個Trigger來繼承CronTriggerBean。頂用其setCronExpression方法即可。

那么另外一個問題,如果我們要定義兩個定時任務則會比較麻煩,需要先注入一個任務工廠,在注入一個觸發(fā)器。

為了減少這樣的配置,我們定義了一個抽象的超類來繼承CronTriggerBean。

具體代碼如下:

public abstract class BaseCronTrigger extends CronTriggerBean implements Serializable {

  private static final long serialVersionUID = 1L;

  public void init(){
    // 得到任務
    JobDetail jobdetail = new JobDetail (this.getClass ().getSimpleName (),this.getMyTargetObject ().getClass ());
    this.setJobDetail (jobdetail);
    this.setJobName (jobdetail.getName ());
    this.setName (this.getClass ().getSimpleName ());
    try {
      this.setCronExpression (this.getMyCronExpression ());
    } catch (java.text.ParseException e) {
      e.printStackTrace ();
    }

  }

  public abstract String getMyCronExpression();

  public abstract Job getMyTargetObject();

}

其init()方法,來為這個觸發(fā)器綁定任務。其任務為一個Job類型的,也就是說其執(zhí)行的任務為實現了Job接口的類,這個任務會有一個execute()方法,來執(zhí)行任務題。

為了給觸發(fā)器添加任務,我們需要在子類中調用init()方法,由于spring容器注入時是使用的空參的構造函數,所以我們在此構造函數中調用init()方法。

@Component
public class InitializingCronTrigger extends BaseCronTrigger implements Serializable {

  private static final long  serialVersionUID = 1L;

  @Autowired
  private SchedulerFactoryBean schedulerFactoryBean;

  public InitializingCronTrigger() {
    init ();
  }

  @Override
  public String getMyCronExpression(){
    return "0/5 * * * * ?";
  }

  @Override
  public Job getMyTargetObject(){
    return new ScheduledTasks ();
  }

  public void parse(){
    try {
      schedulerFactoryBean.getObject ().pauseAll ();
    } catch (SchedulerException e) {
      e.printStackTrace ();
    }
  }

}

此時我們只需要在配置類中加入一個配置就可以了。

 @Bean
  public SchedulerFactoryBean schedulerFactory(CronTriggerBean[] cronTriggerBean){
    SchedulerFactoryBean bean = new SchedulerFactoryBean ();
    System.err.println (cronTriggerBean[0]);
    bean.setTriggers (cronTriggerBean);

    return bean;
  }

4.介紹一個cronExpression表達式

字段允許值允許的特殊字符
0-59, - * /
0-59, - * /
小時0-23, - * /
日期1-31, - * / L W C
月份1-12 或者 JAN-DEC, - * /
星期1-7 或者 SUN-SAT, - * / L C #
年(可選)留空, 1970-2099, - * /

如上面的表達式所示:

“*”字符被用來指定所有的值。如:”*“在分鐘的字段域里表示“每分鐘”。

“-”字符被用來指定一個范圍。如:“10-12”在小時域意味著“10點、11點、12點”。

“,”字符被用來指定另外的值。如:“MON,WED,FRI”在星期域里表示”星期一、星期三、星期五”.

“?”字符只在日期域和星期域中使用。它被用來指定“非明確的值”。當你需要通過在這兩個域中的一個來指定一些東西的時候,它是有用的??聪旅娴睦幽憔蜁靼住?/p>

“L”字符指定在月或者星期中的某天(最后一天)。即“Last ”的縮寫。但是在星期和月中“L”表示不同的意思,如:在月子段中“L”指月份的最后一天-1月31日,2月28日,如果在星期字段中則簡單的表示為“7”或者“SAT”。如果在星期字段中在某個value值得后面,則表示“某月的最后一個星期value”,如“6L”表示某月的最后一個星期五。

“W”字符只能用在月份字段中,該字段指定了離指定日期最近的那個星期日。

“#”字符只能用在星期字段,該字段指定了第幾個星期value在某月中

每一個元素都可以顯式地規(guī)定一個值(如6),一個區(qū)間(如9-12),一個列表(如9,11,13)或一個通配符(如*)。“月份中的日期”和“星期中的日期”這兩個元素是互斥的,因此應該通過設置一個問號(?)來表明你不想設置的那個字段。表7.1中顯示了一些cron表達式的例子和它們的意義:

表達式

意義
"0 0 12 * * ?"每天中午12點觸發(fā)
"0 15 10 ? * *"每天上午10:15觸發(fā)
"0 15 10 * * ?"每天上午10:15觸發(fā)
"0 15 10 * * ? *"每天上午10:15觸發(fā)
"0 15 10 * * ? 2005"2005年的每天上午10:15觸發(fā)
"0 * 14 * * ?"在每天下午2點到下午2:59期間的每1分鐘觸發(fā)
"0 0/5 14 * * ?"在每天下午2點到下午2:55期間的每5分鐘觸發(fā)
"0 0/5 14,18 * * ?"在每天下午2點到2:55期間和下午6點到6:55期間的每5分鐘觸發(fā)
"0 0-5 14 * * ?"在每天下午2點到下午2:05期間的每1分鐘觸發(fā)
"0 10,44 14 ? 3 WED"每年三月的星期三的下午2:10和2:44觸發(fā)
"0 15 10 ? * MON-FRI"周一至周五的上午10:15觸發(fā)
"0 15 10 15 * ?"每月15日上午10:15觸發(fā)
"0 15 10 L * ?"每月最后一日的上午10:15觸發(fā)
"0 15 10 ? * 6L"每月的最后一個星期五上午10:15觸發(fā)
"0 15 10 ? * 6L 2002-2005"2002年至2005年的每月的最后一個星期五上午10:15觸發(fā)
"0 15 10 ? * 6#3"每月的第三個星期五上午10:15觸發(fā)

每天早上6點 0 6 * * *

每兩個小時 0 */2 * * *

晚上11點到早上8點之間每兩個小時,早上八點 0 23-7/2,8 * * *

每個月的4號和每個禮拜的禮拜一到禮拜三的早上11點 0 11 4 * 1-3

1月1日早上4點 0 4 1 1 *

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • MyBatis多表查詢的操作方法注解和XML實現SQL語句

    MyBatis多表查詢的操作方法注解和XML實現SQL語句

    這篇文章主要介紹了MyBatis多表查詢的操作方法注解和XML實現SQL語句,本文通過實例代碼給大家介紹的非常詳細,感興趣的朋友一起看看吧
    2025-04-04
  • Spring多種加載Bean方式解析

    Spring多種加載Bean方式解析

    本篇文章主要介紹了Spring多種加載Bean方式解析,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • Java 操作Properties配置文件詳解

    Java 操作Properties配置文件詳解

    這篇文章主要介紹了Java 操作Properties配置文件詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • Java中數組的創(chuàng)建與傳參方法(學習小結)

    Java中數組的創(chuàng)建與傳參方法(學習小結)

    這篇文章主要介紹了Java中數組的創(chuàng)建與傳參方法,非常不錯,具有參考借鑒價值,需要的朋友可以參考下
    2016-09-09
  • Java利用遺傳算法求解最短路徑問題

    Java利用遺傳算法求解最短路徑問題

    遺傳算法(Genetic Algorithm,GA)最早是由美國的John holland于20世紀70年代提出,該算法是根據大自然中生物體進化規(guī)律而設計提出的。本文將利用遺傳算法求解最短路徑問題,需要的可以參考一下
    2022-06-06
  • 全局記錄Feign的請求和響應日志方式

    全局記錄Feign的請求和響應日志方式

    這篇文章主要介紹了全局記錄Feign的請求和響應日志方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • 運行Jar包出現提示xxx中沒有主清單屬性報錯問題解決方法

    運行Jar包出現提示xxx中沒有主清單屬性報錯問題解決方法

    這篇文章主要介紹了運行Jar包出現:xxx中沒有主清單屬性報錯,當出現報錯:xxx中沒有主清單屬性,解決方法也很簡單,在pom.xml配置中,加上相應配置即可,需要的朋友可以參考下
    2023-08-08
  • redisson.tryLock()參數的使用及理解

    redisson.tryLock()參數的使用及理解

    這篇文章主要介紹了redisson.tryLock()參數的使用,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • 手把手教你在eclipse創(chuàng)建第一個java?web項目并運行

    手把手教你在eclipse創(chuàng)建第一個java?web項目并運行

    Eclipse是用來做開發(fā)的自由集成開發(fā)環(huán)境,這也是很多java程序員會使用的開發(fā)環(huán)境,所以可以使用eclipse創(chuàng)建javaweb項目,下面這篇文章主要給大家介紹了關于如何在eclipse創(chuàng)建第一個java?web項目并運行的相關資料,需要的朋友可以參考下
    2023-02-02
  • JAVA 中解密RSA算法JS加密實例詳解

    JAVA 中解密RSA算法JS加密實例詳解

    這篇文章主要介紹了JAVA 中解密RSA算法JS加密 的相關資料,需要的朋友可以參考下
    2017-04-04

最新評論

乌拉特后旗| 瑞丽市| 桐柏县| 龙泉市| 海安县| 仲巴县| 榆树市| 新野县| 溧水县| 扬州市| 鹤山市| 噶尔县| 韶山市| 恩施市| 尤溪县| 奉新县| 邢台县| 山西省| 双桥区| 浙江省| 邮箱| 黎平县| 鄢陵县| 高平市| 久治县| 商城县| 南城县| 高邮市| 象山县| 灵丘县| 灵台县| 延边| 磐石市| 壶关县| 聂拉木县| 昌平区| 阿图什市| 宁蒗| 疏勒县| 弥渡县| 忻城县|