春季批处理中的ItemReader代码重复问题

时间:2019-07-07 18:39:05

标签: java spring spring-batch javabeans

假设我有两个按以下方式实现的类(为清楚起见,省略了作业和块代码)。每个阅读器将基于声明的配置类具有定界符。

1)很显然,我想将代码重复归纳到另一个类中,因为如果我决定在class * ItemReader()中添加代码,则必须在多个文件中进行重复。如何做到这一点?在这里,不仅“ delimiter” 很重要,而且itemReaderBuilder

中<>内部的类也很重要。

2)如何避免每个方法使用不同的名称?基本上是相同的,它们只需要在<>中使用不同的类和不同的定界符即可。

3)如何避免需要将读取器保存在配置类中以在运行时(使用Tasklet)按日期计算资源路径。

@Configuration
public ClassA{

    @Value("${fileA.delimiter}")
    private String delimiter;

    private ItemReader reader;

    @Bean
    public ItemReader classAItemReader(){

            reader =  FlatFileItemReaderBuilder<ObjectA>
                .get("reader")
                .delimiter(this.delimiter)                
                .blabla()
                .build()

            return reader
    }
}

@Configuration
public ClassB{

    @Value("${fileB.delimiter}")
    private String delimiter;

    private ItemReader reader;

    @Bean
    public ItemReader classBItemReader(){

            reader =  FlatFileItemReaderBuilder<ObjectA>
                .get("reader")
                .delimiter(this.delimiter)                
                .blabla()
                .build()

            return reader
    }
}

1 个答案:

答案 0 :(得分:1)

在您的用例中,我看到的一个选择是定义一个抽象的通用配置类,在其中定义一个通用读取器。这是一个示例:

import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.file.builder.FlatFileItemReaderBuilder;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;

public abstract class MyReaderConfiguration<T> {

    @Value("${file.delimiter}")
    private String delimiter;

    @Value("${file.columns}") // column1,column2
    private String fields;

    @Bean
    public ItemReader<T> itemReader(){
        return new FlatFileItemReaderBuilder<T>()
                .name("reader")
                .delimited()
                .delimiter(delimiter)
                .names(fields.split(","))
                .build();
    }

}

您的工作定义的其他部分可以放在具有所需目标类型(ObjectAObjectB)的子类中。

希望这会有所帮助。