首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在没有xml的情况下使用具有不同数据、具有两个JdbcBatchItemWritter和JdbcBatchItemWritter配置的Spring批处理

如何在没有xml的情况下使用具有不同数据、具有两个JdbcBatchItemWritter和JdbcBatchItemWritter配置的Spring批处理
EN

Stack Overflow用户
提问于 2018-11-24 16:59:53
回答 1查看 10.2K关注 0票数 6

下面是将在作业中初始化的步骤代码。

代码语言:javascript
复制
@Bean
public Step stepOne() {
    return stepBuilderFactory.get("stepOne")
            .<EmployeeDTO, EmployeeDTO> chunk(1)
            .reader(readerOne())
            .processor(processorOne())
            .writer(compositeWriter())
            .build();
}

下面是用于写入数据的复合作者。

代码语言:javascript
复制
@Bean
public CompositeItemWriter<EmployeeDTO> compositeWriter(){

    return new CompositeWriter();
}

public class CompositeWriter extends CompositeItemWriter<EmployeeDTO> {

   @Autowired
   private DataSource dataSource;

   List<EmployeeDTO> insert;
   List<EmployeeDTO> update;

   @Override
   public void write(List<? extends EmployeeDTO> arg0) throws Exception {
       CompositeItemWriter<EmployeeDTO> compositeItemWriter = new CompositeItemWriter<>();
       compositeItemWriter.setDelegates(Arrays.asList(insertW(),updateW()));
   }

   private JdbcBatchItemWriter<EmployeeDTO> insertW() throws Exception{
       JdbcBatchItemWriter<EmployeeDTO> batchItemWriter = new JdbcBatchItemWriter<>();
       batchItemWriter.setDataSource(dataSource);
       batchItemWriter.setSql("");
       batchItemWriter.write(insert);
       return batchItemWriter;
   }

   private JdbcBatchItemWriter<EmployeeDTO> updateW() throws Exception{
       JdbcBatchItemWriter<EmployeeDTO> batchItemWriter = new JdbcBatchItemWriter<>();
       batchItemWriter.setDataSource(dataSource);
       batchItemWriter.setSql("");
       batchItemWriter.write(update);
       return batchItemWriter;
   }
}
EN

回答 1

Stack Overflow用户

发布于 2018-11-26 08:08:07

您的配置有几个问题:

  • 您不需要在编写器上调用write方法(batchItemWriter.write(insert)batchItemWriter.write(update)),Spring将执行此操作。
  • 没有必要对CompositeItemWriter进行子类化。您可以在其中创建一个注册委托编写器的实例。
  • 需要在步骤中将委托写入器注册为流。

下面是如何处理您的情况:

1.定义委托编写者

代码语言:javascript
复制
@Bean
public JdbcBatchItemWriter<EmployeeDTO> insertW() throws Exception{
   JdbcBatchItemWriter<EmployeeDTO> batchItemWriter = new JdbcBatchItemWriter<>();
   batchItemWriter.setDataSource(dataSource);
   batchItemWriter.setSql("");
   return batchItemWriter;
}

@Bean
public JdbcBatchItemWriter<EmployeeDTO> updateW() throws Exception{
   JdbcBatchItemWriter<EmployeeDTO> batchItemWriter = new JdbcBatchItemWriter<>();
   batchItemWriter.setDataSource(dataSource);
   batchItemWriter.setSql("");
   return batchItemWriter;
}

2.在CompositeItemWriter中注册委托

代码语言:javascript
复制
@Bean
public CompositeItemWriter<EmployeeDTO> compositeItemWriter() {
    CompositeItemWriter<EmployeeDTO> compositeItemWriter = new CompositeItemWriter<>();
    compositeItemWriter.setDelegates(Arrays.asList(insertW(), updateW()));
    return compositeItemWriter;
}

3.在步骤中将委托注册为流(如果它们实现了ItemSteam)

代码语言:javascript
复制
@Bean
public Step stepOne() {
    return stepBuilderFactory.get("stepOne")
            .<EmployeeDTO, EmployeeDTO> chunk(1)
            .reader(readerOne())
            .processor(processorOne())
            .writer(compositeItemWriter())
            .stream(insertW())
            .stream(updateW())
            .build();
}

希望这能有所帮助。

票数 12
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53460435

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档