我试图理解如何将spring批处理的概念应用到我们的用例中。
我们必须从数据库中读取数据,并从数据库中创建一个固定长度的平面文件。具体来说,数据库将类似于以下内容:
|---------| |---------|
| Person | 1----n | Address |
|---------| |---------|
1
|
n
|---------|
| Job |
|---------|输出文件将类似于以下内容:
PERSON1HEADER
PERSON1INFORMATION
ADDRESS1.1
ADRRESS1.2
JOB1.1
PERSON1FOOTER#OFADDRESS2#OFJOB1
PERSON2HEADER
PERSON2INFORMATION
ADDRESS2.1
JOB2.1
JOB2.2
PERSON2FOOTER#OFADDRESS1#OFJOB2我的第一个想法是创造一个开始“人”的工作。Person步骤随后将从DB加载所有信息,并为启动每个人员更多的步骤,例如地址和作业步骤。
这个想法是在我无法在JavaConfig中创建的步骤之间建立某种父级子连接。
当前的想法是创建一个定制的LineAggregator,它为每个人创建所有的行。我真的觉得有一个更干净的方法来做这件事。我目前方法的POC:
public class MyLineAggregator implements LineAggregator<Person> {
private Map<String, LineAggregator<Person>> aggregators;
@Override
public String aggregate(Person item) {
StringBuilder builder = new StringBuilder();
builder.append(aggregators.get("person").aggregate(item) + LINE_ENDING);
for(Address address : item.getAddress()) {
builder.append(aggregators.get("address").aggregate(address) + LINE_ENDING);
}
for(Job job : item.getJob()) {
builder.append(aggregators.get("job").aggregate(job) + LINE_ENDING);
}
return builder.toString();
}
public void setAggregators(Map<String, LineAggregator<Person>> aggregators) {
this.aggregators = aggregators;
}
}职务康菲:
@Bean
public FlatFileItemWriter<Person> itemWriter3(MyLineAggregator myLineAggregator) {
return new FlatFileItemWriterBuilder<Person>()
.name("flatfile")
.resource(new FileSystemResource("target/test-outputs/output.txt"))
.lineAggregator(myLineAggregator)
.build();
}
@Bean
public Step testStep(FlatFileItemWriter<Person> itemWriter3) {
RepositoryItemReader<Person> repoReader = new RepositoryItemReaderBuilder<Person>()
.repository(personRepo)
.sorts(Map.of("personId", Sort.Direction.ASC))
.saveState(false)
.methodName("findAll").build();
return stepBuilderFactory.get("testStep")
.<Person, Person>chunk(10)
.reader(repoReader)
.writer(itemWriter3)
.build();
}任何想法都将不胜感激。
https://stackoverflow.com/questions/53868071
复制相似问题