配置作业仓库
如前所述,该JobRepository用于基本的CRUD作
Spring Batch 中各种持久域对象,例如作业执行和步执行.
许多主要框架功能都要求它,例如作业操作员,工作和步.
配置无资源作业仓库
最简单的实现JobRepository接口是ResourcelessJobRepository.该实现不使用或存储批处理元数据。
它适用于不需要重启且执行上下文为
不涉及任何作(如通过执行上下文在步骤间共享数据,
或分区步骤,其中分区元数据通过管理者和工人共享
执行上下文等)。该实现保持运行单一作业的最小状态
(即1个作业实例 + 1个作业执行 + N个步骤执行)。这适合一次性工作
在他们自己的JVM中执行。该作业仓库既支持事务步骤,也支持非事务步骤
步骤(配合ResourcelessTransactionManager).
| 该实现不支持线程安全,不应在任何并发环境中使用。 |
默认情况下,使用@EnableBatchProcessing或DefaultBatchConfiguration一个ResourcelessJobRepository为你提供。
配置 JDBC JobRepository
-
Java
-
XML
使用@EnableBatchProcessing一个ResourcelssJobRepository为你提供。
本节将介绍如何自定义它。Spring Batch 提供了两种实现方式
关于JobRepository由数据库支持的接口:JDBC实现
(可与任何符合JDBC标准的数据库一起使用)以及MongoDB实现。这两个
实现方式由@EnableJdbcJobRepository和@EnableMongoJobRepository分别是注释。
以下示例展示了如何通过属性自定义基于JDBC的作业仓库
关于@EnableJdbcJobRepository注解:
@Configuration
@EnableBatchProcessing
@EnableJdbcJobRepository(
dataSourceRef = "batchDataSource",
transactionManagerRef = "batchTransactionManager",
tablePrefix = "BATCH_",
maxVarCharLength = 1000,
isolationLevelForCreate = "SERIALIZABLE")
public class MyJobConfiguration {
// job definition
}
这里列出的任何配置选项都不是必需的。
如果未设置,则使用之前显示的默认值。
最大瓦尔查尔长度默认为2500,即
长距离长度瓦尔查尔示例模式脚本中的列
批处理命名空间抽象了许多实现细节JobRepository实现及其合作者。不过,仍有少数人
可用的配置选项如下示例所示:
<job-repository id="jobRepository"
data-source="dataSource"
transaction-manager="transactionManager"
isolation-level-for-create="SERIALIZABLE"
table-prefix="BATCH_"
max-varchar-length="1000"/>
除了身份证,之前列出的配置选项均非必需。如果他们是
未设置,使用之前显示的默认值。
这最大变长默认为2500,即长的长度瓦尔查尔示例模式脚本中的列。
配置MongoDB作业仓库
类似于基于JDBC的JobRepository,基于MongoDB的JobRepository需要一些集合
用于存储批处理元数据。这些集合定义在org/springframework/batch/core/schema-mongodb.jsonl关于Spring-批次-核心罐。与基于JDBC的机构类似JobRepository你需要创建这些集合
在运行任何作业之前,先在你的MongoDB数据库中。
此外,由于不推荐使用.在
MongoDB文档中的字段名称,你需要自定义Mongo模板被以下机构使用MongoJobRepositoryFactoryBean替换.字段名称中包含另一个字符(例如),。你可以通过自定义_映射Mongo转换器被以下机构使用Mongo模板.以下示例展示了如何在 Java 配置中实现这一点:
@Bean
public MongoTemplate mongoTemplate(MongoDatabaseFactory mongoDatabaseFactory) {
MongoTemplate template = new MongoTemplate(mongoDatabaseFactory);
MappingMongoConverter converter = (MappingMongoConverter) template.getConverter();
converter.setMapKeyDotReplacement("_");
return template;
}
JobRepository 的事务配置
如果命名空间或提供的工厂豆是使用的,交易性建议是
自动在仓库周围创建。这是为了确保批处理元数据,
包括在失败后重启所需的状态,并且会被正确持久化。
如果仓库方法没有明确定义,框架的行为也没有明确定义
事务。隔离能级创造*方法属性被指定
分别确保当作业启动时,如果两个进程同时尝试启动
同一任务同时完成,只有一个成功。该标准的隔离水平
方法是序列 化,这相当激进。READ_COMMITTED通常效果一样好
井。READ_UNCOMMITTED如果两个过程不太可能碰撞,则是可以的
道路。然而,由于有呼叫创造*方法相当简短,不太可能序列 化只要数据库平台支持,就会带来问题。不过,你
可以覆盖这个设置。
-
Java
-
XML
以下示例展示了如何在 Java 中覆盖隔离级别:
@Configuration
@EnableBatchProcessing
@EnableJdbcJobRepository(isolationLevelForCreate = "ISOLATION_REPEATABLE_READ")
public class MyJobConfiguration {
// job definition
}
以下示例展示了如何在 XML 中覆盖隔离级别:
<job-repository id="jobRepository"
isolation-level-for-create="REPEATABLE_READ" />
如果未使用命名空间,你还必须配置 通过使用 AOP 处理存储库的交易行为。
-
Java
-
XML
以下示例展示了如何配置仓库的交易行为 在爪哇语中:
@Bean
public TransactionProxyFactoryBean baseProxy() {
TransactionProxyFactoryBean transactionProxyFactoryBean = new TransactionProxyFactoryBean();
Properties transactionAttributes = new Properties();
transactionAttributes.setProperty("*", "PROPAGATION_REQUIRED");
transactionProxyFactoryBean.setTransactionAttributes(transactionAttributes);
transactionProxyFactoryBean.setTarget(jobRepository());
transactionProxyFactoryBean.setTransactionManager(transactionManager());
return transactionProxyFactoryBean;
}
以下示例展示了如何配置仓库的交易行为 以XML形式表示:
<aop:config>
<aop:advisor
pointcut="execution(* org.springframework.batch.core..*Repository+.*(..))"/>
<advice-ref="txAdvice" />
</aop:config>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*" />
</tx:attributes>
</tx:advice>
你几乎可以原版使用前面的片段,几乎不做任何修改。还要记得
包含适当的命名空间声明并确保春季-德克萨斯和春季-AOP(或者说整个春季)都在上班路上。
更改表前缀
另一个可修改的性质JobRepository是元数据的表前缀
表。默认情况下,它们都以以下形式开头批_.BATCH_JOB_EXECUTION和BATCH_STEP_EXECUTION是两个例子。不过,确实有理由需要修改这一点
前缀。如果需要将模式名称加在表名前,或者如果有多个
在同一模式内需要一组元数据表,表前缀需要
被改变。
-
Java
-
XML
以下示例展示了如何在 Java 中更改表前缀:
@Configuration
@EnableBatchProcessing
@EnableJdbcJobRepository(tablePrefix = "SYSTEM.TEST_")
public class MyJobConfiguration {
// job definition
}
以下示例展示了如何在 XML 中更改表前缀:
<job-repository id="jobRepository"
table-prefix="SYSTEM.TEST_" />
鉴于上述变化,每次对元数据表的查询都以系统。测试_.BATCH_JOB_EXECUTION被称为系统。TEST_JOB_EXECUTION.
| 只有表前缀可以配置。但表和列名则不然。 |
仓库中的非标准数据库类型
如果你使用的数据库平台不在支持的平台列表中,
如果SQL变体足够接近,可能还能使用支持的类型之一。要做
这个,你可以用RAW。JdbcJobRepositoryFactoryBean取代命名空间快捷方式和
用它来设置数据库类型,匹配最接近。
-
Java
-
XML
以下示例展示了如何使用JdbcJobRepositoryFactoryBean设置数据库类型
到爪哇最接近的匹配:
@Bean
public JobRepository jobRepository() throws Exception {
JdbcJobRepositoryFactoryBean factory = new JdbcJobRepositoryFactoryBean();
factory.setDataSource(dataSource);
factory.setDatabaseType("db2");
factory.setTransactionManager(transactionManager);
return factory.getObject();
}
以下示例展示了如何使用JdbcJobRepositoryFactoryBean设置数据库类型
与XML中最接近的匹配点:
<bean id="jobRepository" class="org...JdbcJobRepositoryFactoryBean">
<property name="databaseType" value="db2"/>
<property name="dataSource" ref="dataSource"/>
</bean>
如果未指定数据库类型,则JdbcJobRepositoryFactoryBean试图
自动检测数据库类型数据来源.
平台之间的主要区别有
主要由主键递增策略来解释,因此
通常需要覆盖增量工厂也(通过使用标准
Spring 框架中的实现)。
如果连这些都不行,或者你没有使用关系数据库管理系统(RDBMS),那
唯一的选择可能是实现道接口简易作业仓库取决于
然后用正常的Spring方式手动接线。