重新启动不可重新启动的作业的新实例

时间:2012-07-19 10:53:45

标签: java spring spring-batch

我已经使用参数restart =“false”定义了一个Spring-Batch作业,因为我不想再次启动Job的相同实例。

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

在另外两个更高级别的工作中引用了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试图重新使用引用的作业。

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

1 个答案:

答案 0 :(得分: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