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

Spring定時(shí)服務(wù)QuartZ原理及代碼案例

 更新時(shí)間:2020年11月20日 11:54:13   作者:賈樹(shù)丙  
這篇文章主要介紹了Spring定時(shí)服務(wù)QuartZ原理及代碼案例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

  在JavaEE系統(tǒng)中,我們會(huì)經(jīng)常用到定時(shí)任務(wù),比如每天凌晨生成前天報(bào)表,每一小時(shí)生成匯總數(shù)據(jù)等等。

  我們可以使用java.util.Timer結(jié)合java.util.TimerTask來(lái)完成這項(xiàng)工作,但時(shí)調(diào)度控制非常不方便,并且我們需要大量的代碼。

  使用Quartz框架無(wú)疑是非常好的選擇,并且與Spring可以非常方便的集成。

  Spring提供了支持時(shí)序調(diào)度的整合類(lèi)。整個(gè)構(gòu)建任務(wù)調(diào)度服務(wù)需要三步:

  1)向項(xiàng)目中添加jar包:添加quartz.jar包,將他加到你工程的classpath中去。

  2)寫(xiě)Class文件,在文件中定義你要執(zhí)行操作的函數(shù)你就可以通過(guò)配置來(lái)達(dá)到定時(shí)操作了。

  3)提供applicationContext.xml Spring配置文件,其中配置你的定時(shí)發(fā)送操作以及設(shè)置定時(shí)器的各種屬性(包括運(yùn)行頻率和初始運(yùn)行時(shí)機(jī))。 

  小編做了一個(gè)每5秒打印一次當(dāng)前時(shí)間的例子,具體請(qǐng)參考源碼,尤其注意配置文件的寫(xiě)法。(詳見(jiàn)下面“示例”)

什么是Quartz?

  Quartz是一個(gè)強(qiáng)大的企業(yè)級(jí)任務(wù)調(diào)度框架。它允許開(kāi)發(fā)人員靈活地定義觸發(fā)器的調(diào)度時(shí)間表,并可對(duì)觸發(fā)器和任務(wù)進(jìn)行關(guān)聯(lián)映射。此外,Quartz提供了調(diào)度運(yùn)行環(huán)境的持久化機(jī)制,可以保存并會(huì)發(fā)調(diào)度現(xiàn)場(chǎng),即使系統(tǒng)因故障關(guān)閉,任務(wù)調(diào)度現(xiàn)場(chǎng)數(shù)據(jù)并不會(huì)丟失。Spring中繼承并簡(jiǎn)化了Quartz。

如何使用Quartz?

  對(duì)于Quartz,我們使用的時(shí)候主要是注重兩個(gè)方面,一個(gè)是定時(shí)任務(wù)的業(yè)務(wù),另一個(gè)就是Cron表達(dá)式。

  1>Quartz存在兩種方式來(lái)定義定時(shí)執(zhí)行任務(wù),一種是使用QuartJobBean和JobDetailBean;另一種是使用MethodInvokingJobDetailFactoryBean。

  2>Cron表達(dá)式包括下面7個(gè)字段并區(qū)別順序:秒0-59,分0-59,小時(shí)0-23,月內(nèi)日期1-31,月1-12或者JAN-DEC,周內(nèi)日期1-7或者SUN-SAT,年(可選字段)留空或者1970-2099并且通過(guò)特殊字符表示特殊意義,具體為下:

  • 斜線(xiàn)(/)字符表示增量值。例如,在秒字段中"5/15"代表從第5秒開(kāi)始,每15秒一次。
  • 問(wèn)號(hào)(?)字符和字母L字符只有在月內(nèi)日期和周內(nèi)日期字段中可用。問(wèn)號(hào)表示這個(gè)字段不包含具體值。所以,如果指定月內(nèi)日期,可以在周內(nèi)日期字段中插入"?",表示周內(nèi)日期值無(wú)關(guān)緊要。這里有個(gè)很蛋疼的設(shè)定,無(wú)關(guān)Quartz,而是Spring集成Quartz后,它自己加的一個(gè)約束,那就是:日期(1-31)和星期(SUN-SAT)兩者,必須有一個(gè)是問(wèn)號(hào)(?),系統(tǒng)在啟動(dòng)的時(shí)候,Spring會(huì)檢查表達(dá)式,如果不符合它的規(guī)則,就會(huì)拋異常。所以在使用的時(shí)候這個(gè)地方一定要注意,而這個(gè)在Linux上執(zhí)行Cron是沒(méi)有這個(gè)限制的。
  • 字母L字符是last的縮寫(xiě)。放在月內(nèi)日期字段中,表示安排在當(dāng)月最后一天執(zhí)行。在周內(nèi)日期字段中,如果"L"單獨(dú)存在,就等于"7",否則代表當(dāng)月內(nèi)周內(nèi)日期的最后一個(gè)實(shí)例。所以"0L"表示安排在當(dāng)月的最后一個(gè)星期日?qǐng)?zhí)行。
  • 字母(W)字符把執(zhí)行安排在最靠近指定值的工作日。把"1W"放在月內(nèi)日期字段中,表示把執(zhí)行安排在當(dāng)月的第一個(gè)工作日內(nèi)。
  • 井號(hào)(#)字符為給定月份指定具體的工作日實(shí)例。把"MON#2"放在周內(nèi)日期字段中,表示把任務(wù)安排在當(dāng)月的第二個(gè)星期一。
  • 星號(hào)(*)字符是通配字符,表示該字段可以接受任何可能的值、表達(dá)式例子。

例子:

      "0 0 08 * * ?" 每天上午8點(diǎn)觸發(fā)
      "0 15 10 ? * *" 每天上午10:15觸發(fā)
      "0 15 10 * * ?" 每天上午10:15觸發(fā)
      "0 15 10 ? * 6L 2009-2019" 2009年至2019年的每月的最后一個(gè)星期五上午10:15觸發(fā)
      "0 15 10 ? * 6#3" 每月的第三個(gè)星期五上午10:15觸發(fā)

【示例】

  我們使用Spring定時(shí)服務(wù)Quartz來(lái)實(shí)現(xiàn)一個(gè)每5秒打印一次當(dāng)前時(shí)間的小例子。

  1:定義接口IPrintInfoService類(lèi)

package demoinfo.spring.quartz;
public interface IPrintInfoService {
  public void print();
}

  2:實(shí)現(xiàn)接口類(lèi)PrintInfoServiceImpl

package demoinfo.spring.quartz;

import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

import demoinfo.spring.quartz.IPrintInfoService;

public class PrintInfoServiceImpl implements IPrintInfoService{

  public void print() {
    Calendar now = Calendar.getInstance();
    System.out.println("現(xiàn)在是北京時(shí)間:" + this.format(now.getTime()));
  }

  public String format(Date date){
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    return sdf.format(date);
  }

}

  3:基于QuartzJobBean的實(shí)現(xiàn)類(lèi)PrintInfoJob

package demoinfo.spring.quartz;

import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.springframework.scheduling.quartz.QuartzJobBean;

import demoinfo.spring.quartz.IPrintInfoService;

public class PrintInfoJob extends QuartzJobBean{
  
  private IPrintInfoService prinfInfoService = null;
  public IPrintInfoService getPrinfInfoService() {
    return prinfInfoService;
  }
  public void setPrinfInfoService(IPrintInfoService prinfInfoService) {
    this.prinfInfoService = prinfInfoService;
  }
  @Override
  protected void executeInternal(JobExecutionContext arg0)
      throws JobExecutionException {
    this.prinfInfoService.print();
  }
}

  4:Spring配置文件applicationContext.xml

<?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:tx="http://www.springframework.org/schema/tx"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-2.5.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">


  <bean id="printInfoService" class="demoinfo.spring.quartz.PrintInfoServiceImpl" />
  <!-- 配置一個(gè)Job -->
  <bean id="printInfoJob" class="org.springframework.scheduling.quartz.JobDetailBean">
    <property name="jobClass" value="demoinfo.spring.quartz.PrintInfoJob" />
    <property name="jobDataAsMap">
      <map>
        <entry key="prinfInfoService" value-ref="printInfoService"></entry>
      </map>
    </property>
  </bean>

  <!-- 簡(jiǎn)單的觸發(fā)器 -->
  <bean id="simplePrintInfoTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
    <property name="jobDetail">
      <ref bean="printInfoJob" />
    </property>
    <property name="startDelay">
      <value>6000</value>
    </property>
    <property name="repeatInterval">
      <value>6000</value>
    </property>
  </bean>

  <!--復(fù)雜的觸發(fā)器 -->
  <bean id="complexPrintInfoTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="jobDetail">
      <ref bean="printInfoJob" />
    </property>
    <property name="cronExpression">
      <value>00,05,10,15,20,25,30,35,40,45,50,55 * * * * ?</value>
    </property>
  </bean>

  <!-- spring觸發(fā)工廠(chǎng) -->
  <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
      <list>
        <ref bean="complexPrintInfoTrigger" />
      </list>
    </property>
  </bean>
</beans>

  5:測(cè)試用例類(lèi)SpringQuartzDemo

package demoinfo.spring.quartz;

import org.springframework.context.support.ClassPathXmlApplicationContext;

public class SpringQuartzDemo {

  public static void main(String[] args) {
    System.out.println("測(cè)試開(kāi)始......");
    new ClassPathXmlApplicationContext(
        "classpath:demoinfo/spring/quartz/applicationContext.xml");
    System.out.println("測(cè)試結(jié)束......");
  }

}

  運(yùn)行測(cè)試用例,可以看到控制臺(tái)每過(guò)5秒鐘就打印一次時(shí)間信息。

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

相關(guān)文章

  • 淺談spring的重試機(jī)制無(wú)效@Retryable@EnableRetry

    淺談spring的重試機(jī)制無(wú)效@Retryable@EnableRetry

    這篇文章主要介紹了淺談spring的重試機(jī)制無(wú)效@Retryable@EnableRetry,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2020-09-09
  • springmvc fastjson 反序列化時(shí)間格式化方法(推薦)

    springmvc fastjson 反序列化時(shí)間格式化方法(推薦)

    下面小編就為大家?guī)?lái)一篇springmvc fastjson 反序列化時(shí)間格式化方法(推薦)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-04-04
  • RocketMQ設(shè)計(jì)之同步刷盤(pán)

    RocketMQ設(shè)計(jì)之同步刷盤(pán)

    這篇文章主要介紹了RocketMQ設(shè)計(jì)之同步刷盤(pán),文章主要通過(guò)CommitLog的handleDiskFlush方法展開(kāi)全文內(nèi)容,實(shí)現(xiàn)同步刷盤(pán),下面文章詳細(xì)介紹,需要的小伙伴可以參考一下
    2022-03-03
  • Spring注解@Profile實(shí)現(xiàn)開(kāi)發(fā)環(huán)境/測(cè)試環(huán)境/生產(chǎn)環(huán)境的切換

    Spring注解@Profile實(shí)現(xiàn)開(kāi)發(fā)環(huán)境/測(cè)試環(huán)境/生產(chǎn)環(huán)境的切換

    在進(jìn)行軟件開(kāi)發(fā)過(guò)程中,一般會(huì)將項(xiàng)目分為開(kāi)發(fā)環(huán)境,測(cè)試環(huán)境,生產(chǎn)環(huán)境。本文主要介紹了Spring如何通過(guò)注解@Profile實(shí)現(xiàn)開(kāi)發(fā)環(huán)境、測(cè)試環(huán)境、生產(chǎn)環(huán)境的切換,需要的可以參考一下
    2023-04-04
  • JEE與Spring Boot代碼性能比較分析

    JEE與Spring Boot代碼性能比較分析

    JavaEE與Spring Boot其實(shí)很難比較測(cè)試,前者適合單體SOA架構(gòu),后者適合微服務(wù),但是還是有好事者把兩者放在一起比較性能。這篇文章主要介紹了JEE與Spring Boot代碼性能比較,需要的朋友可以參考下
    2018-11-11
  • java中Calendar.add()方法的使用

    java中Calendar.add()方法的使用

    本文主要介紹了java中Calendar.add()方法的使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • Java微信公眾平臺(tái)開(kāi)發(fā)(9) 關(guān)鍵字回復(fù)以及客服接口實(shí)現(xiàn)

    Java微信公眾平臺(tái)開(kāi)發(fā)(9) 關(guān)鍵字回復(fù)以及客服接口實(shí)現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了Java微信公眾平臺(tái)開(kāi)發(fā)第九步,關(guān)鍵字回復(fù)以及客服接口實(shí)現(xiàn),以及遇到該公眾號(hào)暫時(shí)無(wú)法提供服務(wù)的解決方案,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-04-04
  • 服務(wù)性能優(yōu)化之mybatis-plus開(kāi)啟與關(guān)閉SQL日志打印方法

    服務(wù)性能優(yōu)化之mybatis-plus開(kāi)啟與關(guān)閉SQL日志打印方法

    這篇文章主要介紹了在Mybatis-plus中開(kāi)啟和關(guān)閉控制臺(tái)SQL日志打印,在`application.properties`文件中,可以通過(guò)配置來(lái)實(shí)現(xiàn)SQL日志的開(kāi)啟和關(guān)閉,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-12-12
  • java監(jiān)聽(tīng)器實(shí)現(xiàn)在線(xiàn)人數(shù)統(tǒng)計(jì)

    java監(jiān)聽(tīng)器實(shí)現(xiàn)在線(xiàn)人數(shù)統(tǒng)計(jì)

    這篇文章主要為大家詳細(xì)介紹了java監(jiān)聽(tīng)器實(shí)現(xiàn)在線(xiàn)人數(shù)統(tǒng)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • Java中ThreadLocal避免內(nèi)存泄漏的方法詳解

    Java中ThreadLocal避免內(nèi)存泄漏的方法詳解

    ThreadLocal是Java中的一個(gè)線(xiàn)程本地存儲(chǔ)機(jī)制,它允許每個(gè)線(xiàn)程擁有一個(gè)獨(dú)立的本地存儲(chǔ)空間,用于存儲(chǔ)該線(xiàn)程的變量,本文主要介紹了ThreadLocal如何避免內(nèi)存泄漏,需要的朋友可以參考下
    2023-05-05

最新評(píng)論

华蓥市| 南靖县| 呼和浩特市| 麦盖提县| 广水市| 平阴县| 敦煌市| 常熟市| 乡宁县| 四平市| 绥中县| 河西区| 南充市| 孝昌县| 昌黎县| 桂平市| 泸溪县| 五原县| 象州县| 咸丰县| 富源县| 长沙县| 长兴县| 东方市| 屯门区| 安庆市| 麦盖提县| 旌德县| 南澳县| 大理市| 平南县| 普安县| 罗平县| 兴义市| 巴楚县| 汽车| 文昌市| 桐乡市| 故城县| 武陟县| 三台县|