1

我已经定义了一个带有参数 restart="false" 的 Spring-Batch 作业,因为我不希望再次启动相同的作业实例。

<batch:job id="myJob" restartable="false">
    <batch:step id="myStep">
        <batch:tasklet>
            ...
        </batch:tasklet>
    </batch:step>
</batch:job>

该作业在另外两个更高级别的作业中被引用:

<batch:job id="hightLevelJob1" restartable="false">
    <batch:step id="myHighLevelJob1Step1" next="...">
        <batch:job ref="myJob"/>
    </batch:step>
    ...
</batch:job>

<batch:job id="hightLevelJob2" restartable="false">
    <batch:step id="myHighLevelJob2Step1" next="...">
        <batch:job ref="myJob"/>
    </batch:step>
    ...
</batch:job>

我现在有两个 JUnit-Tests,每个都启动一个高级作业:

@Autowired
private JobOperator jobOperator;

@Test
public void testHighLevelJob1() throws JobExecutionException {
    final Long executionId = jobOperator.startNextInstance("myHighLevelJob1");
    ...
}

@Test
public void testHighLevelJob2() throws JobExecutionException {
    final Long executionId = jobOperator.startNextInstance("myHighLevelJob2");
    ...
}

第一个测试运行良好,而第二个测试抛出 JobRestartException:

JobInstance already exists and is not restartable

我正在使用 jobOperator.startNextInstance() 所以它创建了一个工作。但是,这似乎只适用于启动的高级作业。看起来 Spring-Batch 试图重用引用的作业。

如何将作业配置为每次都创建引用作业的新实例?

4

1 回答 1

1

您需要一个JobParametersIncrementer才能工作,因为 startNextInstance 的 javadocs 清楚地指出:“在由附加到指定作业的 JobParametersIncrementer 确定的 JobInstance 序列中启动下一个”

JobParametersIncrementer 帮助您增加新参数并将其放入 JobParameters 中,通过这种方式可以启动 Job 的新实例。

修改您的作业定义 bean 并添加一个增量器

<batch:job id="myJob" restartable="false" incrementer="incrementer">
    <batch:step id="myStep">
        <batch:tasklet>
            ...
        </batch:tasklet>
    </batch:step>
</batch:job>

并用一个简单的增量器实现 JobParametersIncrementer 类

<bean id="incrementer"
        class="com...TrivialJobParametersIncrementer" />

您可以在 spring 批处理管理示例中找到示例TrivialJobParametersIncrementer 。

于 2012-07-20T06:30:28.263 回答