Ich habe eine Spring Batch-Prozess, der Bericht Objekte aus einer CSV lesen und analytische Objekte in eine MySQL-Datenbank korrekt einfügen, aber die logische für mehr als eine Analytics-Einsatz für jeden Bericht geändert hat gelesen.Spring Batch mehrere einfügen für eine gelesen
Ich bin neu in Spring Batch und der eigentliche Prozess war sehr schwierig für mich, und ich weiß nicht, wie man diese Änderung macht.
Ich habe keine XML-Konfiguration, alles ist mit Anmerkungen. Report- und Analytics-Klassen verfügen über einen Getter und einen Setter für zwei Felder, adId und value. Die neue Logik hat sieben Werte für eine adId und ich muss sieben Zeilen in die Tabelle einfügen.
Ich verstecken, löschen oder unterdrücken einige Code, die nicht für die Frage beitragen.
Hier ist meine 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();
}
}
Dann wird die 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.
}
}
Und der Prozess:
@SpringBootApplication
public class Process {
public static void main(String[] args) throws Exception {
SpringApplication.run(Process.class, args);
}
}
Wie kann ich diese Veränderung zu tun? Vielleicht mit ItemPreparedStatementSetter oder ItemSqlParameterSourceProvider? Vielen Dank.
Danke @Michael Minella, mit der ItemWriter-Implementierung war in Ordnung. Sehr wichtig ist "writer.afterPropertiesSet();" wie sagt Avis in http://stackoverflow.com/questions/32656581/pb-using-jdbcbatchitwriter-with-compositeitemwriter-in-java-code-spring-batch –
Wenn Sie jeden der Delegierten als eine Bohne konfigurieren, Sie don ' t müssen. Der Container wird es für Sie tun. –