Spring batch Spring批处理ExecutionContextPromotionListener和动态键

Spring batch Spring批处理ExecutionContextPromotionListener和动态键,spring-batch,Spring Batch,我有一个spring批处理作业,它处理的数据与下面类似。我需要为每个键聚合值,然后在最终处理器中使用该值。我无法控制接收数据的顺序 Key - Value A - 1 A - 5 A - 2 B - 2 B - 2 B - 2 C - 1 A - 2 .. .. .. B - 4 X - 10 我已经设置了一个预处理器,它获取每一行,并检查StepExecutionContext中键的现有聚合值。它会创建一个新的或修改现有的。此步骤结束时,必须已聚合所有键值 然后,我的第二个处理器检查不同的

我有一个spring批处理作业,它处理的数据与下面类似。我需要为每个键聚合值,然后在最终处理器中使用该值。我无法控制接收数据的顺序

Key - Value
A - 1
A - 5
A - 2
B - 2
B - 2
B - 2
C - 1
A - 2
..
..
..
B - 4 
X - 10
我已经设置了一个预处理器,它获取每一行,并检查
StepExecutionContext
中键的现有聚合值。它会创建一个新的或修改现有的。此步骤结束时,必须已聚合所有键值

然后,我的第二个处理器检查不同的键名,并尝试从
StepExecutionContext
读取聚合值。当然,聚合值不存在于第二个处理器的
StepExecutionContext


我已经读到,我应该使用
ExecutionContextPromotionListener
将StepExecutionContext从我的第一个处理器提升到
JobExecutionContext
,这将使它们可用于第二个进程。我知道需要升级的键名列表,但在我的情况下,直到第一个处理器结束,我才知道要升级的键列表。有人能提出解决方法吗?

不要将每一条数据单独放入StepExecutionContext中。创建一个映射,将其插入StepExecutionContext,并将数据的键/值放在其中。这样,您就可以将映射的键提升到JobExecutionContext。我知道可以从StepContext提升到JobContext的数据大小是有限的。我的地图可以变得非常大,并且很快达到这个极限,所以我认为最好放很多小的键值。上下文本身没有限制。数据库有一个字符限制,但使用单个键无法绕过该限制(事实上,这可能会使情况变得更糟)。