Spring Batch Java Config提交间隔

时间:2015-09-14 16:22:07

标签: spring annotations spring-batch spring-java-config

如何配置Spring Batch(使用Java配置)在单个事务中写入所有块?

我有一个简单的简单Spring Batch Job,只需一步。该步骤由JdbcCursorItemReader,自定义项目处理器和自定义项目编写器组成。目前我在StepBuilder上设置了块大小。这似乎也将提交间隔设置为相同的值。一方面,我不想将所有项目加载到内存中,因此需要进行面向块的处理。另一方面,处理器需要对所有项目进行单个事务,而不仅仅是当前块中的项目。它不会将项目存储在内存中。如果多次调用#write,那就没关系了。

如何使用Java配置实现这一目标?

2 个答案:

答案 0 :(得分:1)

IMO,这种方法打破了弹簧批量设计的方式。

春天批处理背后的整个想法是,你提交每个块,并且spring-batch跟踪已经处理的记录,以便提供重启,跳过和失败处理策略。

如果你真的需要整个过程的交易,为什么要使用弹簧批呢?我的意思是,你可以直接使用阅读器和编写器,并在你自己的简单循环中使用它们。这样的事情。

transaction.open();
while (not all processed) {
  List currentChunk = new List..;
  for(int i<0;i<chunkSize;i++) {
      Object readItem = jdbcCursorItemReader.read();
      if (readItem == null) {
         break;
      }
      Object processedItem = processor.process(readItem);
      if (processedItem != null) {
          currentChunk.add(processedItem);
      }
  }

  yourWriter.write(currentChunk);
}
transaction.commit();

答案 1 :(得分:0)

一次写出所有的块与SB设计和哲学相反 如果你想要你可以读取所有项目,将它们放在一个大块中并写入;你会得到同样的结果。
检查Spring Batch Chunk processing以获取可能的解决方案。