【发布时间】:2014-04-13 21:53:48
【问题描述】:
我正在尝试在批处理之间传递对象,但在尝试从分区步骤(批处理)访问 jobContext 时遇到问题。
根据 JSR 352 规范
9.4.1.1 批处理上下文生命周期和范围: 批处理上下文具有线程亲和性,并且仅对批处理可见 在该特定线程上执行的工件。注入批处理上下文 超出范围时,字段可能为空。每种上下文类型都有不同的 范围和生命周期如下: 1.作业上下文 每个作业执行都有一个 JobContext。它为一个人的一生而存在 工作。 并行的每个子线程都有一个不同的 JobContext 执行(例如分区步骤)。 2. StepContext 每个步骤执行都有一个 StepContext。它终生存在 步骤。对于分区步骤,有一个 StepContext 用于 父步骤/线程;每个子线程都有一个不同的 StepContext。
我的(失败的)解决方案是使用 JobContext.setTransientUserData,但由于分区步骤使用不同的 JobContext,我无法获取 TransientUserData。
除了我正在尝试做的事情之外,还有其他选择吗?使用 PartitionMapper 属性是不可能的,因为我需要向每个分区传递一个对象,而不是一个字符串。
说清楚,我需要这样做:
- NormalBatchlet -> 保存要在下一步中使用的对象。
- PartitionedBatchlet -> 获取上一步中保存的对象。此对象不是简单的字符串,因此使用 PartitionMapper 属性不是解决方案。
更新
我现在使用带有 HashMap 的简单单例 EJB 来存储步骤之间的对象,当作业完成时,我清除此映射以避免资源泄漏。
这是一种解决方法,因为我真的只想使用 javax.batch 包而不依赖于 EJB,所以我不把它作为答案。
【问题讨论】:
-
不知道它在 JSR 中是如何定义的,但是在 Spring Batch 中你可以从
StepContext。StepContext可以注入到 step scoped bean 中,也可以从StepSynchronizationManager访问它。 -
遗憾的是,我在 glassfish 4 中使用 JSR 352,而不是 spring batch
-
在 JBoss 7 / WildFly 中,所有分区都将看到相同的 JobContext 对象,并且每个分区都有一个单独的 StepContext。
标签: java batch-processing glassfish-4