我在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作业参数设置得太低,作业执行将失败,因为事务在块完成之前超时。
但是,如果我试图提高容错能力(能够跳过一定数量的失败元素),一切都会崩溃。当我将faultTolerant()添加到步骤配置中以便能够指定跳过策略等时,如下所示:
@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 config)的事务属性?
答案 0 :(得分:0)
如果您使用的是Spring Batch 3或更新版本,则可以将事务属性标记为@JobScope。这将阻止容错步骤过早访问事务属性。