" />

欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

springboot整合quartz實(shí)現(xiàn)定時(shí)任務(wù)示例

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

在做項(xiàng)目時(shí)有時(shí)候會(huì)有定時(shí)器任務(wù)的功能,比如某某時(shí)間應(yīng)該做什么,多少秒應(yīng)該怎么樣之類的。

spring支持多種定時(shí)任務(wù)的實(shí)現(xiàn)。我們來介紹下使用spring的定時(shí)器和使用quartz定時(shí)器

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

2.使用spring的定時(shí)器:

spring自帶支持定時(shí)器的任務(wù)實(shí)現(xiàn)。其可通過簡單配置來使用到簡單的定時(shí)任務(wù)。

沒了,沒錯(cuò),使用spring的定時(shí)任務(wù)就這么簡單,其中有幾個(gè)比較重要的注解:

@Scheduled(fixedRate = 1000 * 30)  定義某個(gè)定時(shí)任務(wù)。

3.使用quartz實(shí)現(xiàn)定時(shí)任務(wù)。

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

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

使用quartz說使用的maven依賴?!   ?/p>

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

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

向spring容器暴露所必須的bean

@Configuration
public class SchedledConfiguration {

  // 配置中設(shè)定了
  // ① targetMethod: 指定需要定時(shí)執(zhí)行scheduleInfoAction中的simpleJobTest()方法
  // ② concurrent:對(duì)于相同的JobDetail,當(dāng)指定多個(gè)Trigger時(shí), 很可能第一個(gè)job完成之前,
  // 第二個(gè)job就開始了。指定concurrent設(shè)為false,多個(gè)job不會(huì)并發(fā)運(yùn)行,第二個(gè)job將不會(huì)在第一個(gè)job完成之前開始。
  // ③ cronExpression:0/10 * * * * ?表示每10秒執(zhí)行一次,具體可參考附表。
  // ④ triggers:通過再添加其他的ref元素可在list中放置多個(gè)觸發(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:此工廠主要用來制作一個(gè)jobDetail,即制作一個(gè)任務(wù)。由于我們所做的定時(shí)任務(wù)根本上講其實(shí)就是執(zhí)行一個(gè)方法。所以用這個(gè)工廠比較方便。

注意:其setTargetObject所設(shè)置的是一個(gè)對(duì)象而不是一個(gè)類。

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

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

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

4.對(duì)quartz的封裝

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

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

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

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

具體代碼如下:

public abstract class BaseCronTrigger extends CronTriggerBean implements Serializable {

  private static final long serialVersionUID = 1L;

  public void init(){
    // 得到任務(wù)
    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()方法,來為這個(gè)觸發(fā)器綁定任務(wù)。其任務(wù)為一個(gè)Job類型的,也就是說其執(zhí)行的任務(wù)為實(shí)現(xiàn)了Job接口的類,這個(gè)任務(wù)會(huì)有一個(gè)execute()方法,來執(zhí)行任務(wù)題。

為了給觸發(fā)器添加任務(wù),我們需要在子類中調(diào)用init()方法,由于spring容器注入時(shí)是使用的空參的構(gòu)造函數(shù),所以我們?cè)诖藰?gòu)造函數(shù)中調(diào)用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 ();
    }
  }

}

此時(shí)我們只需要在配置類中加入一個(gè)配置就可以了。

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

    return bean;
  }

4.介紹一個(gè)cronExpression表達(dá)式

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

如上面的表達(dá)式所示:

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

“-”字符被用來指定一個(gè)范圍。如:“10-12”在小時(shí)域意味著“10點(diǎn)、11點(diǎn)、12點(diǎn)”。

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

“?”字符只在日期域和星期域中使用。它被用來指定“非明確的值”。當(dāng)你需要通過在這兩個(gè)域中的一個(gè)來指定一些東西的時(shí)候,它是有用的。看下面的例子你就會(huì)明白。

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

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

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

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

表達(dá)式

意義
"0 0 12 * * ?"每天中午12點(diǎn)觸發(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點(diǎn)到下午2:59期間的每1分鐘觸發(fā)
"0 0/5 14 * * ?"在每天下午2點(diǎn)到下午2:55期間的每5分鐘觸發(fā)
"0 0/5 14,18 * * ?"在每天下午2點(diǎn)到2:55期間和下午6點(diǎn)到6:55期間的每5分鐘觸發(fā)
"0 0-5 14 * * ?"在每天下午2點(diǎn)到下午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"每月的最后一個(gè)星期五上午10:15觸發(fā)
"0 15 10 ? * 6L 2002-2005"2002年至2005年的每月的最后一個(gè)星期五上午10:15觸發(fā)
"0 15 10 ? * 6#3"每月的第三個(gè)星期五上午10:15觸發(fā)

每天早上6點(diǎn) 0 6 * * *

每兩個(gè)小時(shí) 0 */2 * * *

晚上11點(diǎn)到早上8點(diǎn)之間每兩個(gè)小時(shí),早上八點(diǎn) 0 23-7/2,8 * * *

每個(gè)月的4號(hào)和每個(gè)禮拜的禮拜一到禮拜三的早上11點(diǎn) 0 11 4 * 1-3

1月1日早上4點(diǎn) 0 4 1 1 *

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • java解析xml之jdom解析xml示例分享

    java解析xml之jdom解析xml示例分享

    JDOM是專門為Java打造的API,JDOM采用了Java中的Collection架構(gòu)來封裝集合,是Java愛好者更加熟悉的模式,下面看使用示例
    2014-01-01
  • 使用Spring由構(gòu)造方法自動(dòng)裝配

    使用Spring由構(gòu)造方法自動(dòng)裝配

    這篇文章主要介紹了使用Spring由構(gòu)造方法自動(dòng)裝配,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • SpringCloud Gateway的基本入門和注意點(diǎn)詳解

    SpringCloud Gateway的基本入門和注意點(diǎn)詳解

    這篇文章主要介紹了SpringCloud Gateway的基本入門和注意點(diǎn),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10
  • MyBatisPlus深入探究映射匹配的兼容性

    MyBatisPlus深入探究映射匹配的兼容性

    在最近的工作中,碰到一個(gè)比較復(fù)雜的返回結(jié)果,發(fā)現(xiàn)簡單映射已經(jīng)解決不了這個(gè)問題了,只好去求助百度,學(xué)習(xí)mybatis映射匹配應(yīng)該怎么寫,將學(xué)習(xí)筆記結(jié)合工作碰到的問題寫下本文,供自身查漏補(bǔ)缺,同時(shí)已被不時(shí)之需
    2022-08-08
  • 淺析Java中Future接口的使用方法

    淺析Java中Future接口的使用方法

    在Java開發(fā)中,異步編程是提高系統(tǒng)性能和響應(yīng)能力的重要手段之一。本文將深入探討Future接口的原理和源碼解讀,幫助讀者更好地理解Future接口的工作機(jī)制和使用方法
    2023-05-05
  • java Quartz定時(shí)器任務(wù)與Spring task定時(shí)的幾種實(shí)現(xiàn)方法

    java Quartz定時(shí)器任務(wù)與Spring task定時(shí)的幾種實(shí)現(xiàn)方法

    本篇文章主要介紹了java Quartz定時(shí)器任務(wù)與Spring task定時(shí)的幾種實(shí)現(xiàn)方法的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下。
    2017-02-02
  • Java輸入學(xué)號(hào)、姓名、年齡并對(duì)其進(jìn)行輸出的實(shí)現(xiàn)方法

    Java輸入學(xué)號(hào)、姓名、年齡并對(duì)其進(jìn)行輸出的實(shí)現(xiàn)方法

    這篇文章主要給大家介紹了關(guān)于Java輸入學(xué)號(hào)、姓名、年齡并對(duì)其進(jìn)行輸出的實(shí)現(xiàn)方法,在計(jì)算機(jī)編程中,輸出學(xué)號(hào)和姓名是一個(gè)常見的任務(wù),文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • Java并發(fā)編程加鎖導(dǎo)致的活躍性問題詳解方案

    Java并發(fā)編程加鎖導(dǎo)致的活躍性問題詳解方案

    所謂并發(fā)編程是指在一臺(tái)處理器上"同時(shí)"處理多個(gè)任務(wù)。并發(fā)是在同一實(shí)體上的多個(gè)事件。多個(gè)事件在同一時(shí)間間隔發(fā)生,所以編寫正確的程序很難,而編寫正確的并發(fā)程序則難上加難
    2021-10-10
  • Java并發(fā)多線程編程之CountDownLatch的用法

    Java并發(fā)多線程編程之CountDownLatch的用法

    這篇文章主要介紹了Java并發(fā)多線程編程之CountDownLatch的用法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • Springboot MDC+logback實(shí)現(xiàn)日志追蹤的方法

    Springboot MDC+logback實(shí)現(xiàn)日志追蹤的方法

    MDC(Mapped Diagnostic Contexts)映射診斷上下文,該特征是logback提供的一種方便在多線程條件下的記錄日志的功能,這篇文章主要介紹了Springboot MDC+logback實(shí)現(xiàn)日志追蹤的方法,需要的朋友可以參考下
    2024-04-04

最新評(píng)論