java - 在 Java EE 批处理中的步骤之间传递对象
问题描述
如何在 Java EE 批处理作业(不是 spring-batch 作业!)中将对象参数(不是字符串,而是对象列表)从步骤 1 传递到步骤 2。
我尝试了两种解决方案:
1 - 使用
jobContext
. 一世。e .在第 1 步中:
jobContext.setTransientUserData("dataFromSubscribersManager");
在第 2 步中:
jobContext.getTransientUserData()
2 - 使用
dynamic job parameters
.ieProperties jobParameters = new Properties(); jobParameters.put("objectToPass", "someObjectToPass"); jobOperator.start("someJobName", jobParameters);
但是这里我们只能传递 String 类型的对象。
我需要传递非字符串对象。怎么做?
解决方案
可能这个问题看起来很相似:
在上述解决方案中困扰我的一件事是使用:
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 技术——也许这是一个品味问题。
推荐阅读
- python - matplotlib xkcd() 显示正确的字体,但不显示线条样式
- matplotlib - 你能提取 Matplotlib 对数轴中使用的对数的底吗?
- javascript - document.getElementById().value 没有返回正确的值
- javascript - 无法使用 Fargate 上托管的 NextJS 应用检索 process.env 变量
- node.js - 我怎样才能制作这样的用户界面......我的意思是这些曲线和线条以及反应原生的东西
- ios - 使用 Expo 进行排毒测试 - 无法连接到模拟器
- angular - Angular Reactive表单嵌套FormGroup中的空值
- javascript - 如何将 CSV 或 XLS 内容从 Gmail 中的下一个可用行添加到 Google 表格中?
- php - 如何在 WooCommerce 中 x 分钟或 x 小时后取消待处理的付款订单
- python - 为什么我收到 Kivy KeyError: with my code?