3

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

问题:

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

我知道 jobContext 和 stepContext 都是以线程本地方式实现的。这里让我担心的是“瞬态”部分。如果批处理成功但我的块步骤失败会发生什么?如果重新启动作业/步骤,“TransientUserData”-数据是否仍然可用?对于我的用例,批处理只运行一次很重要。因此,即使重新启动作业或块步骤,保留成功运行批处理的输出数据也很重要 - 否则批处理必须再次保存。(我已经确认了数据并且它已经消失了 - 所以再次运行 batchlet 对我没有帮助。)

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

谢谢!/丹尼尔

4

1 回答 1

2

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

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

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

于 2018-03-11T00:22:31.300 回答