2017-02-09 3 views
0

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.

Antwort

3

Wenn ich Ihre Frage richtig verstehe, können Sie die CompositeItemWriter verwenden, um mehrere JdbcBatchItemWriter Instanzen (eine pro Einsatz, die Sie erreichen müssen) zu umhüllen. Dadurch können Sie mehrere Zeilen pro Element einfügen. Andernfalls müssten Sie Ihre eigene ItemWriter Implementierung schreiben.

+0

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 –

+0

Wenn Sie jeden der Delegierten als eine Bohne konfigurieren, Sie don ' t müssen. Der Container wird es für Sie tun. –

Verwandte Themen