【问题标题】:Chunk Processing Spring batch total size unknown块处理 Spring 批量总大小未知
【发布时间】:2015-06-30 23:08:53
【问题描述】:

我正在从包含时间戳的输入源读取数据。我对源的查询基于时间戳的时间范围。

假设时间范围是 1 分钟。我的读者读取 1 分钟范围内的记录并将其传递给处理器。处理器一次只能处理 100 条记录。读者应该继续用 100 条记录的块调用处理器,直到在那一分钟用完所有记录。在应该触发该作家之后,

我应该如何配置 Spring Batch 来实现这一点?

【问题讨论】:

  • 您想一次性编写所有已处理的块吗?那么,N 次读取、N 次进程和 1 次写入?我说的对吗?
  • 我需要 1 个读取器 - N 个处理器 - 1 个写入器。每个处理器的输入都是不同的。

标签: java spring parallel-processing spring-batch


【解决方案1】:

关于 Spring Batch 的内部运作,您的术语并不完全正确。为了通过可选的处理器处理从读取器到写入器的项目,Spring Batch 使用块。 Spring Batch 从您的 ItemReader 读取您的项目,直到读取器返回 NULL(这表明输入流已用尽)。然后,它通过调用 ItemProcessor 来选择性地处理这些项目,最后使用您的 ItemWriter 写入这些项目。

块处理是使用块大小配置的,这意味着读取和处理的项目被写入给定块大小的块中。

考虑到您的问题:

  1. 您应该将阅读器配置为读取项目,直到您配置的时间段结束。然后返回 NULL 表示已读取所有内容。
  2. 您应该将块大小设置为 100,以指示应该每 100 个项目调用一次编写器。

请记住,在阅读器中使用 NULL return 结束输入流会以退出状态 SUCCESS 终止作业。 Spring Batch 将不允许您再次启动此特定 Job 实例,除非您采取特定措施允许这样做。因此,如果实际上有更多的项目需要处理,您应该使用某种 JobParametersIncrementer 或虚拟时间戳参数来配置您的 Job。

另一种可能性(也是我个人的偏好)不是从阅读器返回 NULL 而是抛出一些异常,例如MoreItemsInInputStreamException 或 TimeRangeExceededException。这样,Job 实例会失败,因此 Job 操作员知道还有更多工作要做,他可以通过使用相同的参数重新启动 Job 来完成。

斯蒂夫

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 1970-01-01
    • 1970-01-01
    • 2011-07-15
    相关资源
    最近更新 更多