spring batch學習筆記之元數據表

作用

spring batch框架通過元數據表(meta data tables)來保存每個job的執行情況。包括記錄每個job的名稱和參數,每個job execution的狀態和執行結果,每個tasklet的狀態和執行結果等。


配置

爲了能讓JAVA代碼訪問元數據表,需要做如下配置:

(1)庫表準備

假設通過MySQL來存儲元數據,需要確保已經安裝MySQL,然後創建數據庫和初始化元數據表。初始化元數據表的schema可以在spring-batch中找到:

..\spring-batch\spring-batch-core\src\main\resources\org\springframework\batch\core\schema-mysql.sql
你可以手動執行這個schema中的sql,也可以通過jdbc:initialize-database進行指定:
<jdbc:initialize-database data-source="dataSource">
	<jdbc:script location="clssspath:schema-drop-mysql.sql" />
	<jdbc:script location="clssspath:schema-mysql.sql" />
</jdbc:initialize-database>
(2)引入MySQL驅動
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>...</version>
</dependency>
(3)配置JobRepository
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
	<property name="driverClassName" value="com.mysql.jdbc.Driver" />
	<property name="url" value="jdbc:mysql://localhost/spring_batch_test"/>
	<property name="username" value="root"/>
	<property name="password" value="1"/>
</bean>
<bean id="transactionManager" class="org.springframework.batch.support.transaction.ResourcelessTransactionManager" />
<bean id="jobRepository" class="org.springframework.batch.core.repository.support.JobRepositoryFactoryBean">
	<property name="dataSource" ref="dataSource" />
	<property name="transactionManager" ref="transactionManager"/>
	<property name="databaseType" value="mysql" />
</bean>

通過以上配置後,你的spring batch元數據表就配置好了,當你在運行job時,這些表會得到更新。


表描述

spring batch元數據一共有9張表,如下所示:

batch_job_execution
batch_job_execution_context
batch_job_execution_params
batch_job_execution_seq
batch_job_instance
batch_job_seq
batch_step_execution
batch_step_execution_context
batch_step_execution_seq
其中以_seq結尾的三張表,顧名思義維護batch_job_instance、batch_job_execution、batch_step_execution的sequence id。


batch_job_instance表

JOB_INSTANCE_ID:JOB ID由batch_job_seq分配
VERSION:job版本號,同一個job執行多次時使用
JOB_NAME:job名稱,與spring配置一致
JOB_KEY:對job參數的MD5編碼,正因爲有這個字段的存在,同一個job如果第一次運行成功,第二次再運行會拋出JobInstanceAlreadyCompleteException異常。

batch_job_execution_params表:記錄每個job的參數

對於如下Parameter:

Map<String, JobParameter> parameterMap = new LinkedHashMap<String, JobParameter>();
parameterMap.put("userId", new JobParameter(8110332L, true));
parameterMap.put("nick", new JobParameter("zhangsan", true));
parameterMap.put("birthday", new JobParameter(new Date(), true));
對應的表數據如下:


只有identifying=true的字段纔會參與JOB_KEY的MD5編碼


batch_job_execution與batch_step_execution表

JOB_EXECUTION_ID:sequence id
VERSION:版本
JOB_INSTANCE_ID:參照batch_job_instance中的JOB_INSTANCE_ID字段
CREATE_TIME
START_TIME
END_TIME
STATUS:job運行的狀態
EXIT_CODE:退出碼
EXIT_MESSAGE
LAST_UPDATED:最後一次更新時間
JOB_CONFIGURATION_LOCATION

batch_step_execution表除了以上字段外,還有與tasklet相關的一些字段:

COMMIT_COUNT:提交次數
READ_COUNT:讀取item數
FILTER_COUNT:被過濾的item數
WRITE_COUNT:寫入itemWriter的次數
READ_SKIP_COUNT
WRITE_SKIP_COUNT
PROCESS_SKIP_COUNT


batch_job_execution_context與batch_step_execution_context表

這兩張表主要是保存job和step運行中的中間數據, 以便下次運行時可以恢復

STEP_EXECUTION_ID:step id
SHORT_CONTEXT:json化的ExecutionContext,如

{
    "map": {
        "entry": {
            "string": "FlatFileItemReader.read.count",
            "int": 10
        }
    }
}

SERIALIZED_CONTEXT:被序列化之後的ExecutionContext


表操作

這些表是如何被更新的呢?以job運行爲例進行分析:
(1)當通過launcher.run()運行job時,spring batch會從jobRepository中獲取這個job實例,這是通過jobRepository.getLastJobExecution()方法來獲取的。
(2)如果實例存在,然後判斷是否可重複執行,若不能重複執行拋出異常;如果可重複執行,就重新構建這個job,這是通過jobRepository.createJobExecution()方法創建的。
(3)執行過程中,如果出現異常,會更新jobExecution。
以上操作(獲取,創建,更新)都是通過jobInstanceDao、jobExecutionDao;、stepExecutionDao這些DAO直接操作表數據的。

JobExplorer與JobOperator可以對元數據進行查詢和操作,可以參考相關源碼。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章