Job の同じインスタンスを再度開始したくないため、パラメーター restart="false" を使用して Spring-Batch Job を定義しました。
<batch:job id="myJob" restartable="false">
<batch:step id="myStep">
<batch:tasklet>
...
</batch:tasklet>
</batch:step>
</batch:job>
ジョブは、他の 2 つのより高レベルなジョブで参照されます。
<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>
これで、それぞれが高レベルのジョブの 1 つを開始する 2 つの 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");
...
}
最初のテストは正常に実行されますが、2 番目のテストでは JobRestartException がスローされます。
JobInstance already exists and is not restartable
jobOperator.startNextInstance() を使用しているため、新しいジョブが作成されます。ただし、これは開始された高レベルのジョブにのみ適用されるようです。Spring-Batch が参照されたジョブを再利用しようとしているようです。
参照されたジョブの新しいインスタンスも毎回作成されるようにジョブを構成するにはどうすればよいですか?