【问题标题】:How to read multiple items in ItemReader如何在 ItemReader 中读取多个项目
【发布时间】:2013-05-15 14:02:35
【问题描述】:

以下是我的 Spring Batch 用例。

  1. 从 Web 服务读取输入。 Web 服务将返回所有记录。

  2. 处理记录。

  3. 将处理后的记录一一写入。

我很清楚第 2 步和第 3 步,但无法弄清楚如何实现一个可以一次性读取所有记录的阅读器。如何将记录一一传递给项目处理器/作者? 我应该使用 tasklet 而不是读写器吗?

【问题讨论】:

    标签: spring-batch


    【解决方案1】:

    您的 WebService 将返回什么?我猜是对象的集合!

    您的 ItemReader 需要在此集合上循环并逐个删除项目,然后在它们全部处理完毕后返回 null。

    @Kik 所说的是其余部分由 Spring 批处理根据您的提交间隔处理。例如,如果您的 commit0interval 为 10,您的读者将阅读 10 个项目,将这 10 个项目传递给 ItemProc。然后再次将它们传递给作者。

    希望澄清

    编辑:1) 在 Spring Batch 中,您有多个选项来做您需要的事情。

    Easy Option,创建一个自定义 MyWsItemReader 实现 ItemReader 接口。

    -在这个类中定义一个方法 init(),它将调用你的 webService 并将结果放入 MyWsItemReader 的集合属性中。

    - 从接口实现方法 read()。 (仔细阅读文档中的联系人 - 传递集合的所有元素时必须返回 null)

    -然后,围绕步骤配置一个 stepListener 并实现 beforeStep() 方法来调用 MyWsItemReader 的 init()。您可以在侦听器中自动连接阅读器来完成此操作。

    另外,您的 MyWsItemReader 也可以实现 InitializingBean。那么你必须实现 afterPropertySet() ,你可以在其中调用 ws 并将结果存储在 MyWsItemReader 的私有属性中

    问候

    【讨论】:

    • 感谢您的回答。但我没明白。我对春季批次不太深。我的理解是多次调用读取器并准备对象列表并将其传递给处理器/写入器。所以我的问题...
    • 抱歉,我无法写出完整的评论。感谢你的回答。但我没明白。我对春季批次不太深。我的理解是读取器被多次调用并准备对象列表并将其传递给处理器/写入器。所以我的问题 1.我应该在哪里调用网络服务?即使我在阅读器中成功,如何将该列表传递给编写器和处理器?任何示例都会有很大帮助... 2.我应该使用 tasklet 来调用 web 服务调用吗?如果是,我应该如何将我的物品传递给读者和作者?如果我使用 tasklet,我的工作将包括两个步骤。
    • 查看编辑。首先,必须使用对象集合(从 Jdbc 调用、Xml、flatFile..等映射)来初始化读取器。这是一次性完成的。然后 read() 方法由块配置中的提交间隔定义的块调用。每个块都将被读取,然后由 Spring Batch 自动传递给 ItemProcessor,ItemWriter....您无需为此编写任何代码,这一切都在步骤配置中。
    • 感谢工作。我看到了弹簧批处理阅读器代码。非常感谢您的帮助。
    • 与其在 beforeStep() 或 afterPropertySet() 中调用 init(),不如在 open() 期间实现 ItemStream 并调用 init(),这样更合适,而且它也适当地支持可重启性。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    相关资源
    最近更新 更多