Spring Batch多次插入一次读取

时间:2017-02-09 17:09:30

标签: java spring-batch

我是一个Spring Batch流程,它从CSV读取报告对象并正确地将分析对象插入到MySQL数据库中,但是对于每个已报告的报告,逻辑已更改为多个Google Analytics插件。

我是Spring Batch的新手,实际过程对我来说非常困难,而且我不知道如何做这个改变。

我没有XML配置,所有都带有注释。报告和分析类有两个字段的getter和setter,adId和value。新逻辑有一个adId的七个值,我需要在表中插入七行。

我隐藏,删除或删除了一些无法解决问题的代码。

这是我的BatchConfiguration.java:

class BaseModel
{
        protected static $db_conn;

        protected static function &db()
        {
                if (empty(BaseModel::$db_conn))
                {
                        BaseModel::$db_conn = @new mysqli('localhost', 'user', 'password', 'db');
                        if (BaseModel::$db_conn->connect_error)
                        {
                                die('Connect Error: ' . BaseModel::$db_conn->connect_error);
                        }
         }
         return BaseModel::$db_conn;
       }
}

然后是AnalyticItemProcessor.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();
    }
}

过程:

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.
    }
}

我该怎么做这个改变?也许使用ItemPreparedStatementSetter或ItemSqlParameterSourceProvider?感谢。

1 个答案:

答案 0 :(得分:3)

如果我正确理解您的问题,您可以使用CompositeItemWriter包装多个JdbcBatchItemWriter实例(每个插件需要完成一个)。这将允许您为每个项目插入多行。否则,您需要编写自己的ItemWriter实现。