Spring Batch保存拒绝文件中跳过的读卡器行 [英] Spring batch Save skipped reader lines in rejection file

查看:8
本文介绍了Spring Batch保存拒绝文件中跳过的读卡器行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想重写输出拒绝文件中跳过的读卡器行,谢谢。

我的代码:

public class JobPerson {

    @Autowired
    private JobBuilderFactory jobs;

    @Autowired
    private StepBuilderFactory steps;


    @Bean
    public ItemReader<Person> itemReader() {
        FlatFileItemReader<Person> reader = new FlatFileItemReader<Person>();
        reader.setResource(new ClassPathResource("user.csv"));
        reader.setLineMapper(new DefaultLineMapper<Person>() {{
            setLineTokenizer(new DelimitedLineTokenizer(";") {{
                setNames(new String[] {"firstName", "lastName", "age" });
            }});
            setFieldSetMapper(new BeanWrapperFieldSetMapper<Person>() {{
                setTargetType(Person.class);
            }});
        }});
        return reader;
    }



    @Bean
    public ItemWriter<Person> itemWriter() {
        return items -> {
            int i=0;
            for (Person item : items) {
                i++;

                System.out.println(i+". Nom = " + item.getFirstName()+". Prenom = " + item.getLastName());
            }
        };
    }

    @Bean
    public ItemProcessor<Person, Person> itemProcessor() {
        return item -> {
            String stritem=item.toString();
            String[] splitArray = stritem.split(";"); // tableau de chaînes
            int lineData = splitArray.length;
            //if (lineData<2)

            if (item.equals("Eric")) {
                throw new IllegalArgumentException("Wanted!");
            }
            return item;
        };
    }

    @Bean
    public Step step() {
        return steps.get("step")
                .<Person, Person>chunk(5)
                .reader(itemReader())
                .processor(itemProcessor())
                .writer(itemWriter())
                .faultTolerant()
                .skip(IllegalArgumentException.class)
                .skipLimit(100)
                .listener(new MySkipListener())
                .skip(Exception.class)
                .build();
    }

    @Bean
    public Job job() {
        return jobs.get("job")
                .start(step())
                .build();
    }

    public static class MySkipListener implements SkipListener<Person, Person> {

        @Override
        public void onSkipInRead(Throwable t) {
            System.err.println("On Skip in Read Error : " + t.getMessage());
        }

        @Override
        public void onSkipInWrite(Person item, Throwable t) {
            System.out.println("Item " + item + " was skipped due to: " + t.getMessage());
        }

        @Override
        public void onSkipInProcess(Person item, Throwable t) {
            System.out.println("Item " + item + " was skipped due to: " + t.getMessage());
        }
    }
}

要重写的行(红色行):

在读取时跳过错误:在资源=[类路径资源[user.csv]]中的第2行出现解析错误,输入=[Eric;Bonneton;] 在读取时跳过错误:资源=[类路径资源[user.csv]]中的第3行出现解析错误,输入=[sdqsdqs;]

推荐答案

在您的示例中,错误发生在读取过程中,有一个FlatFileParseException异常。此异常为您提供行号和跳过的原始输入行。

因此您的跳过监听程序可以类似于:

public static class MySkipListener implements SkipListener<Person, Person> {

    private FileWriter fileWriter;

    public MySkipListener(File file) throws IOException {
        this.fileWriter = new FileWriter(file);
    }

    @Override
    public void onSkipInRead(Throwable throwable) {
        if (throwable instanceof FlatFileParseException) {
            FlatFileParseException flatFileParseException = (FlatFileParseException) throwable;
            try {
                fileWriter.write(flatFileParseException.getInput());
            } catch (IOException e) {
                System.err.println("Unable to write skipped line to error file");
            }
        }
    }

    @Override
    public void onSkipInWrite(Person item, Throwable t) {
        System.out.println("Item " + item + " was skipped due to: " + t.getMessage());
    }

    @Override
    public void onSkipInProcess(Person item, Throwable t) {
        System.out.println("Item " + item + " was skipped due to: " + t.getMessage());
    }
}
然后,您可以在您的步骤中使用要在构造时将跳过的行写入其中的文件来配置侦听器。您还需要将FlatFileParseException声明为可跳过的异常。

希望这对您有帮助。

这篇关于Spring Batch保存拒绝文件中跳过的读卡器行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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