在 Spring Batch 步骤中移动 HashMap
Posted
技术标签:
【中文标题】在 Spring Batch 步骤中移动 HashMap【英文标题】:Move HashMap across Spring Batch step 【发布时间】:2015-08-21 13:51:41 【问题描述】:目前我正在编写一个批处理,它从几个源平面文件 DB 中获取数据并将其推送到 NoSQL。我在移动集合数据时面临挑战,特别是 HashMap,如果从数据库中获取并将字段的元数据存储在平面文件中,它是特定用户的元数据类型。在平面文件中,我们有每天生成的数据,我们每 30 分钟扫描一次并将其推送到 NoSQL。我想将数据库中的一个字段合并到我们要推送到 NoSQL 中的实体。 我们正在尝试的当前方法是,在第一步中获取用户列表并将它们写入平面文件。然后使用这个平面文件作为步骤 2 的输入,从数据库中获取数据并生成一个 HashMap,我将其序列化并将其存储到平面文件中。然后稍后在我们将数据推送到 NoSQL 的步骤中,我再次反序列化此 Hashmap 并在该步骤中使用它。我不确定这种方法在重负载下的性能,因为我们必须满足 30 分钟的 SLA。 你们能否建议是否有任何其他方法可以实现这种情况。根据 Docs,我们在 Spring Batch 中的 StepContext 或 JobContext 中拥有如此庞大的数据并不好。 任何建议都非常受欢迎。在此先感谢。如果需要更多信息,请告诉我。
【问题讨论】:
【参考方案1】:Spring Batch 提供了pass data from step to step的方法
将其存储在步骤上下文中:
ExecutionContext stepContext = this.stepExecution.getExecutionContext();
stepContext.put("someKey", someObject);
将其推广到工作环境中:
<!-- add this as a listener in the step above -->
<beans:bean id="promotionListener" class="org.spr....ExecutionContextPromotionListener">
<beans:property name="keys" value="someKey"/>
</beans:bean>
在下一步中检索作业执行:
JobExecution jobExecution = stepExecution.getJobExecution();
ExecutionContext jobContext = jobExecution.getExecutionContext();
this.someObject = jobContext.get("someKey");
【讨论】:
以上是关于在 Spring Batch 步骤中移动 HashMap的主要内容,如果未能解决你的问题,请参考以下文章