我是一个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?感谢。
答案 0 :(得分:3)
如果我正确理解您的问题,您可以使用CompositeItemWriter
包装多个JdbcBatchItemWriter
实例(每个插件需要完成一个)。这将允许您为每个项目插入多行。否则,您需要编写自己的ItemWriter
实现。