从 JSR 352 中的分区步骤访问作业上下文

2023-12-20

我正在尝试在批处理之间传递对象,但在尝试从分区步骤(批处理)访问 jobContext 时遇到了问题。

根据 JSR 352 规范

9.4.1.1 批处理上下文生命周期和范围: 批处理上下文具有线程关联性,并且仅对批处理可见 在该特定线程上执行的工件。注入批处理上下文 超出范围时字段可能为空。每个上下文类型都有不同的 范围和生命周期如下: 1. 工作环境 每个作业执行都有一个 JobContext。它的存在是为了一个人的一生 工作。并行的每个子线程都有一个不同的 JobContext 执行(例如分区步骤)。2. 步骤上下文 每一步执行都有一个 StepContext。它的存在是为了生命 步骤。对于分区步骤,有一个 StepContext 父步骤/线程;每个子线程都有一个不同的 StepContext。

我的(失败的)解决方案是使用 JobContext.setTransientUserData,但由于分区步骤使用不同的 JobContext,我无法获取 TransientUserData。

除了我想做的事情之外还有其他选择吗?使用 PartitionMapper 属性是不可能的,因为我需要向每个分区传递一个对象,而不是字符串。

为了清楚起见,我需要这样做:

  1. NormalBatchlet -> 保存要在下一步中使用的对象。

您可以尝试类似的方法,它应该符合当前的规范编程模型。

使用 NormalBatchlet 中的持久步骤数据存储第一步中的对象:

stepCtx.setPersistentUserData(mySerializableData);

通过查找上一步来检索分区中第一步的数据:

Long execId = jobCtx.getExecutionId();

List<StepExecution> stepExecs = jobOperator.getStepExecutions(execID);

MyPersistentUserData myData;

for (StepExecution step : stepExecs) {
    if (step.getStepName().equals("somePreviousStepX") {
        myData = (MyPersistentUserData)step.getPersistentUserData();
    }
}

//use myData
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从 JSR 352 中的分区步骤访问作业上下文 的相关文章

随机推荐