[英]Can I use FlatfileItemReader with Taskexecutor?
Can I use FlatfileItemReader with Taskexecutor in spring batch??我可以在 spring 批处理中将 FlatfileItemReader 与 Taskexecutor 一起使用吗?
I have implemented FlatFileItemReader with ThreadPoolTaskExecutor.我已经用 ThreadPoolTaskExecutor 实现了 FlatFileItemReader。 When I print the records in ItemProcessor, I do not get consistent results, ie not all the records are printed and sometimes one of the record is printed more than once.当我在 ItemProcessor 中打印记录时,我没有得到一致的结果,即并非所有记录都被打印,有时其中一条记录被打印多次。 It leads me to the fact that FlatFileItemReader is not thread safe and also it says the same in spring docs but I see some blogs where it says it is possible to use FlatFileItemReader with Task Executor.它使我发现 FlatFileItemReader 不是线程安全的,并且它在 spring 文档中也说了同样的话,但是我看到一些博客说可以将 FlatFileItemReader 与 Task Executor 一起使用。
So my question is: Is it possible to use FlatfileItemReader with Task Executor in anyway?所以我的问题是:无论如何都可以将 FlatfileItemReader 与 Task Executor 一起使用吗?
@Bean
@StepScope
public FlatFileItemReader<DataLifeCycleEvent> csvFileReader(
@Value("#{stepExecution}") StepExecution stepExecution) {
Resource inputResource;
FlatFileItemReader<DataLifeCycleEvent> itemReader = new FlatFileItemReader<>();
itemReader.setLineMapper(new OnboardingLineMapper(stepExecution));
itemReader.setLinesToSkip(1);
itemReader.setSaveState(false);
itemReader.setSkippedLinesCallback(new OnboardingHeaderMapper(stepExecution));
String inputResourceString = stepExecution.getJobParameters().getString("inputResource");
inputResource = new FileSystemResource(inputFileLocation + ApplicationConstant.SLASH + inputResourceString);
itemReader.setResource(inputResource);
stepExecution.getJobExecution().getExecutionContext().putInt(ApplicationConstant.ERROR_COUNT, 0);
return itemReader;
}
FlatFileItemReader
extends AbstractItemCountingItemStreamItemReader
which is NOT thread-safe . FlatFileItemReader
扩展了非线程安全的AbstractItemCountingItemStreamItemReader
。 So if you use it in a multi-threaded step, you need to synchronize it.所以如果你在多线程步骤中使用它,你需要同步它。
You can wrap it in a SynchronizedItemStreamReader
.您可以将其包装在SynchronizedItemStreamReader
中。 Here is a quick example:这是一个简单的例子:
@Bean
public SynchronizedItemStreamReader<DataLifeCycleEvent> itemReader() {
FlatFileItemReader<DataLifeCycleEvent> itemReader = ... // your item reader
SynchronizedItemStreamReader<DataLifeCycleEvent> synchronizedItemStreamReader = new SynchronizedItemStreamReader<>();
synchronizedItemStreamReader.setDelegate(itemReader);
return synchronizedItemStreamReader;
}
This method is giving this exception:-java.lang.ClassCastException: com.sun.proxy.$Proxy344 cannot be cast to org.springframework.batch.item.support.SynchronizedItemStreamReader这个方法给出了这个异常:-java.lang.ClassCastException: com.sun.proxy.$Proxy344 cannot be cast to org.springframework.batch.item.support.SynchronizedItemStreamReader
@Bean
public SynchronizedItemStreamReader<DataLifeCycleEvent> itemReader() {
FlatFileItemReader<DataLifeCycleEvent> itemReader = ... // your item reader
SynchronizedItemStreamReader<DataLifeCycleEvent> synchronizedItemStreamReader = new SynchronizedItemStreamReader<>();
synchronizedItemStreamReader.setDelegate(itemReader);
return synchronizedItemStreamReader;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.