Spring Batch:指定用于处理列表列表的块大小

时间:2018-09-17 18:55:41

标签: java spring spring-batch

我正在List上工作,其中包含数据库中的多个记录列表。

我应该如何指定处理每个子列表的块大小?

我在“步骤”中确实有块配置,该配置适用于子列表的数量,而不是子列表的内容。

我的用例是,每个子列表可以包含5000-10000个要处理的记录,并且可以有4-5个这样的列表,不想将所有这些都在一个块中处理。

感谢您的帮助,谢谢。

2 个答案:

答案 0 :(得分:1)

这是不可能的。块大小(commit-interval)是一个块中的项目数。如果您的项目是一个列表(无论该列表中有多少个项目),则块大小将是一次事务中要读取/处理/写入的列表数。

答案 1 :(得分:0)

您可以像

一样实现CompletionPolicy
<batch:step id="step1"> 
<batch:tasklet> 
<batch:chunk reader="itemReader" processor="processor" 
writer="itemWriter" chunk-completion-policy="completionPolicy"> 
</batch:chunk> 
</batch:tasklet> 
</batch:step>

使用CompletionPolicy,您可以根据列表动态控制块大小。

public class RandomChunkSizePolicy implements CompletionPolicy {
private int chunkSize;
private int totalProcessed;

public boolean isComplete(RepeatContext context) {          
return totalProcessed >= chunkSize;      
}

public boolean isComplete(RepeatContext context, RepeatStatus status) 
{          
    if (RepeatStatus.FINISHED == status) {              
        return true;          
    } else {              
        return isComplete(context);          
    }      
}

public RepeatContext start(RepeatContext context) {
          Random random = new Random();          
          chunkSize = random.nextInt(20);
          totalProcessed = 0;            
          System.out.println("The chunk size has been set to " + chunkSize);            
          return context;      
}

public void update(RepeatContext context) {          
    totalProcessed++;      
}