我在 Spring Batch 作业中有一个非常基本的步骤(使用 Java 配置):
@Bean
public Step step1() {
return stepBuilders.get("stepName")
.<Object1, Void>chunk(50)
.reader(reader(inputResource(null))
.processor(processor())
.listener(stepLogger())
.transactionAttribute(transactionTimeoutAttribute(null))
.build();
}
.......
@Bean
@StepScope
public StepExecutionListener stepLogger() {
return new StepLogger();
}
@Bean
@StepScope
public TransactionAttribute transactionTimeoutAttribute(
@Value("#{jobParameters[transactionTimeout]}") Integer timeout) {
timeout = timeout != null ? timeout : DEFAULT_TRANSACTION_TIMEOUT;
RuleBasedTransactionAttribute transactionAttribute = new RuleBasedTransactionAttribute();
transactionAttribute.setTimeout(timeout);
return transactionTimeout;
}
如您所见,要求事务超时可以作为作业参数给出。这工作完美,如果我将 transactionTimeout 作业参数设置得太低,则作业执行将失败,因为事务在 block 完成之前超时。
但是,如果我尝试增加容错能力(能够跳过一定数量的失败元素),一切都会崩溃。当我将 failureTolerant() 添加到步骤配置中以便能够指定跳过策略等时,如下所示:
@Bean
public Step step1() {
return stepBuilders.get("stepName")
.<Object1, Void>chunk(50)
.reader(reader(inputResource(null))
.processor(processor())
.faultTolerant()
.listener(stepLogger())
.transactionAttribute(transactionTimeoutAttribute(null))
.build();
}
Spring 无法再启动上下文(目前在 Jetty 上),并且只会在启动时抛出以下异常:
BeanCreationException: Error creating bean with name 'scopedTarget.transactionTimeoutAttribute': Scope 'step' is not active for the current thread; consider defining a scoped proxy for this bean if you intend to refer to it from a singleton; nested exception is java.lang.IllegalStateException: No context holder available for step scope
使用 Java Config 在 Spring Batch 中指定步骤的事务属性和跳过策略的正确方法是什么?
编辑:为了让问题更容易理解,我的要求是进行容错步骤,其中事务超时可配置为作业参数。对于非容错步骤,这不是问题,只需创建一个步骤范围的 TransactionAttribute bean,并连接作业参数即可。但是FaultTolerantStepBuilder 以不同的方式处理事务属性(它基本上将给定的事务属性与其内部属性合并),因此步骤范围不可用。如何使用作业参数来配置容错步骤的事务属性(Java 配置)?
最佳答案
如果您使用的是 Spring Batch 3 或更高版本,您可以将事务属性和步骤标记为 @JobScope。这将防止容错步骤过早访问事务属性。
关于java - Spring 批处理 : adjusting transaction properties in a fault tolerant step,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31651136/