spring batch学习笔记之元数据表

来源:互联网 发布:逆战数据异常规范游戏 编辑:程序博客网 时间:2024/06/05 11:18

作用

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_executionbatch_job_execution_contextbatch_job_execution_paramsbatch_job_execution_seqbatch_job_instancebatch_job_seqbatch_step_executionbatch_step_execution_contextbatch_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可以对元数据进行查询和操作,可以参考相关源码。
1 0
原创粉丝点击