Spring Batch Partitioning - 所有线程处理相同的记录

时间:2017-03-16 04:26:57

标签: spring-boot spring-batch partitioning

我正在使用Spring引导中的异步任务执行器来分割我的数百万条记录数据,块大小为1000,网格大小为10。 我使用前一步项目阅读器中的StepExecution获取分区数据的开始和结束索引(来自分区程序类),以便从数据库中获取特定的分区数据。

问题是只有一个分区正在被读写。

代表: 物品阅读器

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

项目阅读器 迭代testData List并将testData值返回到writer

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

TestData = Partition1,Partition2,Partition3

只读取,处理和写入最后一个Partition3分区。

我希望同时读取所有分区。

1 个答案:

答案 0 :(得分:0)

这很可能是读者的线程安全问题。测试此方法的一种方法是将gridsize减少为1并查看它是否处理。

请务必确保它位于W/DynamiteModule: Local module descriptor class for com.google.firebase.auth not found. W/DynamiteModule: Local module descriptor class for com.google.firebase.auth not found. W/System.err: java.util.concurrent.ExecutionException: com.google.firebase.auth.FirebaseAuthInvalidUserException: The user's credential is no longer valid. The user must sign in again. W/System.err: at com.google.android.gms.tasks.Tasks.zzb(Unknown Source) W/System.err: at com.google.android.gms.tasks.Tasks.await(Unknown Source) W/System.err: at *private*.OAuth2Utilities.getFundaForOAuth2(OAuth2Utilities.java:52) W/System.err: at *private*.AsyncTask.PostFetchAsyncTask.doInBackground(PostFetchAsyncTask.java:60) W/System.err: at *private*.AsyncTask.PostFetchAsyncTask.doInBackground(PostFetchAsyncTask.java:48) W/System.err: at android.os.AsyncTask$2.call(AsyncTask.java:288) W/System.err: at java.util.concurrent.FutureTask.run(FutureTask.java:237) W/System.err: at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:231) W/System.err: at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) W/System.err: at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) W/System.err: at java.lang.Thread.run(Thread.java:818) W/System.err: Caused by: com.google.firebase.auth.FirebaseAuthInvalidUserException: The user's credential is no longer valid. The user must sign in again. W/System.err: at com.google.android.gms.internal.zzago.zzew(Unknown Source) W/System.err: at com.google.android.gms.internal.zzagl$zzg.zza(Unknown Source) W/System.err: at com.google.android.gms.internal.zzagw.zzex(Unknown Source) W/System.err: at com.google.android.gms.internal.zzagw$zza.onFailure(Unknown Source) W/System.err: at com.google.android.gms.internal.zzagr$zza.onTransact(Unknown Source) W/System.err: at android.os.Binder.execTransact(Binder.java:446),以确保为每个分区获取新实例。

scope="step"