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的的分區模型中順序的方式。分區並行執行的事實意味着,根據定義,將不會對已處理的記錄進行排序。我認爲這是一個可以幫助重組工作的案例。

如果您的要求是執行父項然後執行子項,則使用驅動查詢模式以及分區將會起作用。您將沿着父記錄進行分區(看起來像您正在做的),然後在工作人員步驟中,您將使用父記錄來爲子記錄驅動查詢和處理。這將保證子記錄在主記錄之後被處理。

相關問題