我正在做一个 Spring Batch 项目,其中我必须读取和修改几个 TXT 文件并将它们写入 JSON 格式的新文件中。我为每个文件创建了我的步骤,它们是一个接一个地编写的。然而,最后两个有一个链接、城市和历史文件。有些城市是有历史的,而每个城市如果有一个历史与它的邮政编码相同,那么它的历史就按照这个来重写。我有点卡住了,我不知道是否应该为每个步骤重写一个步骤,或者是否应该在同一步骤中执行这两个步骤。目前,我有这个:
@Bean
public Job runjob(JobRepository jobRepository, PlatformTransactionManager txManager) throws Exception{
return new JobBuilder("runJob", jobRepository)
.start(stepCountry(jobRepository,txManager))
.next(stepRegion(jobRepository,txManager))
.next(stepDepartment(jobRepository,txManager))
.next(stepCity(jobRepository,txManager))
.next(stepHistorique(jobRepository,txManager))
.build();
}
目前,我所有的
@Bean
都在一个类配置中
@Bean
public Step stepCity(JobRepository jobRepository, PlatformTransactionManager txManager)throws Exception{
return new StepBuilder("stepCity")
.repository(jobRepository)
.<City, City>chunk(25)
.reader(readerCity())
.processor(processorCity())
.writer(writerCity())
.transactionManager(txManager)
.build();
}
@Bean
public Step stepHistorique(JobRepository jobRepository, PlatformTransactionManager txManager)throws Exception{
return new StepBuilder("stepHistorique")
.repository(jobRepository)
.<Historique, Historique>chunk(25)
.reader(readerHistorique())
.processor(processorHistorique())
.writer(writerHistorique())
.transactionManager(txManager)
.build();
}
我没有放置与我的处理器和其他文件有关的内容,因为它对于我当前想做的事情并不重要
@Bean
public ItemReader<City> readerCity() throws Exception{
FlatFileItemReader<City> readerCity = new FlatFileItemReader<City>();
readerCity.setLineMapper(new DefaultLineMapper() {{
setLineTokenizer(new DelimitedLineTokenizer() {{
setNames(new String[]{"typecom","com","reg","dep","arr","tncc","ncc","nccenr","libelle","can","comparent"});
}});
setFieldSetMapper(new BeanWrapperFieldSetMapper<City>() {{
setTargetType(City.class);
}});
}});
readerCity.setResource(new ClassPathResource("documents/Cities.txt"));
return readerCity;
}
@Bean
public ItemReader readerHistorique() throws Exception{
FlatFileItemReader readerHistorique = new FlatFileItemReader();
readerHistorique.setLineMapper(new DefaultLineMapper() {{
setLineTokenizer(new DelimitedLineTokenizer() {{
setNames(new String[]{"mod","date_eff","typecom_av","com_av","tncc_av","ncc_av","nccenr_av","libelle_av","typecom_ap","com_ap"
,"tncc_ap","ncc_ap","nccenr_ap", "libelle_ap"});
}});
setFieldSetMapper(new BeanWrapperFieldSetMapper() {{
setTargetType(Historique.class);
}});
}});
readerHistorique.setResource(new ClassPathResource("documents/HistoriqueCities.txt"));
System.out.println(readerHistorique);
return readerHistorique;
}
我认为每个人都有必要拥有一个
ItemReader
@Bean
public ItemWriter<City> writerCity() {
JsonFileItemWriter<City> writerCity = new JsonFileItemWriter<>(
new FileSystemResource("src/main/java/output/Insee.json"),
new JsonObjectMarshaller<City>() {
@Override
public String marshal(City object) {
try {
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.INDENT_OUTPUT, true);
return mapper.writeValueAsString(object);
} catch (JsonProcessingException e) {
e.printStackTrace();
return null;
}
}
}) {
@Override
public void open(ExecutionContext executionContext)
throws ItemStreamException {
super.open(executionContext);
try {
getOutputState().write(",{Cities: }[");
}
catch(IOException e) {
throw new RuntimeException(e);
}
}
};
writerCity.setResource(new FileSystemResource("src/main/java/output/Insee.json"));
writerCity.setAppendAllowed(true);
writerCity.setJsonObjectMarshaller(new JsonObjectMarshaller<City>() {
@Override
public String marshal(City item) {
Map<String, Object> map = new LinkedHashMap<>();
map.put("status", item.getTypecom());
map.put("insee", item.getCom());
map.put("parent", item.getComparent());
map.put("country", item.getCountry());
map.put("dept", item.getDep());
return map.toString();
}
});
return writerCity;
}
@Bean
public ItemWriter<Historique> writerHistorique() {
JsonFileItemWriter<Historique> writerHistorique = new JsonFileItemWriter<>(
new FileSystemResource("src/main/java/output/Insee.json"),
new JsonObjectMarshaller<Historique>() {
@Override
public String marshal(Historique object) {
try {
ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationFeature.INDENT_OUTPUT, true);
return mapper.writeValueAsString(object);
} catch (JsonProcessingException e) {
e.printStackTrace();
return null;
}
}
}) {
@Override
public void open(ExecutionContext executionContext)
throws ItemStreamException {
super.open(executionContext);
try {
getOutputState().write(",{Historique: } [");
}
catch(IOException e) {
throw new RuntimeException(e);
}
}
};
writerHistorique.setResource(new FileSystemResource("src/main/java/output/Insee.json"));
writerHistorique.setAppendAllowed(true);
writerHistorique.setJsonObjectMarshaller(new JsonObjectMarshaller<Historique>() {
@Override
public String marshal(Historique item) {
Map<String, Object> map = new LinkedHashMap<>();
map.put("parent", item.getParent());
map.put("typecom_av", item.getTypecom_av());
map.put("mod", item.getMod());
map.put("nccenr_av", item.getLibelle_av());
map.put("nccenr_av", item.getLibelle_ap());
map.put("date_eff", item.getDate_eff());
return map.toString();
}
});
return writerHistorique;
}
我不知道他们是否应该每个人都有自己的
ItemWriter
,或者我是否应该将它们写在一个中。城市和历史各有其阶级
您是否尝试实现自己的 ItemReader 将这两个文件获取到您需要写入的记录?