在 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的主要内容,如果未能解决你的问题,请参考以下文章

在 Spring Batch 应用程序中自定义步骤的参数

Spring Batch 事务管理 - 多线程步骤

Spring Batch 小任务(Tasklet)步骤

Spring Batch - 分块和多线程步骤 - RowMapper 中的 Nullpointer 异常

spring batch(批处理)

Spring Batch 在流程中有两个步骤。为啥第二步永远不会运行,第一步是无限循环