spring batch 3 ItemReader считывает данные CSV-файла только один раз

#java #spring-batch

#java #spring-batch

Вопрос:

Привет, я новичок в Spring Batch, и я перешел по этой ссылке, чтобы запустить пример программы.

Я хотел вставить большой объем данных CSV-файла в базу данных MySQL, и на примере я могу выполнить его нормально с ограниченным количеством строк CSV-данных.

Но когда я вставил большее количество строк в CSV-файл и выполнил пакетную программу, он не вставлял никаких данных, другими словами, он не читал сам файл и даже не показывал никаких ошибок / исключений. Я думаю, мне нужно настроить ItemReader чтение более одного раза.

Ниже приведена пакетная конфигурация.код java

  @Configuration
@EnableBatchProcessing
public class BatchConfiguration {

    @Bean
    public ItemReader<Student> reader() {
        FlatFileItemReader<Student> reader = new FlatFileItemReader<Student>();
        reader.setResource(new ClassPathResource("student-data.csv"));
        reader.setLineMapper(new DefaultLineMapper<Student>() {{
            setLineTokenizer(new DelimitedLineTokenizer() {{
                setNames(new String[] {"stdId", "subMarkOne", "subMarkTwo" });
            }});
            setFieldSetMapper(new BeanWrapperFieldSetMapper<Student>() {{
                setTargetType(Student.class);
            }});
        }});
        return reader;
    }


    @Bean
    public ItemWriter<Marksheet> writer(DataSource dataSource) {
        JdbcBatchItemWriter<Marksheet> writer = new JdbcBatchItemWriter<Marksheet>();
        writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<Marksheet>());
        writer.setSql("INSERT INTO marksheet (studentId,totalMark) VALUES (:stdId,:totalSubMark)");
        writer.setDataSource(dataSource);
        return writer;
    }

    @Bean
    public ItemProcessor<Student, Marksheet> processor() {
        return new StudentItemProcessor();
    }

    @Bean
    public Job createMarkSheet(JobBuilderFactory jobs, Step step) {
        return jobs.get("createMarkSheet")
                .flow(step)
                .end()
                .build();
    }

    @Bean
    public Step step(StepBuilderFactory stepBuilderFactory, ItemReader<Student> reader,
            ItemWriter<Marksheet> writer, ItemProcessor<Student, Marksheet> processor) {
        return stepBuilderFactory.get("step")
                .<Student, Marksheet> chunk(5)
                .reader(reader)
                .processor(processor)
                .writer(writer)
                .build();
    }

    @Bean
    public JdbcTemplate jdbcTemplate(DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

    @Bean
    public DataSource getDataSource() {
        BasicDataSource dataSource = new BasicDataSource();
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/concretepage");
        dataSource.setUsername("root");
        dataSource.setPassword("root123");
        return dataSource;
    }
 

основной класс для запуска

 @ComponentScan
@EnableAutoConfiguration
public class Main {
    public static void main(String[] args) {
        ApplicationContext ctx = SpringApplication.run(Main.class, args);
        List<Marksheet> result = ctx.getBean(JdbcTemplate.class).query("select studentId,totalMark FROM marksheet", 
                new RowMapper<Marksheet>() {
            @Override
            public Marksheet mapRow(ResultSet rs, int row) throws SQLException {
                return new Marksheet(rs.getString(1), Integer.parseInt(rs.getString(2)));
            }
        });
        System.out.println("Number of Record:" result.size());
    }
}
 

класс процесса

 public class StudentItemProcessor implements ItemProcessor<Student, Marksheet> {

    @Override
    public Marksheet process(final Student student) throws Exception {
        int totalMark = student.getSubMarkOne() student.getSubMarkTwo();
        System.out.println("student id:" student.getStdId()  " and Total mark:"  totalMark);
        Marksheet marksheet = new Marksheet(student.getStdId(), totalMark);
        return marksheet;
    }

}
 

Любая помощь будет оценена. Спасибо.

Комментарии:

1. Не уверен, как это может работать даже с файлом меньшего размера, поскольку вы нигде не вызываете Spring Batch в своем основном методе..

2. @EnableAutoConfiguration сообщает Spring Boot начать добавление компонентов на основе параметров classpath, других компонентов и различных настроек свойств

3. Сколько строк вы имели в виду под ограниченным количеством строк и сколько для большего количества строк ? Не кажется логичным, что reader будет работать с несколькими записями и не будет работать еще с несколькими записями, если только он не застрянет где-нибудь при чтении большого файла и не завершится.

4. Давайте рассмотрим, что в файле CSV есть 6 строк данных, и я запущу программу Spring Batch, чтобы вставить ее в базу данных, она работает нормально, после чего процесс остановится. После этого, если я изменю файл CSV, добавив дополнительные данные, и захочу отразить те же данные в базе данных, используя strong Batch, тогда он не читает измененный CSV. Если я загляну в журналы, он скажет, что файл CSV прочитан раньше, и никаких изменений нет!