У меня есть пакетный процесс Spring, который читает объекты Report из CSV и правильно вставляет аналитические объекты в базу данных MySQL, но логический изменился для более чем одной вставки Analytics для каждого отчета прочитанные.Spring Batch множественная вставка для одного чтения
Я новичок в Spring Batch, и на самом деле процесс был очень трудным для меня, и я не знаю, как это сделать.
У меня нет конфигурации XML, все с аннотациями. В классах Report and Analytics есть геттер и сеттер для двух полей, adId и value. Новая логика имеет семь значений для adId, и мне нужно вставить семь строк в таблицу.
Скрыть, удалить или прервать некоторый код, который не внесет свой вклад в вопрос.
Вот мой BatchConfiguration.java:
@Configuration
@EnableBatchProcessingpublic
class BatchConfiguration {
@Autowired
private transient JobBuilderFactory jobBuilderFactory;
@Autowired
private transient StepBuilderFactory stepBuilderFactory;
@Autowired
private transient DataSource dataSource;
public FlatFileItemReader<Report> reader() {
// The reader from the CSV works fine.
}
@Bean
public JdbcBatchItemWriter<Analytic> writer() {
final JdbcBatchItemWriter<Analytic> writer = new JdbcBatchItemWriter<Analytic>();
writer.setItemSqlParameterSourceProvider(new BeanPropertyItemSqlParameterSourceProvider<Analytic>());
writer.setSql("INSERT INTO TABLE (ad_id, value) VALUES (:adId, :value)");
writer.setDataSource(dataSource);
return writer;
}
@Bean
public AnalyticItemProcessor processor() {
return new AnalyticItemProcessor();
}
@Bean
public Step step() {
return stepBuilderFactory.get("step1").<Report, Analytic> chunk(10000).reader(reader()).processor(processor()).writer(writer()).build();
}
@Bean
public Job process() {
final JobBuilder jobBuilder = jobBuilderFactory.get("process");
return jobBuilder.start(step()).build();
}
}
Тогда AnalyticItemProcessor.java
public class AnalyticItemProcessor implements ItemProcessor<Report, Analytic> {
@Override
public Analytic process(final Report report) {
// Creates a new Analytic call BeanUtils.copyProperties(report, analytic) and returns analytic.
}
}
И процесс:
@SpringBootApplication
public class Process {
public static void main(String[] args) throws Exception {
SpringApplication.run(Process.class, args);
}
}
Как я могу сделать это изменение? Может быть, с ItemPreparedStatementSetter или ItemSqlParameterSourceProvider? Благодарю.
Спасибо @Michael Minella, с реализацией ItemWriter было в порядке. Очень важным является «writer.afterPropertiesSet()»; как говорит Avis в http://stackoverflow.com/questions/32656581/pb-using-jdbcbatchitemwriter-with-compositeitemwriter-in-java-code-spring-batch –
Если вы настроите каждого из делегатов как bean-компонент, нужно. Контейнер сделает это за вас. –