4.1.Job定義與配置

2023-07-03 17:13 更新
BDF2-JOB模塊中在定義JOB時(shí),我們遵循標(biāo)準(zhǔn)的Quartz定義JOB的方法,那就是實(shí)現(xiàn)org.quartz.Job接口,這樣對(duì)于那些已經(jīng)在使用Quartz來(lái)定義JOB的用戶,就可以無(wú)縫將自己經(jīng)編寫好的JOB遷移到BDF2-JOB模塊當(dāng)中來(lái)。

下面的代碼當(dāng)中向我們展示了一個(gè)實(shí)現(xiàn)了org.quartz.Job接口具體JOB實(shí)現(xiàn)類:
測(cè)試JOB實(shí)現(xiàn)類
package test;
import java.util.List;
import java.util.Map;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import com.bstek.bdf2.core.orm.jdbc.JdbcDao;
public class TestJob extends JdbcDao implements Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
JobDataMap jobDataMap=context.getJobDetail().getJobDataMap();
String targetUser=jobDataMap.getString("targetUser");
String sql="select * from BDF2_USER where USERNAME_=?";
List<Map<String,Object>> users=this.getJdbcTemplate().queryForList(sql, new Object[]{targetUser});
if(users.size()>0){
System.out.println("用戶"+targetUser+"的中文名為:"+users.get(0).get("CNAME_"));
}
}
}
從代碼中可以看到,這個(gè)JOB在運(yùn)行時(shí)從JobDataMap里取出一個(gè)用戶的用戶名參數(shù)targetUser,再用這個(gè)用戶名到數(shù)據(jù)庫(kù)中查詢這個(gè)用戶對(duì)應(yīng)的詳細(xì)信息,如果用戶存在就在系統(tǒng)控制臺(tái)中打印出這個(gè)用戶的CNAME_屬性,也就是它的中文名。

JOB實(shí)現(xiàn)類編寫好之后,需要將其配置到Spring當(dāng)中,配置方法如下:
JOB實(shí)現(xiàn)類配置
<bean id="testJob" class="test.TestJob"></bean>
JOB編寫配置完成之后,接來(lái)就可以啟動(dòng)我們的工程,利用BDF2提供的在線配置界面將JOB添加到服務(wù)當(dāng)中。
登錄系統(tǒng),進(jìn)入“任務(wù)調(diào)度”菜單,點(diǎn)擊其下的“JOB定義”菜單項(xiàng),如下所示:



點(diǎn)擊工具欄上的“添加”按鈕,在彈出的窗口中,為新的JOB定義一個(gè)名稱,在“使用的BeanId”列中,點(diǎn)擊選擇我們之前配置的JOB的ID,可以看到在彈出的窗口當(dāng)中,就有我們之前在Spring當(dāng)中配置的那個(gè)testJob對(duì)象,如下圖所示:
JOB選擇完成后,我們就需要定義這個(gè)JOB該如何運(yùn)行,也就是配置下面的“Cron表達(dá)式”,點(diǎn)擊按鈕可以看到一個(gè)圖形化的Cron表達(dá)式配置界面,可以看到這個(gè)界面功能是非常完善的,它可以完成95%以上的簡(jiǎn)單或復(fù)雜的Cron表達(dá)式配置,如下圖所示:
我們這里定義的是讓這個(gè)JOB從第0秒開始,每隔10秒運(yùn)行一次,定義完成之后,點(diǎn)擊其下方的“生成Cron表達(dá)式”按鈕,便可生成具體的Cron表達(dá)式,同時(shí)點(diǎn)擊“解析表達(dá)式”按鈕,可以看到這個(gè)Cron表達(dá)式最近50次的具體運(yùn)行時(shí)間。

因?yàn)槲覀冞@個(gè)testJob還需要一個(gè)名為targetUser的參數(shù),所以在完成JOB本身定義之后,我們還需要為這個(gè)JOB定義一個(gè)名為targetUser的JOB運(yùn)行參數(shù),如下圖所示:
這樣,JOB的所有定義工作都完成了,我們點(diǎn)擊工具欄上的“啟動(dòng)任務(wù)”按鈕,就可以將JOB添加的待運(yùn)行的JOB隊(duì)列當(dāng)中。

之前我們提到,JOB默認(rèn)的掃描時(shí)間為0分鐘、10分鐘、20分鐘......,所以看到點(diǎn)擊工具欄上的“啟動(dòng)任務(wù)”按鈕后,JOB狀態(tài)為啟動(dòng)中,一旦服務(wù)器端時(shí)間到達(dá)0分鐘、10分鐘、20分鐘......,JOB就會(huì)被掃描到,并開始運(yùn)行。JOB每次運(yùn)行,系統(tǒng)都會(huì)記錄它的運(yùn)行結(jié)果:成功還是失敗,如果失敗還會(huì)取出失敗的異常并存儲(chǔ)下來(lái),如下圖所示:
同時(shí)每次JOB運(yùn)行后,我們都可以在控制臺(tái)看到輸出的targetUser用戶對(duì)應(yīng)的中文名(如果這個(gè)用戶存在的話)。

從配置界面當(dāng)中可以看到,在配置JOB運(yùn)行時(shí),還可以排除某些運(yùn)行日期,比如將周末或節(jié)假日排除等,對(duì)于排除日期的定義是在“節(jié)假日設(shè)定”頁(yè)面當(dāng)中完成的,如下圖所示:
從圖中可以看到,在定義節(jié)假日時(shí)可以選擇具體類型,目前支持四種類型:星期中的某些天是指一個(gè)星期中的某此天;月份中的某些天,是以月份中的天為單位來(lái)確定日期;具體日期則是選擇具體的年月日;每天都經(jīng)歷的日期,則是讓我們選擇月份與具體的天,比如定義五一勞動(dòng)節(jié)或十一國(guó)慶節(jié)等。定義好節(jié)假日后,就可以將需要排除的節(jié)假日加入到JOB當(dāng)中,這樣一旦時(shí)間是這些節(jié)假日,JOB就不會(huì)執(zhí)行,否則則執(zhí)行。

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

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)