我可以在春季批处理中将FlatfileItemReader与Taskexecutor一起使用吗?

我已经用ThreadPoolTask​​Executor实现了FlatFileItemReader。当我在ItemProcessor中打印记录时,我没有得到一致的结果,即不是所有记录都被打印出来,有时其中一个记录被打印多次。这使我想到一个事实,即FlatFileItemReader不是线程安全的,并且在spring文档中也是如此,但是我看到一些博客说可以在Task Executor中使用FlatFileItemReader。

所以我的问题是:是否可以将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扩展了AbstractItemCountingItemStreamItemReader,即NOT thread-safe。因此,如果在多线程步骤中使用它,则需要对其进行同步。

您可以将其包装在SynchronizedItemStreamReader中。这是一个简单的示例:

@Bean
public SynchronizedItemStreamReader<DataLifeCycleEvent> itemReader() {
    FlatFileItemReader<DataLifeCycleEvent> itemReader = ... // your item reader

    SynchronizedItemStreamReader<DataLifeCycleEvent> synchronizedItemStreamReader = new SynchronizedItemStreamReader<>();
    synchronizedItemStreamReader.setDelegate(itemReader);
    return synchronizedItemStreamReader;
}

关于java - 我可以将FlatfileItemReader与Taskexecutor一起使用吗?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61998974/

10-09 03:17