首页 > 解决方案 > 在 Java EE 批处理中的步骤之间传递对象

问题描述

如何在 Java EE 批处理作业(不是 spring-batch 作业!)中将对象参数(不是字符串,而是对象列表)从步骤 1 传递到步骤 2。

我尝试了两种解决方案:

我需要传递非字符串对象。怎么做?

标签: java

解决方案


可能这个问题看起来很相似:

从 JSR 352 中的分区步骤访问 JobContext

在上述解决方案中困扰我的一件事是使用:

step.setPersistentUserData(obj);

这意味着您的对象(obj - 可能是大块数据)可能会写入批处理框架保留其有关作业的内部信息的表中 - 如果你需要它是持久的,那很好,但如果你不这样做,那是一个缺点。

来自 jsr-352文档

setPersistentUserData 方法将持久数据对象存储到当前步骤中。用户数据类型必须实现 java.util.Serializable。此数据保存为步骤检查点的一部分。对于不做检查点的步骤,在步骤结束后保存。它在重新启动时可用。

作为一个更简单但不是“jsr-352 风格”的解决方案(上面帖子中“带有 HashMap 的单例 EJB”的替代方案),我建议创建具有同步访问或 Hashtable 的静态 Map 字段,以保留必要的数据。然而,这个解决方案在很大程度上取决于 U 将使用该 Map 的密集程度。同步意味着其他线程将不得不等待获取对 Map 的访问权限,因此您需要分析线程不会相互阻塞的可能的关键场景。

@Singleton EJB 具有内置同步机制: https ://docs.oracle.com/cd/E19798-01/821-1841/gipsz/index.html

但在这种情况下,我认为没有必要使用 EJB 技术——也许这是一个品味问题。


推荐阅读