如何解决Spring Batch回滚完整步骤,而不是面向块的当前事务
我想从文件中读取项目并将其插入表中。为此,我正在使用FlatFileItemReader
和JdbcBatchItemWriter
。我在该步骤中使用块定向。所以我的步骤将如下所示。
private Step createPoliciesStep() {
return stepBuilderFactory.get("CreatePoliciesStep")
.<PolicyDTO,PolicyDTO>chunk(2)
.reader(createPoliciesReaderFunc())
.writer(createPoliciesWriterFunc())
.listener(createPoliciesWriteListener)
.listener(createPoliciesStepListener)
.build();
}
我给的commit-interval是2。所以每2条记录都会发生一次提交。例如,在读取第4条记录时,抛出了一些异常。当时没有插入第3和第4条记录,这绝对可以。我想回退表上的第一条记录和第二条记录(在先前的事务中提交)。
我期望的是在交易
Begin
之前。在执行步骤之后,应commit
进行交易。在这之间,任何异常都应回滚整个步骤。
我们有一个简单的方法,如果下一步失败,则可以删除这些条目。但是我觉得这不是一个好方法。
我尝试通过添加DataSourceTransactionManager
的事务管理器和事务属性来解决问题,但是没有用。添加完我的步骤后,像这样
@Bean
PlatformTransactionManager policyTransactionManager(@Qualifier("mysqlDataSource")DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
private Step createPoliciesStep() {
log.info("Create Policies Step Initiated ");
DefaultTransactionAttribute attribute = new DefaultTransactionAttribute();
attribute.setPropagationBehavior(Propagation.REQUIRED.value());
attribute.setIsolationLevel(Isolation.DEFAULT.value());
return stepBuilderFactory.get("CreatePoliciesStep")
.transactionManager(policyTransactionManager)
.<PolicyDTO,PolicyDTO>chunk(2)
.reader(createPoliciesReaderFunc())
.writer(createPoliciesWriterFunc())
.listener(createPoliciesWriteListener)
.transactionAttribute(attribute)
.listener(createPoliciesStepListener)
.build();
}
谁能建议一些好的方法来回滚整个步骤。提前谢谢!!!
解决方法
Spring Batch中的事务边界是围绕块而不是步骤定义的。因此,不可能为整个步骤配置事务。
您的用例的常见模式是添加一个单独的步骤,该步骤根据上一步的退出状态(成功或失败)执行“补偿操作”,以回退上一步的更改。您的情况。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。