简体   繁体   English

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

[英]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.

相关问题 将FlatFileItemReader与TaskExecutor一起使用(线程安全) - Using FlatFileItemReader with a TaskExecutor (Thread Safety) 如何使用Spring TaskExecutor执行工作流程? - How can I use Spring TaskExecutor to execute a workflow? 将TaskExecutor与PublishSubscribeChannel一起使用 - Use TaskExecutor with PublishSubscribeChannel 使用 FlatFileItemReader 读取元素列表 - Use FlatFileItemReader to read a List of elements 哪个 TaskExecutor 用于异步日志记录? - Which TaskExecutor to use for async logging? 我们可以在Spring Batch中并行运行的多个步骤中使用单个flatFileItemReader bean吗? - Can we use single flatFileItemReader bean in multiple steps running in parallel in spring batch? Spring Retry可以与Spring Batch FlatFileItemReader一起使用吗 - Can Spring Retry be used with Spring Batch FlatFileItemReader 当我们使用@EnableScheduling 时,我们是否应该始终创建一个名为“taskExecutor”的 TaskExecutor bean - Should we always create a TaskExecutor bean named 'taskExecutor' when we use @EnableScheduling 如何自动装配Spring TaskExecutor创建的线程? - How do I autowire a Spring TaskExecutor created thread? 春季批处理中如何使用FlatFileItemReader处理以空格分隔的项目(单行中有多个记录)? - How to use FlatFileItemReader in spring batch for items separated by space (multiple records on single line)?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM