0

我有一个要求,首先我必须从表中选择否MasterRecords,然后对于每个MasterRecords,我将不得不提取任何子行和每个子行过程和明智地写块。如何使Spring批处理分区程序中的执行上下文按顺序运行

为此,我在Spring批处理中使用了Partitioner,并创建了主和从属步骤来实现此目的。现在代码工作正常,如果我不需要以相同的顺序运行从属步骤,它将被添加到执行上下文中。

但是我的要求是以相同的顺序为每个执行上下文运行从属步骤,并将其添加到分区器中。因为在我处理父记录之前,我无法处理子记录。 使用分区程序从站步骤未按相同顺序运行。请帮助我如何保持从属步骤运行相同的序列?????

是否有任何其他方式来实现这个使用春季批次。欢迎任何帮助。

<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; 
} 

回答

0

没有保证Spring Batch的的分区模型中顺序的方式。分区并行执行的事实意味着,根据定义,将不会对已处理的记录进行排序。我认为这是一个可以帮助重组工作的案例。

如果您的要求是执行父项然后执行子项,则使用驱动查询模式以及分区将会起作用。您将沿着父记录进行分区(看起来像您正在做的),然后在工作人员步骤中,您将使用父记录来为子记录驱动查询和处理。这将保证子记录在主记录之后被处理。

相关问题