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

Spring整合Quartz分布式調(diào)度的示例代碼

 更新時(shí)間:2018年04月06日 09:57:57   作者:zhaohui  
本篇文章主要介紹了Spring整合Quartz分布式調(diào)度的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧

前言

為了保證應(yīng)用的高可用和高并發(fā)性,一般都會(huì)部署多個(gè)節(jié)點(diǎn);對于定時(shí)任務(wù),如果每個(gè)節(jié)點(diǎn)都執(zhí)行自己的定時(shí)任務(wù),一方面耗費(fèi)了系統(tǒng)資源,

另一方面有些任務(wù)多次執(zhí)行,可能引發(fā)應(yīng)用邏輯問題,所以需要一個(gè)分布式的調(diào)度系統(tǒng),來協(xié)調(diào)每個(gè)節(jié)點(diǎn)執(zhí)行定時(shí)任務(wù)。

Spring整合Quartz

Quartz是一個(gè)成熟的任務(wù)調(diào)度系統(tǒng),Spring對Quartz做了兼容,方便開發(fā),下面看看具體如何整合:

1.Maven依賴文件

<dependencies>
 <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-core</artifactId>
  <version>4.3.5.RELEASE</version>
 </dependency>
 <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-context-support</artifactId>
  <version>4.3.5.RELEASE</version>
 </dependency>
 <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-tx</artifactId>
  <version>4.3.5.RELEASE</version>
 </dependency>
 <dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-jdbc</artifactId>
  <version>4.3.5.RELEASE</version>
 </dependency>
 <dependency>
  <groupId>org.quartz-scheduler</groupId>
  <artifactId>quartz</artifactId>
  <version>2.2.3</version>
 </dependency>
 <dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.29</version>
 </dependency>
 </dependencies>

主要就是Spring相關(guān)庫、quartz庫以及mysql驅(qū)動(dòng)庫,注:分布式調(diào)度需要用到數(shù)據(jù)庫,這里選用mysql;

2.配置job

提供了兩種方式來配置job,分別是:MethodInvokingJobDetailFactoryBean和JobDetailFactoryBean

2.1MethodInvokingJobDetailFactoryBean

要調(diào)用特定bean的一個(gè)方法的時(shí)候使用,具體配置如下:

<bean id="firstTask" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> 
  <property name="targetObject" ref="firstService" /> 
  <property name="targetMethod" value="service" /> 
</bea>

2.2JobDetailFactoryBean

這種方式更加靈活,可以設(shè)置傳遞參數(shù),具體如下:

<bean id="firstTask"
 class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
 <property name="jobClass" value="zh.maven.SQuartz.task.FirstTask" />
 <property name="jobDataMap">
  <map>
  <entry key="firstService" value-ref="firstService" />
  </map>
 </property>
</bean>

jobClass定義的任務(wù)類,繼承QuartzJobBean,實(shí)現(xiàn)executeInternal方法;jobDataMap用來給job傳遞數(shù)據(jù)

3.配置調(diào)度使用的觸發(fā)器

同樣提供了兩種觸發(fā)器類型:SimpleTriggerFactoryBean和CronTriggerFactoryBean

重點(diǎn)看CronTriggerFactoryBean,這種類型更加靈活,具體如下:

<bean id="firstCronTrigger"
 class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
 <property name="jobDetail" ref="firstTask" />
 <property name="cronExpression" value="0/5 * * ? * *" />
 </bean>

jobDetail指定的就是在步驟2中配置的job,cronExpression配置了每5秒執(zhí)行一次job;

4.配置Quartz調(diào)度器的SchedulerFactoryBean

同樣提供了兩種方式:內(nèi)存RAMJobStore和數(shù)據(jù)庫方式

4.1內(nèi)存RAMJobStore

job的相關(guān)信息存儲(chǔ)在內(nèi)存里,每個(gè)節(jié)點(diǎn)存儲(chǔ)各自的,互相隔離,配置如下:

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
 <property name="triggers">
  <list>
  <ref bean="firstCronTrigger" />
  </list>
 </property>
 </bean>

4.2數(shù)據(jù)庫方式

job的相關(guān)信息存儲(chǔ)在數(shù)據(jù)庫中,所有節(jié)點(diǎn)共用數(shù)據(jù)庫,每個(gè)節(jié)點(diǎn)通過數(shù)據(jù)庫來通信,保證一個(gè)job同一時(shí)間只會(huì)在一個(gè)節(jié)點(diǎn)上執(zhí)行,并且

如果某個(gè)節(jié)點(diǎn)掛掉,job會(huì)被分配到其他節(jié)點(diǎn)執(zhí)行,具體配置如下:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
 destroy-method="close">
 <property name="driverClass" value="com.mysql.jdbc.Driver" />
 <property name="jdbcUrl" value="jdbc:mysql://localhost:3306/quartz" />
 <property name="user" value="root" />
 <property name="password" value="root" />
 </bean>
 <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
 <property name="dataSource" ref="dataSource" />
 <property name="configLocation" value="classpath:quartz.properties" />
 <property name="triggers">
  <list>
  <ref bean="firstCronTrigger" />
  </list>
 </property>
 </bean>

dataSource用來配置數(shù)據(jù)源,數(shù)據(jù)表相關(guān)信息,可以到官網(wǎng)下載gz包,sql文件在路徑:docs\dbTables下,里面提供了主流數(shù)據(jù)庫的sql文件;

configLocation配置的quartz.properties文件在quartz.jar的org.quartz包下,里面提供了一些默認(rèn)的數(shù)據(jù),比如org.quartz.jobStore.class

org.quartz.jobStore.class: org.quartz.simpl.RAMJobStore

這里需要將quartz.properties拷貝出來做一些修改,具體修改如下:

org.quartz.scheduler.instanceId: AUTO
org.quartz.jobStore.class: org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.isClustered: true
org.quartz.jobStore.clusterCheckinInterval: 1000

5.相關(guān)類

public class FirstTask extends QuartzJobBean {

 private FirstService firstService;

 @Override
 protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
 firstService.service();
 }

 public void setFirstService(FirstService firstService) {
 this.firstService = firstService;
 }
}

FirstTask繼承QuartzJobBean,實(shí)現(xiàn)executeInternal方法,調(diào)用FirstService

public class FirstService implements Serializable {

 private static final long serialVersionUID = 1L;

 public void service() {
 System.out.println(new SimpleDateFormat("YYYYMMdd HH:mm:ss").format(new Date()) + "---start FirstService");
 try {
  Thread.sleep(2000);
 } catch (InterruptedException e) {
  e.printStackTrace();
 }
 System.out.println(new SimpleDateFormat("YYYYMMdd HH:mm:ss").format(new Date()) + "---end FirstService");
 }
}

FirstService需要提供序列化接口,因?yàn)樾枰4嬖跀?shù)據(jù)庫中;

public class App {
 public static void main(String[] args) {
 AbstractApplicationContext context = new ClassPathXmlApplicationContext("quartz.xml");
 }
}

主類用來加載quartz配置文件;

測試分布式調(diào)度

1.同時(shí)啟動(dòng)App兩次,觀察日志:

20180405 14:48:10---start FirstService
20180405 14:48:12---end FirstService
20180405 14:48:15---start FirstService
20180405 14:48:17---end FirstService

其中A1有日志輸出,A2沒有;當(dāng)停掉A1以后,A2有日志輸出;

2.添加新的job分別新建:SecondTask和SecondService,同時(shí)添加相關(guān)配置文件,啟動(dòng)App兩次,觀察日志:

A1日志如下:

20180405 15:03:15---start FirstService
20180405 15:03:15---start SecondService
20180405 15:03:17---end FirstService
20180405 15:03:17---end SecondService
20180405 15:03:20---start FirstService
20180405 15:03:22---end FirstService
20180405 15:03:25---start FirstService
20180405 15:03:27---end FirstService

A2日志如下:

20180405 15:03:20---start SecondService
20180405 15:03:22---end SecondService
20180405 15:03:25---start SecondService
20180405 15:03:27---end SecondService

可以發(fā)現(xiàn)A1和A2都有執(zhí)行任務(wù),但是同一任務(wù)同一時(shí)間只會(huì)在一個(gè)節(jié)點(diǎn)執(zhí)行,并且只有在執(zhí)行結(jié)束后才有可能分配到其他節(jié)點(diǎn);

3.如果間隔時(shí)間小于任務(wù)執(zhí)行時(shí)間,比如這里改成sleep(6000)

A1日志如下:

20180405 15:14:40---start FirstService
20180405 15:14:45---start FirstService
20180405 15:14:46---end FirstService
20180405 15:14:50---start FirstService
20180405 15:14:50---start SecondService
20180405 15:14:51---end FirstService

A2日志如下:

20180405 15:14:40---start SecondService
20180405 15:14:45---start SecondService
20180405 15:14:46---end SecondService
20180405 15:14:51---end SecondService

間隔時(shí)間是5秒,而任務(wù)執(zhí)行需要6秒,觀察日志可以發(fā)現(xiàn),任務(wù)還沒有結(jié)束,新的任務(wù)已經(jīng)開始,這種情況可能引發(fā)應(yīng)用的邏輯問題,其實(shí)就是任務(wù)能不能支持串行的問題;

4.@DisallowConcurrentExecution注解保證任務(wù)的串行

在FirstTask和SecondTask上分別添加@DisallowConcurrentExecution注解,日志結(jié)果如下:

A1日志如下:

20180405 15:32:45---start FirstService
20180405 15:32:51---end FirstService
20180405 15:32:51---start FirstService
20180405 15:32:51---start SecondService
20180405 15:32:57---end FirstService
20180405 15:32:57---end SecondService
20180405 15:32:57---start FirstService
20180405 15:32:57---start SecondService

A2日志如下:

20180405 15:32:45---start SecondService
20180405 15:32:51---end SecondService

觀察日志可以發(fā)現(xiàn),任務(wù)只有在end以后,才會(huì)開始新的任務(wù),實(shí)現(xiàn)了任務(wù)的串行化;

總結(jié)

本文旨在對Spring+Quartz分布式調(diào)度有一個(gè)直觀的了解,通過實(shí)際的使用來解決問題,當(dāng)然可能還有很多疑問比如它是如何調(diào)度的,數(shù)據(jù)庫如果掛了會(huì)怎么樣等等,還需要做更加深入的了解。

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

相關(guān)文章

  • Spring Boot整合Redis的完整步驟

    Spring Boot整合Redis的完整步驟

    這篇文章主要給大家介紹了關(guān)于Spring Boot整合Redis的完整步驟,文中通過示例代碼介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用Spring Boot具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • JAVA編程不能不知道的反射用法總結(jié)

    JAVA編程不能不知道的反射用法總結(jié)

    這篇文章主要介紹了Java反射技術(shù)原理與用法,結(jié)合實(shí)例形式分析了Java反射技術(shù)的基本概念、功能、原理、用法及操作注意事項(xiàng),需要的朋友可以參考下
    2021-07-07
  • java map中相同的key保存多個(gè)value值方式

    java map中相同的key保存多個(gè)value值方式

    這篇文章主要介紹了java map中相同的key保存多個(gè)value值方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-08-08
  • Spring實(shí)戰(zhàn)之使用靜態(tài)工廠方法創(chuàng)建Bean操作示例

    Spring實(shí)戰(zhàn)之使用靜態(tài)工廠方法創(chuàng)建Bean操作示例

    這篇文章主要介紹了Spring實(shí)戰(zhàn)之使用靜態(tài)工廠方法創(chuàng)建Bean操作,結(jié)合實(shí)例形式分析了靜態(tài)工廠方法創(chuàng)建Bean的相關(guān)實(shí)現(xiàn)步驟與操作注意事項(xiàng),需要的朋友可以參考下
    2019-11-11
  • 詳解Java Selenium中的鍵盤控制操作

    詳解Java Selenium中的鍵盤控制操作

    這篇文章主要為大家介紹了如何使用java代碼利用Selenium 控制瀏覽器中需要用到的鍵盤操作。文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-01-01
  • java 枚舉類中的valueOf用法說明

    java 枚舉類中的valueOf用法說明

    這篇文章主要介紹了java 枚舉類中的valueOf用法說明,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 詳解Java中實(shí)現(xiàn)SHA1與MD5加密算法的基本方法

    詳解Java中實(shí)現(xiàn)SHA1與MD5加密算法的基本方法

    這篇文章主要介紹了詳解Java中實(shí)現(xiàn)SHA1與MD5加密算法的基本方法,安全哈希算法第一版和消息摘要算法第五版也是通常人們最常用的加密算法,需要的朋友可以參考下
    2016-04-04
  • 教你Springboot如何實(shí)現(xiàn)圖片上傳

    教你Springboot如何實(shí)現(xiàn)圖片上傳

    這篇文章主要介紹了教你Springboot如何實(shí)現(xiàn)圖片上傳,首先大家明白圖片上傳,需要在數(shù)據(jù)庫定義一個(gè)varchar類型的img字段圖片字段,本文結(jié)合示例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • Spring中的BeanFactory與FactoryBean區(qū)別詳解

    Spring中的BeanFactory與FactoryBean區(qū)別詳解

    這篇文章主要介紹了Spring中的BeanFactory與FactoryBean區(qū)別詳解,BeanFactory是一個(gè)接口,它是spring中的一個(gè)工廠,FactoryBean也是一個(gè)接口,實(shí)現(xiàn)了3個(gè)方法,通過重寫其中方法自定義生成bean,需要的朋友可以參考下
    2024-01-01
  • IDEA創(chuàng)建springboot依賴下載很慢的解決方法

    IDEA創(chuàng)建springboot依賴下載很慢的解決方法

    maven會(huì)使用遠(yuǎn)程倉庫來加載依賴,是一個(gè)國外的網(wǎng)站,所以會(huì)很慢,本文主要介紹了IDEA創(chuàng)建springboot依賴下載很慢的解決方法,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-12-12

最新評論

大姚县| 仪陇县| 磴口县| 平陆县| 永仁县| 玛沁县| 林州市| 交口县| 开平市| 东乡| 墨竹工卡县| 阳谷县| 鸡泽县| 南召县| 城固县| 尖扎县| 军事| 汾阳市| 元朗区| 朝阳区| 佳木斯市| 康马县| 若尔盖县| 喀喇| 车险| 拉萨市| 县级市| 中宁县| 子洲县| 达州市| 东明县| 鄂托克旗| 新源县| 绵竹市| 翁牛特旗| 陇南市| 蓬安县| 梅河口市| 宁武县| 桑植县| 互助|