我做了一些搜索,但找不到任何样本/示例。
我需要读取和处理来自一个表(输入)的地理坐标,以生成与坐标相关联的POI。因此,一个地理坐标将导致需要将一个或多个POI插入另一个表(输出)。
我目前正在使用JdbcCursorItemReader和JdbcBatchItemWriter来读取一个项目/记录并写入一个项目/记录。还有一个ItemProcessor,用于为给定地理坐标生成POI。
自定义JdbcBatchItemWriter是否可以帮助我实现这一目标?
有什么想法吗? TIA。
答案 0 :(得分:8)
您真正想要的是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"/>
或者您可以使用注释:
@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