spring batch (四) Job的配置及配置文件说明介绍
內(nèi)容來(lái)自《Spring Batch 批處理框架》,作者:劉相。
我只是個(gè)搬運(yùn)工。
一、Spring Batch提供了獨(dú)立的標(biāo)簽用來(lái)頂一個(gè)Job配置,分別是job、step、tasklet、chunk等。共有6個(gè)外層標(biāo)簽使用,如下:
<batch:job id=""></batch:job><batch:flow id=""></batch:flow> <batch:job-listener></batch:job-listener> <batch:job-repository/> <batch:step id=""></batch:step> <batch:step-listener></batch:step-listener>?
二、Job配置的標(biāo)簽和屬性介紹
1.job標(biāo)簽共有6個(gè)屬性,分別是:
<batch:job id="" job-repository="" incrementer="" restartable="" parent="" abstract="true"></batch:job>?
id:Job名稱,作業(yè)的唯一標(biāo)識(shí)。在整個(gè)跑批程序運(yùn)行上下文中不允許重復(fù)。
job-repository:指定作業(yè)倉(cāng)庫(kù)。定義該Job運(yùn)行期間使用的Job倉(cāng)庫(kù),默認(rèn)使用名字為jobRepository的Bean。
incrementer:作業(yè)參數(shù)遞增器。只有在org.springframework.batch.core.launch.JobOperator 的 startNextInstance方法中使用。
restartable:作業(yè)是否可以重啟。默認(rèn)是true,表示支持重啟。當(dāng)設(shè)置為true時(shí),只有當(dāng)JobInstance為FAILED狀態(tài)時(shí)才可以重啟。
parent:指定該作業(yè)的父類(lèi)作業(yè)。指定當(dāng)前Job的父Job,Job可以從其他Job繼承。通常在父Job中定義共有的屬性。
abstract:定義作業(yè)是否是抽象的,默認(rèn)是true,抽象的,不能被實(shí)例化?! ?/p>
2.job標(biāo)簽的子元素
<batch:job id="" job-repository="" incrementer="" restartable="" parent="" abstract="true"><batch:step id="" allow-start-if-complete="" next="" parent=""></batch:step><batch:split id="" next="" task-executor=""></batch:split><batch:flow parent="" id=""></batch:flow><batch:decision decider="" id=""></batch:decision><batch:listeners></batch:listeners><batch:validator ref=""></batch:validator><batch:description></batch:description> </batch:job>?
step:定義Job的作業(yè)步 。
split:定義并行作業(yè)步Step。
flow:引用獨(dú)立配置的作業(yè)步流程。
decision:定義作業(yè)步執(zhí)行的條件判斷器,用于判斷后續(xù)執(zhí)行的作業(yè)步。
listeners:定義作業(yè)Job執(zhí)行時(shí)的攔截器。
validator:定義作業(yè)參數(shù)檢驗(yàn)器。也就是JobParameters的驗(yàn)證器。
description:描述該作業(yè)
3.Job攔截器
Spring Batch框架提供了自己的攔截器,可以在Job執(zhí)行前后加入自定義的邏輯判斷,自定義攔截器需要實(shí)現(xiàn)接口:org.springframework.batch.core.JobExecutionListener。
JobExecutionListener源碼:
public interface JobExecutionListener {void beforeJob(JobExecution jobExecution);void afterJob(JobExecution jobExecution); }?
自定義攔截器:
public class MyListener implements JobExecutionListener {private static final Logger LOGGER = LoggerFactory.getLogger(MyListener.class);@Overridepublic void beforeJob(JobExecution jobExecution) {String jobName = jobExecution.getJobParameters().getString("jobName");LOGGER.info(" -- > beforeJob 攔截的job名稱:[{}]", jobName);}@Overridepublic void afterJob(JobExecution jobExecution) {long instanceId = jobExecution.getJobInstance().getInstanceId();LOGGER.info(" -- > afterJob 攔截的job實(shí)例ID:[{}]", instanceId);}}?
Job配置攔截器:
<bean id="myListener" class="com.jason.batch.job.listeners.MyListener"></bean><batch:job id="firstJob" job-repository="jobRepository"><!-- 省略其余步驟 --><batch:listeners><batch:listener ref="myListener"></batch:listener></batch:listeners> </batch:job>?
需要注意的是:如果攔截器方法出現(xiàn)異常,會(huì)導(dǎo)致Job執(zhí)行的狀態(tài)為“FAILED”,所以我們?cè)谠O(shè)置攔截器的時(shí)候要注意異常的處理。
在配置文件中也可以配置多個(gè)攔截器,多個(gè)攔截器的執(zhí)行順序按照配置的順序執(zhí)行。
<batch:job id="firstJob" job-repository="jobRepository"><!-- 省略其余步驟 --><!-- 多個(gè)攔截器配置 --><batch:listeners><batch:listener ref="listener_01"></batch:listener><batch:listener ref="listener_02"></batch:listener><batch:listener ref="listener_03"></batch:listener></batch:listeners></batch:job>?
則上面三個(gè)攔截器的執(zhí)行順序是:
1.調(diào)用listener_01攔截器的before方法。
2.調(diào)用listener_02攔截器的before方法。
3.調(diào)用listener_03攔截器的before方法。
4.調(diào)用listener_03攔截器的after方法。
5.調(diào)用listener_02攔截器的after方法。
6.調(diào)用listener_01攔截器的after方法。
Spring Batch 中不僅可以實(shí)現(xiàn)接口設(shè)置攔截器,也可以使用注解的方式。這兩種方式的配置方法都是一樣的。
@BeforeJob:聲明作業(yè)執(zhí)行前的操作
@AfterJob:聲明作業(yè)執(zhí)行后的操作
4.Job Parameters校驗(yàn)
Spring Batch框架提供了參數(shù)校驗(yàn)的功能。我們可以實(shí)現(xiàn)接口org.springframework.batch.core.JobParametersValidator就可以自定義參數(shù)校驗(yàn)器,也可以使用框架提供的實(shí)現(xiàn)類(lèi)CompositeJobParametersValidator和DefaultJobParametersValidator分別完成不同的功能。
CompositeJobParametersValidator:參數(shù)校驗(yàn)組合模式,支持一組參數(shù)校驗(yàn)。
DefaultJobParametersValidator:參數(shù)校驗(yàn)?zāi)J(rèn)實(shí)現(xiàn),支持必須輸入的參數(shù)和非必須輸入的參數(shù)。
<!-- 驗(yàn)證必輸參數(shù)jobName和非必輸參數(shù)path、jobDay --><bean id="myValidator" class="org.springframework.batch.core.job.DefaultJobParametersValidator"><property name="requiredKeys"><set><value>jobName</value></set></property><property name="optionalKeys"><set><value>path</value><value>jobDay</value></set></property></bean><batch:job id="firstJob" job-repository="jobRepository"><!-- 省略其余步驟 --><batch:validator ref="myValidator"></batch:validator></batch:job>接口DefaultJobParametersValidator的源碼:
public class DefaultJobParametersValidator implements JobParametersValidator, InitializingBean {private Collection<String> requiredKeys;private Collection<String> optionalKeys;// 其余省略}?
5.Job 抽象與繼承
Spring Batch框架支持抽象job的定義和Job的繼承特性,抽象Job和java中的抽象類(lèi)相似。抽象的Job不能被實(shí)例化,直接調(diào)用抽象的Job會(huì)報(bào)錯(cuò)。定義Job是將abstract設(shè)置為true即為抽象Job。
<batch:job id="baseJob" abstract="true"><batch:listeners><batch:listener ref="baseListeners"></batch:listener></batch:listeners></batch:job>?
通過(guò)parent屬性可以指定當(dāng)前Job的父Job,子Job繼承父Job可以獲得父類(lèi)中所有屬性和能力,可以多個(gè)Job繼承同一個(gè)抽象父Job。
<batch:job id="firstJob" parent="baseJob"><!-- 省略其余步驟 --><batch:listeners merge="true"><batch:listener ref="myListener"></batch:listener></batch:listeners></batch:job>?
上面firstJob繼承了baseJob父類(lèi),攔截器merge為true表示firstJob具有baseListeners和myListener兩個(gè)攔截器的功能,如果merge為false,則子類(lèi)的攔截器會(huì)覆蓋掉父類(lèi)Job中攔截器的功能。
三、Job的高級(jí)特性
1.scope
scope用來(lái)聲明IOC容器中對(duì)象的存活周期,具體見(jiàn):https://www.cnblogs.com/whx20100101/p/9807252.html
Step scope 是Spring Batch 框架提供的自定義的Scope,將Bean的scope=“step”,表示該bean在Step開(kāi)始的時(shí)候初始化,在Step結(jié)束的時(shí)候銷(xiāo)毀bean,
在Spring Batch框架中,step scope會(huì)被自動(dòng)注冊(cè)到Spring的上下文中,如果沒(méi)有使用Spring的配置文件,則需要顯示的聲明step scope。
?
?
轉(zhuǎn)載于:https://www.cnblogs.com/whx20100101/p/10636351.html
總結(jié)
以上是生活随笔為你收集整理的spring batch (四) Job的配置及配置文件说明介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: A Network-based End-
- 下一篇: 结果集耗尽时,检查是否关闭结果集时常用s