java - 我可以将 FlatfileItemReader 与 Taskexecutor 一起使用吗?

标签 java spring multithreading spring-batch flatfilereader

我可以在 Spring Batch 中将 FlatfileItemReader 与 Taskexecutor 一起使用吗?

我已经使用 ThreadPoolTask​​Executor 实现了 FlatFileItemReader。当我在 ItemProcessor 中打印记录时,我没有得到一致的结果,即并非所有记录都被打印,有时其中一条记录被打印多次。这让我意识到 FlatFileItemReader 不是线程安全的,而且在 spring 文档中也说了同样的事情,但我看到一些博客说可以将 FlatFileItemReader 与任务执行器一起使用。

所以我的问题是:是否可以将 FlatfileItemReader 与任务执行器一起使用?

    @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/

相关文章:

java - Spring并返回大量Json数据

c# - SQL CLR 中的多线程缓存

c++ - SLURM C++ 发现可用内核多于分配的内核

Java Web Start 和许可证管理

java - Scala Spring Boot Autowiring 不起作用

java - 无法使用JSP从mySQL数据库获取数据

java - 如何从 Spring 环境自动生成 postman 集合

java - 在对特定方法进行 Junit 测试用例和模拟时,如何避免调用内部方法结构的级联

spring - 将应用程序从 grails 2.0.x 升级到 2.4.x

php - apache php > 用户请求