我有一個要求,首先我必須從表中選擇否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;
}