首页 文章

如何使Spring批处理分区程序中的执行上下文按顺序运行

提问于
浏览
0

我有一个要求,首先我必须从表中选择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 回答

  • 0

    没有办法保证Spring Batch的分区模型中的顺序 . 并行执行分区的事实意味着,根据定义,处理的记录不会有排序 . 我认为这是一个重组工作可能会有所帮助的情况 .

    如果您的要求是执行父项然后执行子项,则使用驱动查询模式以及分区将起作用 . 您将沿父记录进行分区(看起来您正在进行分区),然后在工作步骤中,您将使用父记录来驱动子记录的查询和处理 . 这样可以保证子记录在主记录之后得到处理 .

相关问题