分区步骤的作业配置。
<!-- master step, 10 threads (grid-size) -->
<step id="masterStep">
<partition step="slave" partitioner="rangePartitioner">
<handler grid-size="10" task-executor="taskExecutor" />
</partition>
</step>
</job>
<!-- Jobs to run -->
<step id="slave" xmlns="http://www.springframework.org/schema/batch">
<tasklet>
<chunk reader="pagingItemReader" writer="jdbcWriter"
processor="itemProcessor" commit-interval="1" />
</tasklet>
</step>
以下是我的分区java类
Map<String, ExecutionContext> result = new HashMap<String, ExecutionContext>();
int range = 5;
int fromId = 1;
int toId = range;
for (int i = 1; i <= gridSize; i++) {
ExecutionContext value = new ExecutionContext();
System.out.println("\nStarting : Thread" + i);
System.out.println("fromId : " + fromId);
System.out.println("toId : " + toId);
value.putInt("fromId", fromId);
value.putInt("toId", toId);
// give each thread a name
value.putString("name", "Thread" + i);
result.put("partition" + i, value);
fromId = toId + 1;
toId += range;
}
return result;
从上面的配置我可以使用分区,10个线程将运行,每个线程将处理5个记录。
有两种情况
1.如果只有5条记录,则其余9个线程不处理任何数据 2.如果一天数据量经常变化,则有5条记录,一天有100万条记录,在这种情况下,如果我在文件中对它们进行硬编码,我就无法每天配置网格大小和范围。 / p>
所以现在我的要求是动态地根据数据库的数量来处理线程,即基于特定表中的行数。
请为此建议我。
答案 0 :(得分:0)
在Spring Batch中,有一个用于分区数据库记录的示例。该示例使用名为ColumnRangePartitioner的类。该类演示了如何查询min和max id,然后基于此进行分区。您可以直接从Github获取该类,并在您自己的代码中使用它或只应用主体。