如何在 Spring Batch Tasklet 作业中逐条记录地保存数据?

问题描述 投票:0回答:1

我正在开发一个 Spring Batch Tasklet 作业,执行以下步骤:

  1. 从文件夹中获取文件。
  2. 处理文件记录。
  3. 验证每条记录。
  4. 将数据保存到数据库中。

我面临的问题是数据持久化仅在整个 Tasklet 执行完成后才会发生。我需要每条记录在处理和验证后立即保留,但我无法实现这一点。

这是我迄今为止尝试过的:

  • 调整持久化方法的事务范围,但是 数据仍然等待 Tasklet 完成保存。
  • 使用基于块的Job而不是Tasklet,但我无法适应它 到我目前的情况。
  • Spring Batch 事务配置的各种组合, 没有成功。我的首要任务是确保,如果作业失败, 已处理的记录将提交到数据库,无需 取决于完整的 Tasklet 执行。

有没有办法解决这个问题,让每条记录在Tasklet执行期间立即保存到数据库中?

任何有关配置或方法的建议将不胜感激!

java spring database jpa spring-batch
1个回答
0
投票

手动处理

PlatformTransactionManager
应该可以完成这项工作。

@Component
public class CustomTasklet implements Tasklet {

    @Autowired
    private PlatformTransactionManager transactionManager;

    @Override
    public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) {
        TransactionStatus status = transactionManager.getTransaction(new DefaultTransactionDefinition());

        try {
            // Do some writes here

            transactionManager.commit(status);
        } catch (Exception e) {
            transactionManager.rollback(status);
        }

        return RepeatStatus.FINISHED;
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.