Spring Batch - 聚合处理器

时间:2014-02-24 17:52:06

标签: spring-batch

我有一个处理流动行的弹簧批处理作业。我正在使用标准的阅读器,处理器和写入器模式。

load_id policy_number   slice_numb  asset_code  surrender_value
923     V317865     V317865 XXH     XXH         46230.340000
923     V318291     V318291 XXA     XXA         40664.230000
923     V318757     V318757 XXA     XXA         73263.360000
923     V318757     V318757 XXF     XXF         36575.820000
923     V318757     V318757 XXI     XXI         8723.330000
923     V318782     V318782 XXI     XXI         9141.550000
923     V318782     V318782 XXF     XXF         28329.550000
923     V318782     V318782 XXA     XXA         76776.220000

对于我处理的每一行,我需要获得具有相同policy_number的行的SUM(surrender_value)。注意policy_number V318757作为三行的示例。我需要报告这一行提供的总投降价值的百分比。

我对如何实现这一点有两个想法,但不确定哪种方法更好

第一个选项 - 将SUM / Grouping逻辑移动到阅读器使用的SQL查询。这意味着我需要的所有信息都可供处理器使用,但我必须映射一些额外的字段。

第二个选项 - 为了聚合行,我要添加一个预处理器,它将维护每个policy_number的总计映射和受影响的行列表。一旦该处理器完成,我将生成的数据结构传递给第二个处理器,该处理器将执行标准工作。我担心的是,当我缓存这么多行的细节时,内存占用量会变得非常大。

任何建议或指导都将不胜感激。

1 个答案:

答案 0 :(得分:4)

我建议在SQL查询中进行这种类型的聚合。除非这个来自的数据模型非常复杂,否则通过SQL添加这种类型的聚合应该是直截了当的,并且可以解决在处理器/写入器中执行此操作的块边界等问题(例如,如果前两个记录对于V318757出现在一个块中,最后一个出现在另一个块中,您可能无法得到正确的数学。您可以使用自定义的CompletionPolicy处理此问题,但这会增加复杂性。)