Spring Batch中的Bill File Formatter项目

时间:2018-02-23 19:57:51

标签: java spring spring-batch batch-processing

这是我在StackOverflow中的第一个问题,所以我会尽力而为,希望得到一些答案。

我目前是应用程序开发团队的一员,我们收到一个带有标题和数据主体的平面文件,我们必须使用一些业务逻辑对其进行格式化,然后将其写入另一个平面文件,公司要求的具体格式。这将是客户的账单。

我想知道我应该采用哪种方式来设计这个设计。我正在考虑一个简单的Job,其中有一个步骤可以读取文件,并以不同的方式将标题和正文存储在不同的类中。项目处理器执行所有业务逻辑,项目编写者写下账单。我想使用监听器,验证,报告和日志记录,以及多线程/并行处理,以提高生产性能。

考虑到所有这些因素,您将如何面对这个项目?欢迎任何想法。

输入文件是这样的:

01.01.2017|SUBDCOBR|12:21:23|01/12/2016|31/12/2016
01.01.2017|12345678231234|0002342434|BORGIA RUBEN|27-32548987-9|FA|A|2062-
00010443/444/445|142,12|30/08/2017|142,01
01.01.2017|12345673201234|2342434|ALVAREZ ESTHER|27-32533987-9|FA|A|2062-
00010443/444/445|142,12|30/08/2017|142,02
01.01.2017|12345673201234|0002342434|LOPEZ LUCRECIA|27-32553387-9|FA|A|2062-
00010443/444/445|142,12|30/08/2017|142,12
01.01.2017|12345672301234|0002342434|SILVA JESUS|27-32558657-9|NC|A|2062-
00010443|142,12|30/08/2017|142,12

以下是我尝试的一些代码,CabeceraFacturacion是标题,DetalleFacturacion是正文。我试图为DetalleFacturacion创建一个读者并跳过第一行,稍后在skippedLineCallback中对其进行处理。但是,我不知道在handleLine()中写什么:

@Bean
public FlatFileItemReader<DetalleFacturacion> readerDetalleFacturacion(){

    FlatFileItemReader<DetalleFacturacion> reader = new FlatFileItemReader<>();

    reader.setLinesToSkip(1);
    reader.setResource(new ClassPathResource("inputFile.txt"));

    DefaultLineMapper<DetalleFacturacion> detalleLineMapper = new DefaultLineMapper<>();

    DelimitedLineTokenizer tokenizerDet = new DelimitedLineTokenizer("|"); 
    tokenizerDet.setNames(new String[] {"fechaEmision", "tipoDocumento", "letra", "nroComprobante",  
                                "nroCliente", "razonSocial", "cuit", "montoNetoGP", "montoNetoG3",
                                "montoExento", "impuestos", "montoTotal"});

    LineCallbackHandler skippedLineCallback = new LineCallbackHandler() {

        @Override
        public void handleLine(String line) {

            DefaultLineMapper<CabeceraFacturacion> cabeceraLineMapper = new DefaultLineMapper<>();
            DelimitedLineTokenizer tokenizerCab = new DelimitedLineTokenizer("|");
            // Maybe?? reader.setLineMapper(customLineMapper) or PatternMatchingCompositeLineMapper ??

        }
    };


    detalleLineMapper.setLineTokenizer(tokenizerDet);
    detalleLineMapper.setFieldSetMapper(new DetalleFieldSetMapper());
    detalleLineMapper.afterPropertiesSet();


    return reader;
}

@Bean
public Job jobFormateador() throws Exception {
        return jobBuilderFactory.get("jobFormateador")
                .incrementer(new RunIdIncrementer())
                .start(step1())
                .build();


}

@Bean
public Step step1() throws Exception {
    return stepBuilderFactory.get("step1")
            .<DetalleFacturacion, DetalleFacturacion> chunk(10)
            .reader(readerDetalleFacturacion())
            .writer(writerDetalleFact())
            .build();
}

如何只读取并验证标题并将其内容保存在CabeceraFacturacion类中,然后只读取并验证正文并将其内容保存在DetalleFacturacion类中?然后将这两个文件写入同一个文件,即账单本身。

谢谢大家!!

0 个答案:

没有答案