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

use*_*505 12 spring-integration spring-batch

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

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

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

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

有任何想法吗?TIA.

tol*_*ius 10

你真正想要的是一个Splitter模式:

在此输入图像描述

以下是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"/>
Run Code Online (Sandbox Code Playgroud)

或者您可以使用注释:

@Splitter
List<LineItem> extractItems(Order order) {
    return order.getItems()
}
Run Code Online (Sandbox Code Playgroud)

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

您可以使用Spring Integration JDBC Support => jdbc:inbound-channel-adapter/ jdbc:outbound-channel-adapter和上面的拆分器来实现您想要的和简单.


Mic*_*low 6

如果您只想将项目分发给其他编写者(读取重复的输出),则可以使用现有的CompositeItemWriter

但是我不确定您的处理器是否会生成不同的项目类型,或者您是否想将一种复杂项目类型的内容分发给多个作者,在这种情况下,您可以对多行记录作者问题使用略有更改的版本

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
 }
}
Run Code Online (Sandbox Code Playgroud)

如果您使用FlatFileItemWriter,请不要忘记将委托注册为ItemStreams(因此spring batch将为您打开/关闭它们)