一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|JavaScript|易語言|

服務器之家 - 編程語言 - Java教程 - Spring整合Quartz分布式調(diào)度的示例代碼

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

2021-04-20 14:27zhaohui Java教程

本篇文章主要介紹了Spring整合Quartz分布式調(diào)度的示例代碼,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

前言

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

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

spring整合quartz

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

1.maven依賴文件

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<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相關庫、quartz庫以及mysql驅(qū)動庫,注:分布式調(diào)度需要用到數(shù)據(jù)庫,這里選用mysql;

2.配置job

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

2.1methodinvokingjobdetailfactorybean

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

?
1
2
3
4
<bean id="firsttask" class="org.springframework.scheduling.quartz.methodinvokingjobdetailfactorybean">
  <property name="targetobject" ref="firstservice" />
  <property name="targetmethod" value="service" />
</bea>

2.2jobdetailfactorybean

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

?
1
2
3
4
5
6
7
8
9
<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定義的任務類,繼承quartzjobbean,實現(xiàn)executeinternal方法;jobdatamap用來給job傳遞數(shù)據(jù)

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

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

重點看crontriggerfactorybean,這種類型更加靈活,具體如下:

?
1
2
3
4
5
<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的相關信息存儲在內(nèi)存里,每個節(jié)點存儲各自的,互相隔離,配置如下:

?
1
2
3
4
5
6
7
<bean class="org.springframework.scheduling.quartz.schedulerfactorybean">
 <property name="triggers">
  <list>
  <ref bean="firstcrontrigger" />
  </list>
 </property>
 </bean>

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

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

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<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ù)表相關信息,可以到官網(wǎng)下載gz包,sql文件在路徑:docs\dbtables下,里面提供了主流數(shù)據(jù)庫的sql文件;

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

?
1
org.quartz.jobstore.class: org.quartz.simpl.ramjobstore

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

?
1
2
3
4
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.相關類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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,實現(xiàn)executeinternal方法,調(diào)用firstservice

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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需要提供序列化接口,因為需要保存在數(shù)據(jù)庫中;

?
1
2
3
4
5
public class app {
 public static void main(string[] args) {
 abstractapplicationcontext context = new classpathxmlapplicationcontext("quartz.xml");
 }
}

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

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

1.同時啟動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沒有;當停掉a1以后,a2有日志輸出;

2.添加新的job分別新建:secondtask和secondservice,同時添加相關配置文件,啟動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í)行任務,但是同一任務同一時間只會在一個節(jié)點執(zhí)行,并且只有在執(zhí)行結(jié)束后才有可能分配到其他節(jié)點;

3.如果間隔時間小于任務執(zhí)行時間,比如這里改成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

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

4.@disallowconcurrentexecution注解保證任務的串行

在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),任務只有在end以后,才會開始新的任務,實現(xiàn)了任務的串行化;

總結(jié)

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

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

原文鏈接:http://codingo.xyz/index.php/2018/04/05/quartz1/

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 特级非洲黑人一级毛片 | 亚洲视频一区网站 | 欧美sq| 大妹子最新视频在线观看 | 精品国产理论在线观看不卡 | 动漫美女被吸乳羞羞小说 | 精品国产人妻国语 | 女人国产香蕉久久精品 | 日本人添下面的全过程 | 国内亚州视频在线观看 | 91短视频版高清在线观看免费 | 欧美a在线 | 久久足恋网 | 美女主播免费观看 | 亚洲免费网站在线观看 | 国产精品视频在线观看 | 成年视频在线观看 | 午夜爱爱片 | 青青热久麻豆精品视频在线观看 | 按摩师他揉我奶好爽捏我奶 | 天天爱综合网 | 亚洲第一区在线观看 | 99精品视频一区在线观看miya | 手机看片日韩1024你懂的首页 | 91香蕉在线 | 白丝爆动漫羞羞动漫软件 | 2022国产麻豆剧传媒古装 | 午夜dj免费视频观看社区 | 91香蕉视频在线 | 99在线观看视频免费精品9 | 免费国产网站 | 亚洲国产精品综合福利专区 | bt岛www| 美女曰逼视频 | 成人午夜爽爽爽免费视频 | 国产精品秒播无毒不卡 | 免费看片aⅴ免费大片 | 精品久久久久免费极品大片 | 嗯好爽视频 | 狠狠做五月深爱婷婷天天综合 | 男女视频在线观看网站 |