JEE 7 JSR 352 将数据从 batchlet 传递到 chunk-step

JEE 7 JSR 352 passing data from batchlet to a chunk-step

我已经阅读了标准(和 javadoc),但仍有一些问题。 我的用例很简单: Batchlet 从外部源获取数据并确认数据(意味着数据在确认后从外部源中删除)。 在确认数据之前,batchlet 会生成相关输出(内存对象),这些输出将被传递到下一个面向块的步骤。

问题:

1) 在 batchlet 和块步骤之间传递数据的最佳实践是什么? 看来我可以通过调用 jobContext#setTransientUserData 来做到这一点 在 batchlet 中,然后在我的块步骤中,我可以通过调用访问该数据 jobContext#getTransientUserData.

我了解到jobContext 和stepContext 都是以threadlocal 方式实现的。 这里让我担心的是 "Transient" 部分。 如果 batchlet 成功但我的 chunk-step 失败会怎样? 如果 job/step 重新启动,"TransientUserData" 数据是否仍然可用或是否会消失? 对于我的用例,重要的是 batchlet 只 运行 一次。 因此,即使作业或块步骤重新启动,重要的是要保留来自成功-运行-batchlet 的输出数据 - 否则 batchlet 必须再次。 (我已经确认了数据并且它已经消失了 - 所以 运行再次使用 batchlet 对我没有帮助。)

2)跟进问题 在 stepContext 中有几个方法:getPersistentUserData 和 setPersistentUserData。 这些方法的预期用途是什么? "Persistent" 部分指的是什么? 这些方法是否仅与分区相关?

谢谢! / 大牛

临时用户数据只是临时的,在作业重启期间将不可用。作业重新启动可能发生在不同的进程或机器中,因此用户不能指望先前 运行 的作业在重新启动时可用。

步骤持久用户数据是批处理作业开发人员认为 save/persist 出于重启、监视或审计目的所必需的那些应用程序数据。它们将在重新启动时可用,但它们通常仅限于当前步骤(而不是跨步骤)。

通过阅读您的简短描述,我感觉您的 2 个步骤耦合得太紧密,您几乎可以将它们视为一个单独的工作单元。您希望它们要么都成功,要么都失败,以维护您的应用程序状态完整性。我认为这可能是问题的根源。