Spring batch 使用spring批处理读取一条记录/项并写入多条记录/项

Spring batch 使用spring批处理读取一条记录/项并写入多条记录/项,spring-batch,spring-integration,Spring Batch,Spring Integration,我做了一些搜索,但没有找到任何样本/示例 我有一个要求,从一个表(输入)中读取地理坐标,并对其进行处理,以生成与坐标关联的POI。因此,一个地理坐标将导致一个或多个POI需要插入另一个表(输出) 我目前正在使用JdbcCursorItemReader和JdbcBatchItemWriter来读取一个项/记录并写入一个项/记录。还有一个ItemProcessor为给定的地理坐标生成POI 自定义JdbcBatchItemWriter是否可以帮助我实现这一点 有什么想法吗?TIA。如果您只想将项目分

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

我有一个要求,从一个表(输入)中读取地理坐标,并对其进行处理,以生成与坐标关联的POI。因此,一个地理坐标将导致一个或多个POI需要插入另一个表(输出)

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

自定义JdbcBatchItemWriter是否可以帮助我实现这一点


有什么想法吗?TIA。

如果您只想将项目分散到不同的写入程序(读取重复输出),可以使用现有的

但我不确定你的处理器是否会产生不同的项目类型,或者你是否想将一个复杂项目类型的内容传播给多个作者,在这些情况下,你可以使用稍微更改的版本来回答问题

公共类MultiOutputItemWriter实现ItemWriter{
私有JdbcBatchItemWriter delegateFoo;
私有JdbcBatchItemWriter授权栏;

public void write(List您真正寻找的是一种模式:

以下是在中如何定义它:

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

配置非常简单:


也可以使用注释:

@Splitter
列出项目(订单){
退货订单。getItems()
}
如果感觉简单的话,您当然可以编写自己的
JdbcBatchItemWriter
,但是Spring集成已经为您做了


您可以使用=>
jdbc:inbound channel adapter
/
jdbc:outbound channel adapter
和上面的拆分器来实现您想要的功能和..简单性。

我通过扩展Writer类(在我的例子中是HibernateItemWriter)实现了这一点。我看到一个答案描述了如何使用“拆分器”。如果任何人都有一个在使用spring boot starter父级的环境中如何工作的工作示例,我很乐意看到它。对于我正在做的事情(从单个记录创建列表),如果spring提供了一个处理列表的写入方法,这将非常简单


下面是我如何扩展Writer以处理每一行读取/处理的多个写入:

谢谢michael。我继续寻找答案,并得出了大致相同的解决方案。我的项目处理器当前正在生成单个项目,但我可以修改它以返回项目列表。我计划使用单个Writer并写入多个I将同一类型的TEM放入表中。我会尝试一下,看看是否对我有效。这对我有效。我使用了一个处理器,返回项目列表和一个编写器,如上所述。然而,我使用了一个简单的jdbc模板w/批更新将项目插入数据库。关键部分是“Listjust好奇,使用spring integration t重新启动工作吗?”oo?或者换句话说,spring集成只是一个精简的可插拔模块吗?您完全可以重新运行vs重新启动(这是一个哲学讨论,因为重新运行更干净:)。但如果您想在spring批处理(精简可插拔模块)中使用它虽然在@user977505的情况下,Spring单独与一些SB组件集成(或不集成)会很好的。谢谢你的回复。我会给它一个机会并更新线程。有人这样做了吗?或者有指向这样做的代码的链接吗?我查阅了一些spring集成文档,但除了提到它是可能的之外,找不到太多的内容
@Splitter
注释去了哪里?
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
 }
}