作用
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