我有一个要求,首先我必须从表中选择MasterRecords,然后对于每个MasterRecords,我将不得不获取子行,并为每个子行处理和写入块 .
为此,我在Spring批处理中使用了Partitioner,并创建了主从步骤来实现这一目标 . 现在代码工作正常如果我不需要以相同的顺序运行slave步骤它被添加到Execution上下文 .
但 my requirement is to run slave step for each execution context in same sequence it was added in partitioner . 因为在我处理父记录之前我无法处理子记录 . 使用分区程序从属步骤不以相同的顺序运行 . 请帮我如何保持从步运行相同的顺序?????
有没有其他方法可以使用 spring 批来实现这一目标 . 欢迎任何帮助 .
<job id="EPICSDBJob" xmlns="http://www.springframework.org/schema/batch">
<!-- Create Order Master Start -->
<step id="populateNewOrdersMasterStep" allow-start-if-complete="false"
next="populateLineItemMasterStep">
<partition step="populateNewOrders" partitioner="pdcReadPartitioner">
<handler grid-size="1" task-executor="taskExecutor" />
</partition>
<batch:listeners>
<batch:listener ref="partitionerStepListner" />
</batch:listeners>
</step>
<!-- Create Order Master End -->
<listeners>
<listener ref="epicsPimsJobListner" />
</listeners>
</job>
<step id="populateNewOrders" xmlns="http://www.springframework.org/schema/batch">
<tasklet allow-start-if-complete="true">
<chunk reader="epicsDBReader" processor="epicsPimsProcessor"
writer="pimsWriter" commit-interval="10">
</chunk>
</tasklet>
<batch:listeners>
<batch:listener ref="stepJobListner" />
</batch:listeners>
</step>
<bean id="epicsDBReader" class="com.cat.epics.sf.batch.reader.EPICSDBReader" scope="step" >
<property name="sfObjName" value="#{stepExecutionContext[sfParentObjNm]}" />
<property name="readChunkCount" value="10" />
<property name="readerDao" ref="readerDao" />
<property name="configDao" ref="configDao" />
<property name="dBReaderService" ref="dBReaderService" />
</bean>
分区方法:
@Override
public Map<String, ExecutionContext> partition(int arg0) {
Map<String, ExecutionContext> result = new LinkedHashMap<String, ExecutionContext>();
List<String> sfMappingObjectNames = configDao.getSFMappingObjNames();
int i=1;
for(String sfMappingObjectName: sfMappingObjectNames){
ExecutionContext value = new ExecutionContext();
value.putString("sfParentObjNm", sfMappingObjectName);
result.put("partition:"+i, value);
i++;
}
return result;
}
1 回答
没有办法保证Spring Batch的分区模型中的顺序 . 并行执行分区的事实意味着,根据定义,处理的记录不会有排序 . 我认为这是一个重组工作可能会有所帮助的情况 .
如果您的要求是执行父项然后执行子项,则使用驱动查询模式以及分区将起作用 . 您将沿父记录进行分区(看起来您正在进行分区),然后在工作步骤中,您将使用父记录来驱动子记录的查询和处理 . 这样可以保证子记录在主记录之后得到处理 .