java - Spring 批处理 : adjusting transaction properties in a fault tolerant step

标签 java spring transactions spring-batch

我在 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/

相关文章:

java - @Transactional注解是否避免并发访问业务层方法

Java : JLabel with text and icon

java - 通过蓝牙打印机打印pdf文件

java - mongodb 3 java : aggregation sum of keys

java - 在 jbutton 中序列化对象

Spring:Azure 功能管理器功能切换 Microsoft.Targeting bean 未找到

java - Spring Controller 销毁方法?

java - 当应用程序再次运行时,值将从数据库中删除

mysql - SELECT ... FOR UPDATE from one table in multiple threads

postgresql - SQLAlchemy 中如何使用 READ ONLY 事务模式?