我已经使用参数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试图重新使用引用的作业。
如何配置作业以便每次都创建引用作业的新实例?
答案 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。