2017-03-16 50 views
0

我正在使用異步任務執行程序在春季啓動時將我的數據以百萬條記錄進行分區,塊大小爲1000,網格大小爲10。 爲了從數據庫中獲取特定的分區數據,我使用ItemReader的前一步中的StepExecution獲取分區數據(來自Partitioner類)的開始和結束索引。春季批處理分區 - 所有線程處理相同記錄

問題是隻有一個分區正在被讀取和寫入。

爲前: 項目讀者

beforeStep(StepExecution execution){ 
int startIndex = execution.getExecutionContext().getInt("startIndexValue") 
int endIndex = execution.getExecutionContext().getInt("endIndexValue") 
List testDataList = getTestDatabetween(startIndex, endIndex); 
} 

項目讀者 遍歷的TESTDATA列表和TESTDATA值返回作家

testData read() 
{ 
if(!testData.isEmpty()){ 
testData = testDataList.get(testIndex); 
testIndex++; 
} 
return testData; 
} 

TESTDATA =分區1,分區2,Partition3

只有讀取,處理和寫入最後一個Partition3分區。

我想要同時讀取所有分區。

+0

你看過BATCH_STEP_EXECUTION看看其他分區是否被創建?您是否嘗試過在調試中運行以查看'getTestDatabetwee'方法是否爲您提交的範圍拉回行?你有沒有嘗試添加日誌? –

回答

0

這很可能是讀者的線程安全問題。測試這種方法的一種方法是將網格大小減小到1並查看它是否處理。

請確保確保它在scope="step"以確保您爲每個分區獲得新實例。

<bean id="yourReader" class="com.example.reader.YourReader" scope="step"> 
    <!-- properties --> 
</bean> 
+0

添加**範圍=步驟**使其工作。謝謝。 – GKK