配置 JobRepository
如前所述,JobRepository
用于各种持久化
domain 对象,例如JobExecution
和StepExecution
.
许多主要框架功能都需要它,例如JobLauncher
,Job
和Step
.
-
Java
-
XML
使用@EnableBatchProcessing
一个JobRepository
为您提供。
本节介绍如何对其进行自定义。作业的配置选项
repository 可以通过@EnableBatchProcessing
annotation 中,如以下示例所示:
@Configuration
@EnableBatchProcessing(
dataSourceRef = "batchDataSource",
transactionManagerRef = "batchTransactionManager",
tablePrefix = "BATCH_",
maxVarCharLength = 1000,
isolationLevelForCreate = "SERIALIZABLE")
public class MyJobConfiguration {
// job definition
}
此处列出的任何配置选项都不是必需的。
如果未设置,则使用前面显示的默认值。
最大varchar
length 默认为2500
,即
长VARCHAR
示例架构脚本中的列
batch 命名空间抽象出JobRepository
实施及其协作者。但是,仍然有一些
可用的配置选项,如下例所示:
<job-repository id="jobRepository"
data-source="dataSource"
transaction-manager="transactionManager"
isolation-level-for-create="SERIALIZABLE"
table-prefix="BATCH_"
max-varchar-length="1000"/>
除了id
,则前面列出的任何配置选项都不是必需的。如果他们是
未设置,则使用前面显示的默认值。
这max-varchar-length
默认为2500
,即长VARCHAR
列 S Schema Scripts 。
JobRepository 的事务配置
如果命名空间或提供的FactoryBean
,交易建议是
围绕存储库自动创建。这是为了确保批处理元数据
包括失败后重新启动所需的状态将正确保留。
如果存储库方法不是
事务。的create*
method attributes 的
以确保在启动作业时,如果两个进程尝试启动
同一时间执行相同的作业,只有一个成功。该
method 为SERIALIZABLE
,这是相当激进的。READ_COMMITTED
通常效果相同
井。READ_UNCOMMITTED
如果两个进程在此中不太可能发生冲突,则很好
道路。但是,由于对create*
方法相当短,则不太可能SERIALIZED
会导致问题,只要数据库平台支持它。但是,您
可以覆盖此设置。
-
Java
-
XML
以下示例演示如何在 Java 中覆盖隔离级别:
@Configuration
@EnableBatchProcessing(isolationLevelForCreate = "ISOLATION_REPEATABLE_READ")
public class MyJobConfiguration {
// job definition
}
以下示例演示如何在 XML 中覆盖隔离级别:
<job-repository id="jobRepository"
isolation-level-for-create="REPEATABLE_READ" />
如果未使用命名空间,则还必须配置 使用 AOP 的存储库的事务行为。
-
Java
-
XML
以下示例显示如何配置存储库的事务行为 在 Java 中:
@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>
您可以几乎按原样使用前面的 fragment,几乎不需要任何更改。还要记住
包含适当的命名空间声明,并确保spring-tx
和spring-aop
(或整个 Spring)都在 Classpath 上。
更改表前缀
的另一个可修改属性JobRepository
是元数据的表前缀
表。默认情况下,它们都以BATCH_
.BATCH_JOB_EXECUTION
和BATCH_STEP_EXECUTION
是两个例子。但是,有一些潜在的原因需要修改它
前缀。如果需要在表名前面加上架构名称,或者如果有多个
的元数据表集,则表前缀需要
被更改。
-
Java
-
XML
以下示例演示如何在 Java 中更改表前缀:
@Configuration
@EnableBatchProcessing(tablePrefix = "SYSTEM.TEST_")
public class MyJobConfiguration {
// job definition
}
以下示例演示如何更改 XML 中的表前缀:
<job-repository id="jobRepository"
table-prefix="SYSTEM.TEST_" />
鉴于上述更改,对元数据表的每个查询都带有SYSTEM.TEST_
.BATCH_JOB_EXECUTION
称为SYSTEM.TEST_JOB_EXECUTION
.
只有表前缀是可配置的。table 和 column name 不是。 |
存储库中的非标准数据库类型
如果您使用的数据库平台不在受支持平台列表中,则
如果 SQL 变体足够接近,则可能能够使用支持的类型之一。待办事项
this,您可以使用 RAWJobRepositoryFactoryBean
而不是命名空间快捷方式和
使用它来将 Database type (数据库类型) 设置为最接近的匹配项。
-
Java
-
XML
以下示例演示如何使用JobRepositoryFactoryBean
设置数据库类型
到 Java 中最接近的匹配项:
@Bean
public JobRepository jobRepository() throws Exception {
JobRepositoryFactoryBean factory = new JobRepositoryFactoryBean();
factory.setDataSource(dataSource);
factory.setDatabaseType("db2");
factory.setTransactionManager(transactionManager);
return factory.getObject();
}
以下示例演示如何使用JobRepositoryFactoryBean
设置数据库类型
到 XML 中最接近的匹配项:
<bean id="jobRepository" class="org...JobRepositoryFactoryBean">
<property name="databaseType" value="db2"/>
<property name="dataSource" ref="dataSource"/>
</bean>
如果未指定数据库类型,则JobRepositoryFactoryBean
尝试
从DataSource
.
平台之间的主要区别是
主要由递增主键的策略负责,因此
通常需要覆盖incrementerFactory
以及(通过使用标准的
来自 Spring Framework 的实现)。
如果这不起作用,或者您没有使用 RDBMS,则
唯一的选项可能是实现各种Dao
接口,该接口的SimpleJobRepository
取决于
on 上,并以正常的 Spring 方式手动连接一个。