使用CompositWriter的FlatfileItemWriter示例 [英] FlatfileItemWriter with Compositewriter example

查看:25
本文介绍了使用CompositWriter的FlatfileItemWriter示例的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个Spring批处理,它将读取CSV文件,然后处理它并将其写入另一个CSV文件。我想根据处理结果将结果写入两个不同的平面文件中。需要将成功处理的记录写入一个文件,将失败记录写入另一个文件。

我看到可以使用";CompositeItemWriter";的示例很少,但没有用于多个";FlatfileItemWriter";的确切示例。

有没有人,请分享我的用例?

推荐答案

CompositeItemWriter应将有效项写入两个或多个输出时使用。在您的情况下,SkipListener更合适,可用于将无效项写入不同的文件。下面是一个简单的例子:

import java.util.Arrays;
import java.util.Collections;
import java.util.logging.Level;
import java.util.logging.Logger;

import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.batch.core.listener.SkipListenerSupport;
import org.springframework.batch.item.ItemProcessor;
import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.ItemWriter;
import org.springframework.batch.item.file.FlatFileItemWriter;
import org.springframework.batch.item.file.builder.FlatFileItemWriterBuilder;
import org.springframework.batch.item.file.transform.PassThroughLineAggregator;
import org.springframework.batch.item.support.ListItemReader;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.FileSystemResource;

@Configuration
@EnableBatchProcessing
public class SO65996526 {

    @Bean
    public ItemReader<Integer> itemReader() {
        return new ListItemReader<>(Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));
    }

    @Bean
    public ItemProcessor<Integer, Integer> itemProcessor() {
        return item -> {
            if (item.equals(3)) {
                throw new IllegalArgumentException("no 3 here!");
            }
            if (item.equals(7)) {
                throw new IllegalArgumentException("no 7 here!");
            }
            return item;
        };
    }

    @Bean
    public ItemWriter<Integer> itemWriter() {
        return new FlatFileItemWriterBuilder<Integer>()
                .name("itemWriter")
                .resource(new FileSystemResource("output.txt"))
                .lineAggregator(new PassThroughLineAggregator<>())
                .build();
    }
    
    @Bean
    public FlatFileItemWriter<Integer> skippedItemWriter() {
        return new FlatFileItemWriterBuilder<Integer>()
                .name("skippedItemWriter")
                .resource(new FileSystemResource("skipped.txt"))
                .lineAggregator(new PassThroughLineAggregator<>())
                .build();
    }

    @Bean
    public Job job(JobBuilderFactory jobs, StepBuilderFactory steps) {
        return jobs.get("job")
                .start(steps.get("step")
                        .<Integer, Integer>chunk(5)
                        .reader(itemReader())
                        .processor(itemProcessor())
                        .writer(itemWriter())
                        .faultTolerant()
                        .skip(IllegalArgumentException.class)
                        .skipLimit(3)
                        .listener(new SkippedItemsListener(skippedItemWriter()))
                        .stream(skippedItemWriter()) // ensure open/close are called properly
                        .build())
                .build();
    }

    static class SkippedItemsListener extends SkipListenerSupport<Integer, Integer> {
        private FlatFileItemWriter<Integer> skippedItemsWriter;

        public SkippedItemsListener(FlatFileItemWriter<Integer> skippedItemsWriter) {
            this.skippedItemsWriter = skippedItemsWriter;
        }

        @Override
        public void onSkipInProcess(Integer item, Throwable t) {
            try {
                skippedItemsWriter.write(Collections.singletonList(item));
            } catch (Exception e) {
                Logger.getLogger(this.getClass().getName()).log(Level.SEVERE, "Unable to write skipped item " + item);
            }
        }
    }

    public static void main(String[] args) throws Exception {
        ApplicationContext context = new AnnotationConfigApplicationContext(SO65996526.class);
        JobLauncher jobLauncher = context.getBean(JobLauncher.class);
        Job job = context.getBean(Job.class);
        jobLauncher.run(job, new JobParameters());
    }

}

此示例跳过第3项和第7项,并生成两个文件:output.txt包含有效项,skipped.txt包含无效项。

这篇关于使用CompositWriter的FlatfileItemWriter示例的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆