2017-02-09 5 views
0

У меня есть пакетный процесс 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? Благодарю.

ответ

3

Если я правильно понимаю ваш вопрос, вы можете использовать CompositeItemWriter для обертывания нескольких экземпляров JdbcBatchItemWriter (по одному для каждой вставки, которую вы должны выполнить). Это позволит вам вставлять несколько строк на элемент. В противном случае вам нужно будет написать свою собственную реализацию ItemWriter.

+0

Спасибо @Michael Minella, с реализацией ItemWriter было в порядке. Очень важным является «writer.afterPropertiesSet()»; как говорит Avis в http://stackoverflow.com/questions/32656581/pb-using-jdbcbatchitemwriter-with-compositeitemwriter-in-java-code-spring-batch –

+0

Если вы настроите каждого из делегатов как bean-компонент, нужно. Контейнер сделает это за вас. –

Смежные вопросы