#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 прочитан раньше, и никаких изменений нет!