读取一个记录/项目并使用弹簧批次写入多个记录/项目

时间:2011-10-25 19:02:51

标签: spring-batch spring-integration

我做了一些搜索,但找不到任何样本/示例。

我需要读取和处理来自一个表(输入)的地理坐标,以生成与坐标相关联的POI。因此,一个地理坐标将导致需要将一个或多个POI插入另一个表(输出)。

我目前正在使用JdbcCursorItemReader和JdbcBatchItemWriter来读取一个项目/记录并写入一个项目/记录。还有一个ItemProcessor,用于为给定地理坐标生成POI。

自定义JdbcBatchItemWriter是否可以帮助我实现这一目标?

有什么想法吗? TIA。

3 个答案:

答案 0 :(得分:8)

您真正想要的是Splitter模式:

enter image description here

以下是Spring Integration中的定义方式:

Splitter是一种消息端点,其职责是接受来自其输入通道的消息,将该消息拆分为多个消息,然后将每个消息发送到其输出通道。这通常用于将“复合”有效负载对象划分为包含细分有效负载的一组消息。

配置非常简单:

 
<channel id="inputChannel"/>

<splitter id="splitter" 
  ref="splitterBean" 
  method="split" 
  input-channel="inputChannel" 
  output-channel="outputChannel" />

<channel id="outputChannel"/>

<beans:bean id="splitterBean" class="sample.PojoSplitter"/>

或者您可以使用注释:

 
@Splitter
List<LineItem> extractItems(Order order) {
    return order.getItems()
}

如果感觉更简单,您当然可以编写自己的JdbcBatchItemWriter。但是,Spring Integration已经为您完成了它。

您可以使用Spring Integration JDBC Support =&gt; jdbc:inbound-channel-adapter / jdbc:outbound-channel-adapter以及上面的拆分器,以实现您想要的和简单。

答案 1 :(得分:4)

如果您只想将项目分散到不同的作者(阅读重复输出),您可以使用现有的CompositeItemWriter

但我不确定您的处理器是否会生成不同的项目类型,或者您是否希望将一个复杂项目类型的内容传播给多个作者,对于这些情况,您可以使用略微更改的版本来{{3}问题

public class MultiOutputItemWriter implements ItemWriter<Object> {

private JdbcBatchItemWriter<ClassFoo> delegateFoo;
private JdbcBatchItemWriter<ClassBar> delegateBar;

public void write(List<? extends Object> items) throws Exception {
       // if you have different types of items
       // check Object Class
       // add to new List<Classfoo>
       // call delegate e.g. delegateFoo.write(List with ClassFoo);
       //
       // or if you have complex objects
       // same procedure as above, but with
       // add to new List<Classfoo> with item.getClassFoo
 }
}

如果您使用FlatFileItemWriter,请不要忘记multiline-record-writer(因此春季批次将为您打开/关闭它们)

答案 2 :(得分:0)

我通过扩展Writer类(在我的例子中是HibernateItemWriter)来做到这一点。我看到一个答案描述了如何使用&#39; splitter&#39;。如果有人有一个工作示例,说明如何在使用spring-boot-starter-parent的环境中工作,我很乐意看到它。对于我正在做的事情(从单个记录创建一个List),如果Spring提供了一个处理List of Lists的write方法,那将会容易得多。

以下是我如何扩展Writer以处理读取/处理的每​​一行的多次写入:Spring-Batch Multi-line record Item Writer with variable number of lines per record