Весенняя партия: концепция детских шагов? - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь понять, как концепция пружинной партии может быть применена к нашему варианту использования.

Нам нужно будет считывать данные из базы данных и создавать из нее плоский файл фиксированной длины.В частности, база данных будет выглядеть примерно так:

|---------|        |---------|
|  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();
}

Любые идеи будут высоко оценены

1 Ответ

0 голосов
/ 20 декабря 2018

Ваш PoC выглядит хорошо для меня, и я не думаю, что вам действительно нужно создавать отношения между родителями и детьми между шагами.Самое близкое, что вы можете получить, если вы хотите сделать это, это использовать FlowStep .

Поскольку ваш RepositoryItemReader уже захватывает людей с их адресами и заданиями, нет необходимости делать дополнительныезапрашивает сведения о каждом человеке (адреса и вакансии), как если бы вы использовали шаблон .То же самое для агрегатора строк, я бы реализовал его таким же образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...