我正在List
上工作,其中包含数据库中的多个记录列表。
我应该如何指定处理每个子列表的块大小?
我在“步骤”中确实有块配置,该配置适用于子列表的数量,而不是子列表的内容。
我的用例是,每个子列表可以包含5000-10000个要处理的记录,并且可以有4-5个这样的列表,不想将所有这些都在一个块中处理。
感谢您的帮助,谢谢。
答案 0 :(得分:1)
这是不可能的。块大小(commit-interval)是一个块中的项目数。如果您的项目是一个列表(无论该列表中有多少个项目),则块大小将是一次事务中要读取/处理/写入的列表数。
答案 1 :(得分:0)
您可以像
<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++;
}