Spring Batch 自定义ItemReader

Spring Batch 自定义ItemReader

Spring Batch支持各种数据输入源,如文件、数据库等。然而有时也会遇到一些默认不支持的数据源,这时我们则需要实现自己的数据源————自定义ItemReader。本文通过示例说明如何自定义ItemReader。

创建自定义ItemReader

创建自定义ItemReader需要下面两个步骤:

  1. 创建一个实现ItemReader接口的类,并提供返回对象类型 T 作为类型参数。
  2. 按照下面规则实现ItemReader接口的T read()方法
    read()方法如果存在下一个对象则返回,否则返回null。

下面我们自定义ItemReader,其返回在线测试课程的学生信息StuDto类型,为了减少复杂性,该数据存储在内存中。StuDto类是一个简单数据传输对象,代码如下:

@Data
public class StuDTO {
    private String emailAddress;
    private String name;
    private String purchasedPackage;
}

下面参照一下步骤创建ItemReader:

  1. 创建InMemoryStudentReader 类
  2. 实现ItemReader接口,并设置返回对象类型为StuDto
  3. 类中增加List studentData 字段,其包括参加课程的学生信息
  4. 类中增加nextStudentIndex 字段,表示下一个StuDto对象的索引
  5. 增加私有initialize()方法,初始化学生信息并设置索引值为0
  6. 创建构造函数并调用initialize方法
  7. 实现read()方法,包括下面规则:
    如果存在下一个学生,则返回StuDto对象并把索引加一。否则返回null。

InMemoryStudentReader 代码如下:

public class InMemoryStudentReader implements ItemReader {
 
    private int nextStudentIndex;
    private List studentData;
 
    InMemoryStudentReader() {
        initialize();
    }
 
    private void initialize() {
        StuDto tony = new StuDto();
        tony.setEmailAddress("[email protected]");
        tony.setName("Tony Tester");
        tony.setPurchasedPackage("master");
 
        StuDto nick = new StuDto();
        nick.setEmailAddress("[email protected]");
        nick.setName("Nick Newbie");
        nick.setPurchasedPackage("starter");
 
        StuDto ian = new StuDto();
        ian.setEmailAddress("[email protected]");
        ian.setName("Ian Intermediate");
        ian.setPurchasedPackage("intermediate");
 
        studentData = Collections.unmodifiableList(Arrays.asList(tony, nick, ian));
        nextStudentIndex = 0;
    }
 
    @Override
    public StuDto read() throws Exception {
        StuDto nextStudent = null;
 
        if (nextStudentIndex < studentData.size()) {
            nextStudent = studentData.get(nextStudentIndex);
            nextStudentIndex++;
        }
 
        return nextStudent;
    }
}

创建好自定义ItemReader后,需要配置其作为bean让Spring Batch Job使用。下面请看如何配置。

配置ItemReader Bean

配置类代码如下:

@Configuration
public class InMemoryStudentJobConfig {
 
    @Bean
    ItemReader inMemoryStudentReader() {
        return new InMemoryStudentReader();
    }
}

需要增加@Configuration表明类为配置类, 增加方法返回ItemReader类型,并增加@Bean注解,实现方法内容————返回InMemoryStudentReader对象。

总结

本文通过示例说明如何自定义ItemReader,主要包括三个方面:

  • 自定义ItemReader需实现ItemReader接口
  • 实现ItemReader接口,需要指定返回类型作为类型参数(T)
  • 实现接口方法read,如果存在下一个对象则返回,反之返回null

你可能感兴趣的:(spring,batch)