繁体   English   中英

spring 批量自定义 jdbc itemreader

[英]spring batch custom jdbc itemreader

我想创建一个自定义 jdbc itemreader 我找到了这个解决方案

import org.springframework.batch.item.ItemReader;
import org.springframework.batch.item.database.JdbcCursorItemReader;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.BeanPropertyRowMapper;

import javax.sql.DataSource;

@Configuration
public class DatabaseToXmlFileJobConfig {

private static final String QUERY_FIND_STUDENTS =
        "SELECT " +
            "email_address, " +
            "name, " +
            "purchased_package " +
        "FROM STUDENTS " +
        "ORDER BY email_address ASC";

@Bean
ItemReader<StudentDTO> databaseXmlItemReader(DataSource dataSource) {
    JdbcCursorItemReader<StudentDTO> databaseReader = new 
JdbcCursorItemReader<>();

    databaseReader.setDataSource(dataSource);
    databaseReader.setSql(QUERY_FIND_STUDENTS);
    databaseReader.setRowMapper(new BeanPropertyRowMapper<>
(StudentDTO.class));

    return databaseReader;
}
}

但我不知道如何使用它来创建我自己的 ItemReader ? 无论如何要在这两个类之间建立联系吗? 或者无论如何创建一个自定义的JDBC阅读器?

public class DatabaseReader implements ItemReader<StudentDTO> {

@Override
public StudentDTO read() throws Exception, UnexpectedInputException, 
ParseException, NonTransientResourceException {

    return null;
}

}

在 Spring 批处理中,一个步骤有 3 个核心元素

  1. 读者
  2. 处理器(可选)
  3. 作家

Spring Batch 已经为最常见的情况提供了一组reader 和 writer ,如果你没有特殊场景,你可以直接使用它们

从我在你的问题中看到的,你可以按原样使用它。

工作

    @Bean
    public Job jobTest(){
        JobParametersBuilder parametersBuilder = new JobParametersBuilder();
        Instant timestamp =LocalDateTime.now().atZone(ZoneId.systemDefault()).toInstant();

        return jobBuilder.get("myJobName")
                .next(StudentsReport())
                .next(sendReportByEmail())
                .incrementer( jobParameters -> parametersBuilder.addJobParameters(jobParameters)
                                                                .addDate("timeStamp"
                                                                        , Date.from( timestamp)
                                                                 ).toJobParameters()
                )
                .build();
    }

步骤定义

    @Bean
    public Step studentsReport(){
        return stepBuilder.get("getStudentsThatSomething")
                .<User,User>chunk(100)
                .reader(studentsJdbcReader())
                .writer(studentsXMLWriter())
                .build();
    }

JDBC 读取器 Bean

@Autowired
DataSource dataSource;

private static final String QUERY_FIND_STUDENTS =
        "SELECT " +
            "email_address, " +
            "name, " +
            "purchased_package " +
        "FROM STUDENTS " +
        "ORDER BY email_address ASC";

@Bean
@StepScope
JdbcCursorItemReader<StudentDTO> studentsJdbcReader() {
    JdbcCursorItemReader<StudentDTO> databaseReader = new 
JdbcCursorItemReader<>();

    databaseReader.setDataSource(dataSource);
    databaseReader.setSql(QUERY_FIND_STUDENTS);
    databaseReader.setRowMapper(new BeanPropertyRowMapper<>
(StudentDTO.class));

    return databaseReader;
}

作家豆

    @Bean
    @StepScope
    public ItemWriter<StudentDTO> studentFlatWriter(){
        return new StudentXmlWriter(OUTPUT_FILE);
    }

要创建自定义 XML 编写器类,您可以查看 Alexey Saenko 在他的Spring Batch 教程中提供的示例,实际上本教程将为您了解 Spring Batch 打下良好的基础。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM