这是我在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类中?然后将这两个文件写入同一个文件,即账单本身。
谢谢大家!!