如何在不使用块的情况下在spring批处理中提交文件(整个文件) - 提交间隔?

时间:2015-11-26 06:55:03

标签: spring-batch commit

提交间隔将按指定的时间间隔提交数据。我想一次提交整个文件,因为我的要求是验证文件(逐行)以及它是否在任何时候都失败。回滚。没有提交。有没有办法在春季批次实现这一目标?

2 个答案:

答案 0 :(得分:1)

您可以将提交间隔设置为Integer.MAX_VALUE(2 31 -1)或创建自己的CompletionPolicy

以下是配置步骤以使用自定义CompletionPolicy的方法:

<chunk reader="reader" writer="writer" chunk-completion-policy="completionPolicy"/>

<bean id="completionPolicy" class="xx.xx.xx.CompletionPolicy"/>

然后你必须选择Spring Batch提供的开箱即用的CompletionPolicy(前一个链接上的实现列表)或创建你自己的。{/ p>

答案 1 :(得分:-1)

“提交”是什么意思?

您正在讨论验证而不是将读取数据写入另一个文件或数据库。

如Michael Prarlow的评论所述,如果文件大小发生变化,可能会出现内存问题。

为了防止这种情况,我建议您通过验证步骤开始工作。只需按顺序读取数据,在处理器中逐行检查数据,如果该行无效,则抛出不可跳过的异常。使用passthroughwriter,因此没有任何东西持久存在。如果出现问题,整个工作都会失败。

如果您真的必须将数据写入db或其他文件,则可以在第二步中执行此操作。由于您已经验证了数据,因此不应该发现任何问题。

Simple PassThroughItemWriter

public class PassThroughItemWriter<T> implements ItemWriter<T> {
    public void write(List<? extends T> items) {
        // do nothing
    }
}

或者,如果你使用Java-Api来构建你的工作和步骤,你可以简单地使用lambda:

stepBuilders.get("step")
  .<..., ...>chunk(..)
  .reader(...)
  .processor(...)  // your processor with the validation logic

  .writer(items -> {}) // empty lambda expression
  .build();