首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >弹簧批次:子步的概念?

弹簧批次:子步的概念?
EN

Stack Overflow用户
提问于 2018-12-20 11:46:13
回答 1查看 155关注 0票数 0

我试图理解如何将spring批处理的概念应用到我们的用例中。

我们必须从数据库中读取数据,并从数据库中创建一个固定长度的平面文件。具体来说,数据库将类似于以下内容:

代码语言:javascript
复制
|---------|        |---------|
|  Person | 1----n | Address |
|---------|        |---------|
     1
     |
     n
|---------|
|   Job   |
|---------|

输出文件将类似于以下内容:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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;
    }
}

职务康菲:

代码语言:javascript
复制
@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();
}

任何想法都将不胜感激。

EN

回答 1

Stack Overflow用户

发布于 2018-12-20 12:08:43

您的PoC在我看来不错,我不认为您真的需要在步骤之间创建父/子关系。如果你想这么做的话,你能得到的最接近的是使用一个FlowStep

由于您的RepositoryItemReader已经抓取了具有其地址和工作的人员,因此不需要像使用驱动查询模式那样对每个人的详细信息(地址和作业)执行额外的查询。对于行聚合器来说,我也会以同样的方式实现它。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53868071

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档