Я пытаюсь понять, как концепция пружинной партии может быть применена к нашему варианту использования.
Нам нужно будет считывать данные из базы данных и создавать из нее плоский файл фиксированной длины.В частности, база данных будет выглядеть примерно так:
|---------| |---------|
| 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 будет загружать всю информацию из БД и запускаться для каждого человеко-шагов, например шагов адреса и задания.
Идея состоит в том, чтобы между шагами было какое-то родительское дочернее соединениекоторую я не смог создать в своем 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;
}
}
Job Config:
@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();
}
Любые идеи будут высоко оценены