java - Spring Batch中的ItemReader代码重复问题

标签 java spring spring-batch javabeans

假设我有两个类以以下方式实现(为了清楚起见,省略作业和 block 代码)。每个读取器都会有一个基于它们声明的配置类的分隔符。

1) 显然,我希望在另一个类中推广代码重复,因为如果我决定在 class*ItemReader() 中添加代码,我将不得不在多个文件中执行此操作。如何才能做到这一点呢?这里不仅“分隔符”很重要,而且 itemReaderBuilder 中 <> 内的类也很重要

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

3)如何避免将读取器保存在配置类中以在运行时(使用微线程)计算基于日期的资源路径。

@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
    }
}

最佳答案

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

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)的子类中。

关于java - Spring Batch中的ItemReader代码重复问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56925057/

相关文章:

java - 使用 JDBC Store 使用 Tomcat 和 PersistentManager 时 session 被过早地从数据库中删除

java - 剪辑区域以在动画期间隐藏 JWindow

java - Dozer 映射忽略 Hibernate 延迟加载 - Spring

java - 覆盖 spring batch admin 以使用 mysql 数据库

java - 是否可以在 wifi 网络中设置域名?

Java Spring @Value 注解和参数

java - 卡在 springcontext.xml 中

spring - 嵌套的异常是java.lang.NoClassDefFoundError : org/hibernate/ejb/HibernatePersistence

java - 自定义 Spring Batch 应用程序中步骤的参数

java - 在 ItemReader/Processor/Writer 中访问 StepExecution/JobExecution 的最佳方式