標(biāo)準(zhǔn)的BDF2-JOB模塊是不支持JOB集群的,如果我們的包含JOB的應(yīng)用需要集群部署,同時(shí)又需要JOB能夠集群環(huán)境下依次運(yùn)行,那么我們可以將BDF2當(dāng)中提供的BDF2-JOB-DAEMON模塊加入到項(xiàng)目當(dāng)中,這樣我們的項(xiàng)目中的JOB在運(yùn)行時(shí)就支持集群了。
BDF2-JOB-DAEMON模塊的JAR,我們可以到http://nexus.bsdn.org上下載,或從我們提供的在線項(xiàng)目向?qū)е羞x擇BDF2-JOB-DAEMON模塊后再下載,同樣,如果您采用的是Maven來管理您的項(xiàng)目,那么只需要將下面這段dependency加入到我們項(xiàng)目的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的屬性,這個(gè)屬性的值決定當(dāng)前JOB應(yīng)用的名稱,比如我們這里配置為bdf2.jobApplicationName=jobtestapp,表示當(dāng)前包含JOB的應(yīng)用名稱為jobtestapp;同時(shí)還需要添加bdf2.runJobInCurrentInstance參數(shù),將其值設(shè)置成false,表示JOB模塊自己不啟動(dòng)服務(wù),服務(wù)是否啟動(dòng)交由job-daemon模塊負(fù)責(zé)。項(xiàng)目準(zhǔn)備好之后,就可以啟動(dòng)了,包含BDF2-JOB-DAEMON模塊的項(xiàng)目啟動(dòng)時(shí)我們可以在控制臺(tái)看到如下所示的異常:
包含BDF2-JOB-DAEMON模塊的項(xiàng)目啟動(dòng)時(shí)產(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模塊前我們需要在配置一個(gè)名為jobtestapp.jobInstanceName的系統(tǒng)參數(shù),也就是在當(dāng)前運(yùn)行的應(yīng)用服務(wù)器當(dāng)中配置一個(gè)JVM參數(shù),可以看到這個(gè)參數(shù)名采用的是bdf2.jobApplicationName屬性值+".jobInstanceName"的命名方式,這個(gè)參數(shù)配置好之后,在JAVA代碼當(dāng)中可以通過System.getProperty(propertyKey)來獲取,對(duì)于在應(yīng)用服務(wù)器當(dāng)中配置一個(gè)JVM參數(shù),對(duì)于不同應(yīng)用服務(wù)器配置方法都不相同,所以在配置時(shí)我們需要查詢?cè)搼?yīng)用服務(wù)器手冊(cè),了解配置方法。
我們這里采用的是Eclipse WTP中提供的Tomcat7作為應(yīng)用服務(wù)器,它的配置方法是首先雙擊應(yīng)用服務(wù)器名稱,打開配置界面,如下圖所示:
如上圖所示,打開配置窗口之后,我們需要單擊上圖中用紅色框標(biāo)記的鏈接,在彈出的窗口中添加如下圖所示的配置信息即可。
如上圖所示,我們將這個(gè)名為jobtestapp.jobInstanceName的變量值定義為"jacky",變量配置完成之后,啟動(dòng)我們的應(yīng)用,系統(tǒng)還是會(huì)拋出一個(gè)異常提示,如下所示:
異常提示消息
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模塊我們還需要配置一個(gè)名為bdf2.jobDaemon.instanceNames的參數(shù),這個(gè)參數(shù)的作用是告訴系統(tǒng)當(dāng)前應(yīng)用的集群中有多少個(gè)實(shí)例,各個(gè)實(shí)例的實(shí)例名又是什么,注意這里要填寫的實(shí)例名就是我們之前在JVM環(huán)境中配置的名為jobInstanceName的變量值,比如我們剛定義的"jacky"。需要注意的是這里定義的實(shí)例名一定是一個(gè)以上,只有一個(gè)以上的實(shí)例才能算是集群。這里在定義多個(gè)實(shí)例名時(shí)要以逗號(hào)分隔,同時(shí)定義的實(shí)例名順序,也就決定了集群JOB在運(yùn)行時(shí)的順序。打開WEB-INF\dorado-home下的configure.properties文件,在其中添加名為bdf2.jobDaemon.instanceNames屬性,值為“jacky,tom”,如下圖所示:
我們將bdf2.jobDaemon.instanceNames屬性值定義為“jacky,tom”,那就表示在集群當(dāng)中名為jacky的實(shí)例上部署的JOB應(yīng)用最先運(yùn)行,一旦名為jacky的實(shí)例上部署的應(yīng)用中JOB服務(wù)停了,那么實(shí)例名為tom上的JOB應(yīng)用會(huì)將運(yùn)行JOB的任務(wù)接過來繼續(xù)運(yùn)行,依次類推。
JOB-DAEMON模塊除了可以提供集群JOB服務(wù)的運(yùn)行管理之外,它還可以提供單應(yīng)用模式下,JOB服務(wù)守護(hù)的作用。默認(rèn)JOB-DAEMON所起的是集群環(huán)境下JOB服務(wù)的心跳檢測(cè)功能,如果我們需要它在單應(yīng)用模式下來守護(hù)我們的JOB服務(wù),那需要在configure.properties文件當(dāng)中添加一個(gè)名為bdf2.jobDaemon.detectionMode的屬性,并將其值設(shè)置為daemon,這個(gè)屬性默認(rèn)值為heartbeat,表示為集群環(huán)境下的JOB提供心跳檢測(cè)服務(wù),一旦改成daemon,那它只能為單應(yīng)用中的JOB服務(wù)了,這樣,一旦這個(gè)應(yīng)用當(dāng)中的JOB服務(wù)掛了,這個(gè)守護(hù)線程會(huì)馬上檢測(cè)到,并自動(dòng)將JOB服務(wù)重啟。當(dāng)然一般情況下,對(duì)于單應(yīng)用環(huán)境中,JOB服務(wù)的守護(hù)不是很有必要。
更多建議: