2013-03-11 45 views
1

我遇到以下问题:我有一个文件,其中的每行都会导致一个或多个项目写入数据库。我需要从另一个系统进行查找,以确定需要写入多少项目。每条产生于单一行的项目必须使用项目处理器链进行转换,最后写入数据库中的多个表格。Spring批次项目拆分器

因为每个项目都需要写入多个表格,所以每个项目都必须在自己的事务中。正因为如此,我不能只有一个ItemProcessor<Foo, List<Bar>>来处理它。在这种情况下 - 即使在commit-interval为1的情况下 - 我最终会在同一交易中获得多个项目。

我已经看过this堆栈溢出问题了。由于交易问题,接受的答案对我没有帮助。关于使用Spring集成分离器的其他答案听起来很有趣。但是,它并没有给出很多细节。如何将读卡器的输出定义为通道输入?我将如何定义一个输出频道到我的项目作家?我怎么还能在每个新分割的物品上运行物品处理器链?

我一直无法在spring批处理作业中使用分隔符找到任何示例。任何建议,将不胜感激。

+0

为什么你不使用ClassifierCompositeItemWriter http://static.springsource.org/spring-batch/apidocs/org/springframework/batch/item/support/ClassifierCompositeItemWriter.html – 2013-03-12 11:21:51

+0

@SerkanArıkuşu这里没有什么需要分类。一切都会发生在同一个作家身上。我相信一个复合项目编写器用于让某些项目根据分类器转到某个项目编写者。如果我错过了什么,请告诉我。 – 2013-03-13 13:27:02

+0

你有没有在这方面找到解决方案?我确实有完全相同的情况。 – Marseld 2017-03-22 00:00:19

回答

0

与FlatFileItemReader相同的问题,虽然减去交易问题。 解决这一问题的那样:

public class FlatFileItemListWriter<T> extends FlatFileItemWriter<T> { 

    /** 
    * {@inheritDoc} 
    * 
    * @see org.springframework.batch.item.file.FlatFileItemWriter#write(java.util.List) 
    */ 
    @Override 
    @SuppressWarnings("unchecked") 
    public void write(List<? extends T> itemsLists) throws Exception { 
     List<T> items = new ArrayList<T>(); 
     for (Object item : itemsLists) { 
      items.addAll((List<T>) item); 
     } 
     super.write(items); 
    } 

} 

这样一来,FlatFileItemWriter涉及的名单,如果我的处理器没有产生列出那就得的方式。