4.2.JOB集群

2023-07-03 17:14 更新
標準的BDF2-JOB模塊是不支持JOB集群的,如果我們的包含JOB的應(yīng)用需要集群部署,同時又需要JOB能夠集群環(huán)境下依次運行,那么我們可以將BDF2當(dāng)中提供的BDF2-JOB-DAEMON模塊加入到項目當(dāng)中,這樣我們的項目中的JOB在運行時就支持集群了。
BDF2-JOB-DAEMON模塊的JAR,我們可以到http://nexus.bsdn.org上下載,或從我們提供的在線項目向?qū)е羞x擇BDF2-JOB-DAEMON模塊后再下載,同樣,如果您采用的是Maven來管理您的項目,那么只需要將下面這段dependency加入到我們項目的pom.xm中即可:
JOB-DAEMON模塊依賴的添加
<dependency>
 <groupId>com.bstek.bdf2</groupId>
 <artifactId>bdf2-job-daemon</artifactId>
 <version>2.0.0</version>
</dependency>
打開WEB-INF/dorado-home目錄下的configure.properties文件,在其中添加一名為bdf2.jobApplicationName的屬性,這個屬性的值決定當(dāng)前JOB應(yīng)用的名稱,比如我們這里配置為bdf2.jobApplicationName=jobtestapp,表示當(dāng)前包含JOB的應(yīng)用名稱為jobtestapp;同時還需要添加bdf2.runJobInCurrentInstance參數(shù),將其值設(shè)置成false,表示JOB模塊自己不啟動服務(wù),服務(wù)是否啟動交由job-daemon模塊負責(zé)。項目準備好之后,就可以啟動了,包含BDF2-JOB-DAEMON模塊的項目啟動時我們可以在控制臺看到如下所示的異常:
包含BDF2-JOB-DAEMON模塊的項目啟動時產(chǎn)生的異常信息
Caused by: java.lang.RuntimeException: You need config a named [jobtestapp.jobInstanceName] system
property when use bdf2-job-daemon module!
 at
com.bstek.bdf2.job.daemon.detection.InstanceDetection.afterPropertiesSet(InstanceDetection.java:97)
 at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(Ab
stractAutowireCapableBeanFactory.java:1545)
 at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(Abstrac
tAutowireCapableBeanFactory.java:1483)
 ... 23 more
從異常信息的描述來看,在使用BDF2-JOB-DAEMON模塊前我們需要在配置一個名為jobtestapp.jobInstanceName的系統(tǒng)參數(shù),也就是在當(dāng)前運行的應(yīng)用服務(wù)器當(dāng)中配置一個JVM參數(shù),可以看到這個參數(shù)名采用的是bdf2.jobApplicationName屬性值+".jobInstanceName"的命名方式,這個參數(shù)配置好之后,在JAVA代碼當(dāng)中可以通過System.getProperty(propertyKey)來獲取,對于在應(yīng)用服務(wù)器當(dāng)中配置一個JVM參數(shù),對于不同應(yīng)用服務(wù)器配置方法都不相同,所以在配置時我們需要查詢該應(yīng)用服務(wù)器手冊,了解配置方法。

我們這里采用的是Eclipse WTP中提供的Tomcat7作為應(yīng)用服務(wù)器,它的配置方法是首先雙擊應(yīng)用服務(wù)器名稱,打開配置界面,如下圖所示:

如上圖所示,打開配置窗口之后,我們需要單擊上圖中用紅色框標記的鏈接,在彈出的窗口中添加如下圖所示的配置信息即可。
如上圖所示,我們將這個名為jobtestapp.jobInstanceName的變量值定義為"jacky",變量配置完成之后,啟動我們的應(yīng)用,系統(tǒng)還是會拋出一個異常提示,如下所示:
異常提示消息
Caused by: java.lang.RuntimeException: Use [bdf2-job-daemon] module you need define a named
[bdf2.jobDaemon.instanceNames] property!
 at com.bstek.bdf2.job.daemon.detection.InstanceDetection.initJobDetail(InstanceDetection.java:73)
 at com.bstek.bdf2.job.daemon.detection.InstanceDetection.startDaemonJob(InstanceDetection.java:49)
 at
com.bstek.bdf2.job.daemon.detection.InstanceDetection.afterPropertiesSet(InstanceDetection.java:99)
 at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(Ab
stractAutowireCapableBeanFactory.java:1545)
 at
org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(Abstrac
tAutowireCapableBeanFactory.java:1483)
 ... 23 more
異常提示我們使用JOB-DAEMON模塊我們還需要配置一個名為bdf2.jobDaemon.instanceNames的參數(shù),這個參數(shù)的作用是告訴系統(tǒng)當(dāng)前應(yīng)用的集群中有多少個實例,各個實例的實例名又是什么,注意這里要填寫的實例名就是我們之前在JVM環(huán)境中配置的名為jobInstanceName的變量值,比如我們剛定義的"jacky"。需要注意的是這里定義的實例名一定是一個以上,只有一個以上的實例才能算是集群。這里在定義多個實例名時要以逗號分隔,同時定義的實例名順序,也就決定了集群JOB在運行時的順序。打開WEB-INF\dorado-home下的configure.properties文件,在其中添加名為bdf2.jobDaemon.instanceNames屬性,值為“jacky,tom”,如下圖所示:
我們將bdf2.jobDaemon.instanceNames屬性值定義為“jacky,tom”,那就表示在集群當(dāng)中名為jacky的實例上部署的JOB應(yīng)用最先運行,一旦名為jacky的實例上部署的應(yīng)用中JOB服務(wù)停了,那么實例名為tom上的JOB應(yīng)用會將運行JOB的任務(wù)接過來繼續(xù)運行,依次類推。

JOB-DAEMON模塊除了可以提供集群JOB服務(wù)的運行管理之外,它還可以提供單應(yīng)用模式下,JOB服務(wù)守護的作用。默認JOB-DAEMON所起的是集群環(huán)境下JOB服務(wù)的心跳檢測功能,如果我們需要它在單應(yīng)用模式下來守護我們的JOB服務(wù),那需要在configure.properties文件當(dāng)中添加一個名為bdf2.jobDaemon.detectionMode的屬性,并將其值設(shè)置為daemon,這個屬性默認值為heartbeat,表示為集群環(huán)境下的JOB提供心跳檢測服務(wù),一旦改成daemon,那它只能為單應(yīng)用中的JOB服務(wù)了,這樣,一旦這個應(yīng)用當(dāng)中的JOB服務(wù)掛了,這個守護線程會馬上檢測到,并自動將JOB服務(wù)重啟。當(dāng)然一般情況下,對于單應(yīng)用環(huán)境中,JOB服務(wù)的守護不是很有必要。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號