Spring批处理分区:在运行时设置grid-size

时间:2016-06-20 17:42:09

标签: spring spring-batch

分区的网格大小是否应与Partitioner.partition()方法返回的Map大小相同?

在我的春季批处理分区方案中,有两个步骤。第一步标识要处理的记录总数,第二步(基于TaskExecutorPartitionHandler的分区步骤)以1000个批次处理记录。

如果有20500条记录,Partitioner.partition()方法返回的Map大小为21,则需要执行21个并发步骤。这是否意味着在这种情况下分区的网格大小应该是21?

如果要处理的记录总数每天更改怎么办?如何在第一步完成后在运行时分配分区的网格大小?

1 个答案:

答案 0 :(得分:0)

看起来第一步可以在jobExecutionContext中存储网格大小

ExecutionContext jobExecutionContext =
chunkContext.getStepContext().getStepExecution().getJobExecution().getExecutionContext();

jobExecutionContext.putInt("gridSize", 21); 

以后可以将它注入PartitionHandler。

<job id="testJob" xmlns="http://www.springframework.org/schema/batch">
    <step id="firstStep" next="secondStep.master">
       <tasklet ref="firstTasklet"/>
    </step>
    <step id="secondStep.master">
       <partition partitioner="partitioner" handler="taskExecutorPartitionHandler"/>
    </step>
</job>

<bean id="taskExecutorPartitionHandler" class="org.springframework.batch.core.partition.support.TaskExecutorPartitionHandler" scope="step">
    <property name="taskExecutor" ref="threadPoolTaskExecutor"/>
    <property name="step" ref="secondStep.slave" />
    <property name="gridSize" value="#{jobExecutionContext['gridSize']}" />
</bean>