【问题标题】:JEE 7 JSR 352 passing data from batchlet to a chunk-stepJEE 7 JSR 352 将数据从批处理传递到块步骤
【发布时间】:2018-03-10 15:13:12
【问题描述】:

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

问题:

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

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

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

谢谢! /丹尼尔

【问题讨论】:

    标签: java-ee-7 jsr352


    【解决方案1】:

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

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

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

    【讨论】:

    • +1 感谢您回答我的问题。另一个后续问题(可能更多的是标准制定者):在 JobContext 中不提供 get/setPersistentUserData 的原因是什么?
    • 我不记得有什么强烈的反对理由,于是提出了这个想法。我认为这并不是将其纳入最终版本的优先事项。另一种技术:您可以在第 2 步中,通过首先从 JobOperator.getStepExecutions(); ... 获取 StepExecution 然后从 StepExecution.getPersistentUserData() 获取第 1 步中的持久用户数据(至少对于顶级线程) .
    • 实际上,我曾见过这样的解决方案 (JobOperator.getStepExecutions(); ...),但它对我来说并不是最佳实践。请您详细说明您的评论“(至少对于顶级线程)”?这个解决方案在所有情况下都是线程安全的(不仅是顶级线程)吗?
    • 我的意思是从 step 上下文中获取的用户数据是线程本地的,所以每个分区都有自己的,就像顶级线程一样,但只有“顶级” StepExecution 和用户数据可通过JobOperator API 访问。 (这也被称为尚未优先考虑的规范增强想法)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 1970-01-01
    • 2017-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多